0

到了 Delphi 10.3 更新 1. 在表单上,​​我有一个 ADOQuery,它有一个名为 ExtraText 的字段,这个字段是 TWideStringField 。

在我的程序中,我这样分配它:

 PrintPosQueryRack.Value:=PrintPosQueryExtraText.Value;

如果我将光标悬停在 PrintPosQueryRack.Value 我得到 System.WideString 如果我将光标悬停在 PrintPosQueryExtraText.Value 我得到 System.String

我真的——真的不明白为什么。PrintPosQueryRack 是一个计算字段,我创建为纯字符串。因为据我所知,在以后的 Delphi 版本中,字符串是 Delphi 中的 Unicode (UnicodeString)。

我这里还有一个变量 strRack : string 。如果我将它分配给 PrintPosQueryRack.Value (即 System.WideString ),我会得到相同的警告。

我可以通过将 strRack : 字符串更改为 strRack : AnsiString 并将 PrintPosQueryExtraText.Value 更改为 PrintPosQueryExtraText.AnsiString 来“解决”这个问题。

但我有点迷失在这里。

谢谢你 。

4

1 回答 1

4

TL;DR:使用 WideString 作为计算字段的类型。StringFields 内部基于 AnsiString。

如果你创建一个字符串类型的字段,(ftString),你会得到一个 TStringField。它的值仍然是“旧”的 AnsiString。这可能是出于兼容性原因。

也就是说,它依赖于NEXTGEN定义,这基本上意味着对于经典桌面应用程序 TStringField.Value 仍然是 AnsiString,而对于用 Delphi 编写的 iOS 和 Android 应用程序,它确实是一个(unicode)字符串。

但这仅适用于Value财产。您还可以使用显式 AsString、AsWideString 或 AsAnsiString 属性。这些属性可用于任何字段类型,但您提供或获取的值将转换为字段的内部类型或从该字段的内部类型转换。对于 TStringFields,无论您如何设置值,该类型仍然是 AnsiString。

对于 unicode 值,使用WideStringorWideMemo字段。

于 2019-03-08T08:28:45.007 回答