关于SetLength的问题,我从学DELPHI的时候就一直没有明白过。(100分)

L

liguang

Unregistered / Unconfirmed
GUEST, unregistred user!
以上代码,
procedure TForm1.Button1Click(Sender: TObject);
var
str: String;
begin
SetLength(str, 50);
GetTempPath(50, PChar(str));
showMessage(str + 'light')
end;
showMessage后无法显示正确的值,为什么,另外在使用SetLength来设置一个string的长度的时候有没有什么需要注意的问题。望高手问答。
 
var
str: String;
begin
SetLength(str, 50);
GetTempPath(50, PChar(str));
showMessage(trim(str)+ 'light')
////
 
procedure TForm1.Button1Click(Sender: TObject);
var
str: String;
begin
SetLength(str, 50);
GetTempPath(50, PChar(str));
showMessage(Trim(str)+'Light' );
end;

改成上面的形式就正常了,因为SetLength将String长度限定死了,而GetTempPath会将缓冲区
填满,所以你得到的Str是带空格的,需要Trim一下
 
是不是ShowMessage显示的字符有限??
发现 SetLength(str, 16);可以刚好显示
C:/windows/temp/light

真奇怪~
 
SetLength给动态数组设定大小,开始可以设定的大一些,用一个变量记录其真实大小,最后
用copy函数可以重新设置其大小(削减)。
 
showMessage后无法显示正确的值,因为
GetTempPath(50, PChar(str));
后str后灌进了字符串终止符号,所以即使+ 'light'你也看不到。
你可以检验一下:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
str: String;
B : Boolean;
I : integer;
begin
B:= False;
SetLength(str, 50);
GetTempPath(50, PChar(str));
showMessage(str + 'light');

for I := Length(Trim(str)) - 2 to 50 do
begin
if B then
str := '_';
if str = '/' then
B := True;
end;
showMessage(str + 'light')
end;

 
setlength就是给一个变量设其长度啊
 
顺便问问:
ArrayStr:Array [1..10] of String;
S:pchar;
对数组附值以后进行如下操作
begin
S:=Pchar(concat(ArrayStr[1],ArrayStr[2],ArrayStr[3]));
showmessage(s);
end;
S的值是乱码。估计出现了指针错误,正确的方法应该是什么呢
 

设置了str的长度为50,"+"操作符在字符串运算中是追加到另一字符串结尾。
GetTempPath方法执行后,由于原str后有#0(字符串结束符),所以你看不到light
 
1、GetTempPath返回字符串长度:
procedure TForm1.Button1Click(Sender: TObject);
var
str: String;
len:Integer;
begin
SetLength(str, 50);
len:=GetTempPath(50, PChar(str));
showMessage(Copy(str,1,len)+'Light' );
end;
SetLength给str分配长度空间,但不清空,要用GetTempPath的返回值来取正确的部分。

2、PChar要转换为string;

begin
S:=Pchar(concat(ArrayStr[1],ArrayStr[2],ArrayStr[3]));
showmessage(string(s));
end;

 
procedure TForm1.Button1Click(Sender: TObject);
var
str,tmp: String;
begin
SetLength(str, 50);
GetTempPath(50, PChar(str));
tmp:=Trim(str)+'Light'
showMessage(tmp);
end;
d5 中showmessage()不能‘...'+'....'
 
这样做既安全效率也高
procedure TForm1.Button1Click(Sender: TObject);
var
str: String;
X: Integer;
begin
SetLength(str, 50);
GetTempPath(50, @str[1]);
X:= Pos(#0, str);
Move('light'#0, str[X], 6);
showMessage(str)
end;
 
顺便问问:
ArrayStr:Array [1..10] of String;
S:pchar;
对数组附值以后进行如下操作
begin
S:=Pchar(concat(ArrayStr[1],ArrayStr[2],ArrayStr[3]));
showmessage(s);
end;
S的值是乱码。估计出现了指针错误,正确的方法应该是什么呢

按楼上说的方法:S:=Pchar(concat(ArrayStr[1],ArrayStr[2],ArrayStr[3]));
showmessage(String(s));
无法正常显示

 
试一试这样:
var
str: string;
begin
str := ArrayStr[1] + ArrayStr[2] + ArrayStr[3];
S := PChar(str);
ShowMessage(S);
end;
 
顺便说一句,最好不要用[red]字符串数组[/red],而要用[blue]TStringList[/blue],这个东东很好用
 
procedure TForm1.Button1Click(Sender: TObject);
var
str: String;
iCopyLen: integer ;
begin
SetLength(str, 50);
iCopyLen :=GetTempPath(50, PChar(str));//返回Copy的长度
showMessage(LeftStr(str,iCopyLen) + 'light')
end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
919
DelphiTeacher的专栏
D
I
回复
0
查看
457
import
I
顶部