从 '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 值,使用 WideString
或 WideMemo
字段。
到达这里 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。这可能是出于兼容性原因。
也就是说,它取决于
但这仅适用于 Value
属性。您还可以使用显式 AsString、AsWideString 或 AsAnsiString 属性。这些属性可用于任何字段类型,但您提供或获取的值会与字段的内部类型相互转换。对于 TStringFields,无论您如何设置值,该类型仍然是 AnsiString。
对于 unicode 值,使用 WideString
或 WideMemo
字段。