这个参数是集合类型的吗?为什么加了[]中括号?(10分)

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
var
TI:PTypeInfo;
TD:PTypeData;
EnumName:string;
begin
TI:=AClass.ClassInfo;
TD:=GetTypeData(TI);
with AStrings do
begin
Add(Format('Class Name: %s',[TI.Name]));
EnumName:=GetEnumName(TypeInfo(TTypeKind),Integer(TI.Kind));
Add(Format('Kind: %s',[EnumName]));
Add(Format('Size: %d',[AClass.InstanceSize]));
Add(Format('Defined in: %s.pas',[TD.UnitName]));
Add(Format('Num Propertieds: %d',[TD.PropCount]));
end;
end;
在这几个Add语句中为什么这些参数都要加中括号?不是集合类型才加吗?
 
不是集合,是常量数组。
Format(const Format: string
const Args: array of const)
 
到help中找一下PTypeInfo and PTypeData的定义
 
Delphi example:
Format('%8.2f', [123.456]);
 
是常量或集合类型的数据就要加中括号[]吗?
 
抄来的例子:
-----------------------------------------------

寄件者:Steve Zimmelman (skz@no.spam.psimed.com)
主旨:Re: Array Of Const

View this article only
新闻群组:borland.public.delphi.objectpascal
日期:1999/10/03


A TVarRec must be used with Array Of Const.

Procedure TForm1.DoIt(X: Array Of Const);
Var
i: Integer;
J: TVarRec;
Begin
for I := Low(X) to High(X) do begin
J := X;
case j.VType of
vtInteger: ShowMessage(IntToStr(j.VInteger)) ;
vtBoolean: ;
vtChar : ;
vtExtended: ;
vtString : ;
vtPointer : ;
vtPChar : ;
vtObject : ;
vtClass : ;
vtWideChar: ;
vtPWideChar: ;
vtAnsiString: ShowMessage(String(j.VAnsiString));
vtCurrency: ;
vtVariant: ;
vtInterface: ;
vtWideString : ;
vtInt64: ;
end;
end;
end;

DoIt([1,'This Is A String',3,4,5]);

 
这个东东正确的名称是“开放数组”,用于传递参数。它的好处是你可以任意指定多少个数组成员。
举例如下:
定义与实现部分
function GetMaxText(TextList: Array of string): string;
var
i: Integer;
begin
Result := '';
for i := Low(TextList) to High(TextList) do
begin
if TextList > Result then
Result := TextList;
end;
end;

使用部分:
MaxText := GetMaxText(['a', 'b']);

MaxText := GetMaxText(['a', 'b', 'c', 'd'])
// 参数可以任意多

另:Format函数中的定义有些特殊,它的开放数组成员可以是不同类型的,它的定义方式是
function Format(FormatMask: string
Args: Array of const): string;

至于这种不同类型元素数组的实现则比较复杂,具体用法可以参看《Delphi5开发人员指南》。
 
to Traveller:你看一下我上面的例子就知道怎么实现了。
 
我本来就清楚怎么实现,但是详细讲解要花很大篇幅,所以不打算在这里讲。
 
哦,有点清楚了!谢谢各位!
 
后退
顶部