- {A common error when working with PChars is to store a local variable in a data structure, or return it as a value. When your routine ends, the PChar disappears because it is a pointer to memory, and not a reference counted copy of the string. For example:}
- function title(n: Integer): PChar;
- var
- s: string;
- begin
- s := Format('title - %d', [n]);
- Result := PChar(s); // DON'T DO THIS
- end;
- {This example returns a pointer to string data that is freed when the title function returns.}
- procedure TForm1.MyDataAfterDelete(DataSet: TDataSet);
- begin
- StatusBar1.SimpleText := Format('There are now %d records in the table', [DataSet.RecordCount]);
- end;
format 函数的原型是 function Format(const Format: string; const Args: array of const): string; overload;
第二个参数的类型是array of const,不知道是什么类型,搜了下:
变体开放数组参数
变体开发数组参数允许向单个过程或函数传递不同类型表达式的数组。要定义含有变体开放数组参数的例程,需要指定array of const作为参数类型。如,
procedure DoSomething(A: array of const);
这里声明了一个叫做DoSomething的过程,该过程可以操作不同种类的数组。
array of const结构等价于array of TVarRec。TVarRec,在单元System中声明,用于表示一个记录,记录中有一个可以保存多种值(整数、布尔、字符、实数、串、指针、类、类引用、接口、变体等)的变体部分。TVarRec中的VType字段表示数组中每个元素的类型。一些类型作为指针传递而不传递值;特别是长串,作为指针传递并且必需转换为string类型。
下面的例子在函数中使用了变体开放数组参数,该函数对接受的每个元素创建一个串表示法,最后连接成一个串。该函数中调用的串处理例程都定义在SysUtils单元中。
function MakeStr(const Args: array of const): string;
const
BoolChars: array[Boolean] of Char = ('F', 'T');
var
I: Integer;
begin
Result := '';
for I := 0 to High(Args) do
with Args[I] do
case VType of
vtInteger: Result := Result + IntToStr(VInteger);
vtBoolean: Result := Result + BoolChars[VBoolean];
vtChar: Result := Result + VChar;
vtExtended: Result := Result + FloatToStr(VExtended^);
vtString: Result := Result + VString^;
vtPChar: Result := Result + VPChar;
vtObject: Result := Result + VObject.ClassName;
vtClass: Result := Result + VClass.ClassName;
vtAnsiString: Result := Result + string(VAnsiString);
vtCurrency: Result := Result + CurrToStr(VCurrency^);
vtVariant: Result := Result + string(VVariant^);
vtInt64: Result := Result + IntToStr(VInt64^);
end;
end;
可以用一个开放数组构造器(见开放数组构造器)来调用该函数。例如:
MakeStr(['test', 100, ' ', True, 3.14159, TForm])
上面的调用将返回串 “test100 T3.14159TForm"。
也就是说[]符号就可以将任何可以format类型的变量括起来直接在format中使用了。