Delphi : 如何将 Format() 与运行时构建的 TVarRec 数组一起使用?
Delphi : How to use Format() with runtime-built array of TVarRec?
我正在为存储库构建 SQL 查询生成器。此构建器将查找查询的所有必填字段并创建 SQL 文本。为此,我正在使用 Format() 过程。但是,我无法在 运行 时间内创建必须传递给 Format 过程的 TVarRec 数组。
使用 Format('%s, %s', ['AString', 'AnotherString']); 等常量很容易构建这个数组。但是我们必须如何才能在 运行 时间内创建它?
这是我的方法的简化版本:
procedure BuildString;
begin
FStrings := TStringList.Create;
FStrings.Add('String 1');
FStrings.Add('String 2');
FStrings.Add('String 3');
FFormatString := '%0:s, %1:s, %2:s';
SetLength(FFormatStringParams, FStrings.Count);
for I := 0 to FStrings.Count - 1 do
begin
aString := FStrings.Strings[I];
FFormatStringParams[I].VString := Addr(aString);
end;
ShowMessage(Format(FFormatString, FFormatStringParams));
end;
但是当我 运行 这样做时,我收到错误消息“格式 '%0:s, %1:s, %2:s' 无效或与参数不兼容'
我知道我错误地构建了必须传递给 Format 过程的 TVarRec 数组。谁能帮我解决这个问题?
谢谢。
您传递的是字符串变量的地址而不是它的值。此外,您正在分配 VString
字段,该字段需要 ShortString
。您提供的是本机 String
。
替换
VString := Addr(aString)
和
VUnicodeString := Pointer(aString)
此外,您需要通过分配VType
字段来指定字符串类型。
for I := 0 to FStrings.Count - 1 do
begin
aString := FStrings.Strings[I];
FFormatStringParams[I].VType := vtUnicodeString;
FFormatStringParams[I].VUnicodeString := Pointer(aString);
end;
我正在为存储库构建 SQL 查询生成器。此构建器将查找查询的所有必填字段并创建 SQL 文本。为此,我正在使用 Format() 过程。但是,我无法在 运行 时间内创建必须传递给 Format 过程的 TVarRec 数组。
使用 Format('%s, %s', ['AString', 'AnotherString']); 等常量很容易构建这个数组。但是我们必须如何才能在 运行 时间内创建它?
这是我的方法的简化版本:
procedure BuildString;
begin
FStrings := TStringList.Create;
FStrings.Add('String 1');
FStrings.Add('String 2');
FStrings.Add('String 3');
FFormatString := '%0:s, %1:s, %2:s';
SetLength(FFormatStringParams, FStrings.Count);
for I := 0 to FStrings.Count - 1 do
begin
aString := FStrings.Strings[I];
FFormatStringParams[I].VString := Addr(aString);
end;
ShowMessage(Format(FFormatString, FFormatStringParams));
end;
但是当我 运行 这样做时,我收到错误消息“格式 '%0:s, %1:s, %2:s' 无效或与参数不兼容'
我知道我错误地构建了必须传递给 Format 过程的 TVarRec 数组。谁能帮我解决这个问题?
谢谢。
您传递的是字符串变量的地址而不是它的值。此外,您正在分配 VString
字段,该字段需要 ShortString
。您提供的是本机 String
。
替换
VString := Addr(aString)
和
VUnicodeString := Pointer(aString)
此外,您需要通过分配VType
字段来指定字符串类型。
for I := 0 to FStrings.Count - 1 do
begin
aString := FStrings.Strings[I];
FFormatStringParams[I].VType := vtUnicodeString;
FFormatStringParams[I].VUnicodeString := Pointer(aString);
end;