Format函数新用法 ( 积分: 100 )

  • 主题发起人 主题发起人 52253831
  • 开始时间 开始时间
5

52253831

Unregistered / Unconfirmed
GUEST, unregistred user!
var
i :integer;
xx :array[0..4] of string;
Buffer :array of TVarRec;
begin
xx[0]:='a';
xx[1]:='b';
xx[2]:='c';
xx[3]:='d';
setlength(Buffer,4);
for i :=0 to 3 do Buffer.VAnsiString :=@xx;
showmessage(Format('aa%sb',Buffer)); //这里出错为何
end;
这种做法程序编译能通过,但运行不了。为何呢?
该做法目的是解决在要格式化的字符是未知的情况下,当然后面根的开放式数组个数也是未知的情况下用。
请高手给解答一下。
 
这种用法真的很新,估计你死了这条心吧。

buffer 本身是一个数组,数组的元素又是一个指针,想在不遍历的情况下一次性把数据的所有元素显示出来,好像没什么语言来实现。
 
TVarRec = record { do not pack this record; it is compiler-generated }
没看这个吗?人家直接就告诉你不要用这种类型,这是编译用的
要定义还是用STRING吧
Buffer:array[0..4] of string;

for i :=low(Buffer) to high(Buffer) do
s:= format('%s%s',[s,buffer]);
 
do not pack this record; it is compiler-generated

不推荐不表示不能用,这个不是关键

TVarRec = record { do not pack this record; it is compiler-generated }
上述语句的正确翻译及理解为
TvarRec = Record , 这句告诉你定义变体记录的语法
do not pack this record; 这句告诉你不要PACK此种类型的记录,也就是说不能用
TvarRec = Packed Record
并不是说不能用的意思
 
呵呵,不是很新,不过很少见

建议楼主这么用,不过要注意一点,format第一个参数里的%s要和array里的数量对上,如果按你一开始写的aa%sd,只能显示第一个值
另外ansistring类型是point不知道为什么要这么做,如果你要用是字符串,还是用pchar吧

var
i :integer;
xx :array[0..4] of string;
Buffer :array of TVarRec;
begin
xx[0]:='a';
xx[1]:='b';
xx[2]:='c';
xx[3]:='d';
setlength(Buffer,4);
for i :=0 to 3 do
begin
Buffer.VType:=vtPChar;
new(Buffer.VPChar);
strpcopy(Buffer.VPChar,xx);
self.Caption:=Buffer.VPChar;
end;
showmessage(Format('aa%s%s%s%sb',Buffer)); //ÕâÀï³ö´íΪºÎ
end;
 
啊,改了下,在数组数量未知的情况下,这样显示:

var
i :integer;
xx :array[0..4] of string;
Buffer :array of TVarRec;
fstr:string;
begin
xx[0]:='a';
xx[1]:='b';
xx[2]:='c';
xx[3]:='d';
setlength(Buffer,4);
for i :=0 to 3 do
begin
Buffer.VType:=vtPChar;
new(Buffer.VPChar);
strpcopy(Buffer.VPChar,xx);
self.Caption:=Buffer.VPChar;
end;
fstr:='aa';
for i:=0 to length(buffer)-1 do
fstr:=fstr+'%s';
fstr:=fstr+'d';
showmessage(Format(fstr,Buffer)); //ÕâÀï³ö´íΪºÎ
end;
 
对头啊,把数组转为TVarRec是关键,没想到用PCHAR。
还有那NEW,对了用完了应该要FREE的吧。
谢谢大家支持。
 
多人接受答案了。
 
new完了要dispose
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
913
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部