为什么无法trim掉空格?(100分)

  • 主题发起人 volcanosh
  • 开始时间
V

volcanosh

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么无法trim掉空格?
for i:=0 to listbox1.Count-1 do
if listbox1.Selected then s:=listbox1.Items;
site:=pos('程序位置',s)-1;
substr:=copy(s,0,site);
substr:=trim(substr);
showmessage('*' + substr + '*');

listbox1的内容如下:
Synchronization Manager 程序位置 mobsync.exe
Nav Agent 程序位置 D;/PROGRA~1/nav.exe
 
Trim只能去除两边的空格,下面代码加上你的Listbox内容测试没问题呀。
procedure TForm1.Button1Click(Sender: TObject);
var
site, i: Integer;
s, substr: String;
begin
for i := 0 to listbox1.Items.Count - 1 do
begin
if listbox1.Selected then
begin
s := listbox1.Items;
site := pos('程序位置', s) - 1;
substr := copy(s, 0, site);
substr := trim(substr);
showmessage('*' + substr + '*');
end;
end;
end;
 
是不是你的LISTBOX中的不是空格而是TAB。
 
或者双字节的空格?
 
同意MichaelZhu的意见,另外你的Copy为什么是从0开始而不是从1开始呢? 字符串都是从1开始的
 
多半是全角的空格

试一试这个:
if substr[1]<>' ' then Showmessage("不是半角的空格");
 
这一行有问题:substr:=copy(s,0,site);
将 0 改成 1。
 
不可能去不掉,copy(s,1,site)
自己debug以下,看看s,substr的值,看看你那里错了
 
function Copy(S; Index, Count: Integer): string;
Description
S is an expression of a string or dynamic-array type. Index and Count are
integer-type expressions. Copy returns a substring or sub array containing
Count characters or elements starting at S[Index].

If Index is larger than the length of S, Copy returns an empty string or array.

If Count specifies more characters or array elements than are available,
only the characters or elements from S[Index] to the end of S are returned.

 
修正后还是不行,可能前面这段有错,大家看看。
procedure TfrmFixie.btnWinClick(Sender: TObject);
//windows启动
var
i:integer;
val:tstringlist;
reg:tregistry;
maxwidth:integer;
len:integer;
begin
listbox1.Clear;
reg:=tregistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
val:=tstringlist.Create;
len:=0;

if reg.OpenKey('Software/Microsoft/Windows/CurrentVersion/Run',false) then
begin
reg.GetValueNames(val);
for i:=0 to val.Count-1 do
if length(val.Strings)>len then len:=length(val.strings);
for i:=0 to val.Count-1 do
listbox1.AddItem(val.Strings
+ stringofchar(' ',len-length(val.Strings))
+ ' 程序位置'
+ stringofchar(' ',1)
+ reg.ReadString(val.Strings),self);

end;
reg.CloseKey;
reg.Free;
regname:='win';

procedure TfrmFixie.btnDelClick(Sender: TObject);
var
i:integer;
reg:tregistry;
s,substr:string;
site:integer;
begin
reg:=tregistry.Create;
if regname='win' then
begin
for i:=0 to listbox1.Count-1 do
begin
if listbox1.Selected then
begin
s:=listbox1.Items;
site:=pos('程序位置',s)-1;
showmessage(inttostr(site));
substr:=trim(copy(s,0,site));
showmessage('*' + substr + '*');
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey('Software/Microsoft/Windows/CurrentVersion/Run',false);
reg.DeleteValue(substr);
reg.CloseKey;
reg.Free;
end;
end;
end;
{if regname='ietool' then

if regname='ieright' then}


listbox1.DeleteSelected;
 
原因不幸被大家给严重了,你的里面含有全角字符!
listbox1.AddItem(val.Strings
+ stringofchar(' ',len-length(val.Strings))
+ ' 程序位置' //这行,“程序位置”前面含有的是全角字符!
+ stringofchar(' ',1)
+ reg.ReadString(val.Strings),self);

 
TO yzhshi:
不好意思,不知道有stringofchar这个函数,delphi的HELP里找不到,
windows SDK 也找不到,是你看system.pas自己发现的吧?
 
呵呵,可以的呀,这个不是API,是Delphi提供的函数,用来用n各相同的字符产生一个字符串的
其实不是我写的,我只是照抄楼主的代码,呵呵。
记得DBase中也有类似的函数,呵呵,n年以前的事情了……
 
非常感谢!
 
多人接受答案了。
 
顶部