Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:如何将Format()与TVarRec的运行时构建的数组一起使用?_Delphi_Pointers_String Formatting - Fatal编程技术网

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

Delphi:如何将Format()与TVarRec的运行时构建的数组一起使用?,delphi,pointers,string-formatting,Delphi,Pointers,String Formatting,我正在为存储库构建SQL查询生成器。此生成器将查找查询所需的所有字段并创建SQL文本。为此,我使用Format()过程。但是,我在运行时创建TVarRec数组时遇到了问题,我必须将其传递给格式化过程 使用诸如格式('%s,%s',['AString','AnotherString']);`。但我们必须如何在运行时创建它呢 以下是我的方法的简化版本: procedure BuildString; begin FStrings := TStringList.Create; FSt

我正在为存储库构建SQL查询生成器。此生成器将查找查询所需的所有字段并创建SQL文本。为此,我使用Format()过程。但是,我在运行时创建TVarRec数组时遇到了问题,我必须将其传递给格式化过程

使用诸如格式('%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”无效或与参数不兼容”

我知道我错误地构建了必须传递到格式化过程的TVarRec数组。有人能帮我吗


谢谢。

您传递的是字符串变量的地址,而不是它的值。此外,您分配的是
VString
字段,该字段需要
短字符串
。您提供的是本机
字符串

替换

VString := Addr(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;

非常感谢。成功了!FWIW,@Ludo,如果你真的想操纵
TVarRec
s,请阅读我的文章。它还显示了帮助你实现这一点的代码。
for I := 0 to FStrings.Count - 1 do
begin
  aString := FStrings.Strings[I];
  FFormatStringParams[I].VType := vtUnicodeString;
  FFormatStringParams[I].VUnicodeString := Pointer(aString);
end;