在这里获得了Delphi 10.3 Update 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:string更改为strRack:AnsiString来“修复”此问题 并通过将PrintPosQueryExtraText.Value更改为PrintPosQueryExtraText.AnsiString。
但是我有点迷失在这里。
谢谢。
答案 0 :(得分:4)
TL; DR:使用WideString作为计算字段的类型。 StringFields在内部基于AnsiString。
如果创建的字符串类型为(ftString),则将得到一个TStringField。它的值仍然是“旧的” AnsiString。这可能是出于兼容性原因。
也就是说,它取决于NEXTGEN的定义,这基本上意味着对于经典桌面应用程序TStringField.Value仍然是AnsiString,而对于用Delphi编写的iOS和Android应用程序,它的确是一个(unicode)串。
但这仅适用于Value
属性。您也可以使用显式的AsString,AsWideString或AsAnsiString属性。这些属性可用于任何字段类型,但是您提供或获取的值将与字段的内部类型相互转换。对于TStringFields,无论您如何设置该值,该类型仍为AnsiString。
对于unicode值,请使用WideString
或WideMemo
字段。