gpt4 book ai didi

德尔福 : How to use Format() with runtime-built array of TVarRec?

转载 作者:行者123 更新时间:2023-12-03 18:26:16 25 4
gpt4 key购买 nike

我正在为存储库构建 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;

关于德尔福 : How to use Format() with runtime-built array of TVarRec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33857163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com