从 'string' 到 'AnsiString' / ADOQuery 的潜在数据丢失的隐式字符串转换

Implicit string cast with potential data loss from 'string' to 'AnsiString' / ADOQuery

到达这里 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 ),我会得到相同的警告 .

我可以 "fix" 通过将 strRack : string 更改为 strRack : AnsiString 并通过将 PrintPosQueryExtraText.Value 更改为 PrintPosQueryExtraText.AnsiString .

但我有点迷路了。

谢谢。

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

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

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

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

对于 unicode 值,使用 WideStringWideMemo 字段。