Delphi:如何将 Format() 与运行时构建的 TVarRec 数组一起使用?

Lud*_*c C 2 delphi pointers string-formatting

我正在为存储库构建 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;
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,我收到错误“格式 '%0:s, %1:s, %2:s' 无效或与参数不兼容”

我知道我错误地构建了必须传递给 Format 过程的 TVarRec 数组。任何人都可以帮助我吗?

谢谢你。

Dav*_*nan 5

您正在传递字符串变量的地址而不是它的值。此外,您正在分配VString字段,该字段需要ShortString. 您正在提供一个本地人String

代替

VString := Addr(aString)
Run Code Online (Sandbox Code Playgroud)

VUnicodeString := Pointer(aString)
Run Code Online (Sandbox Code Playgroud)

此外,您需要通过分配VType字段来指定字符串类型。

for I := 0 to FStrings.Count - 1 do
begin
  aString := FStrings.Strings[I];
  FFormatStringParams[I].VType := vtUnicodeString;
  FFormatStringParams[I].VUnicodeString := Pointer(aString);
end;
Run Code Online (Sandbox Code Playgroud)