在这里 Delphi 10.3更新1.在窗体上我有一个ADOQuery,它有一个名为ExtraText的字段,这个字段是TWideStringField。
在我的程序中,我这样分配它:
PrintPosQueryRack.Value:=PrintPosQueryExtraText.Value;
如果我将光标悬停在PrintPosQueryRack.Value上,我将得到System.WideString如果我将光标悬停在PrintPosQueryExtraText.Value上,我将得到System.String
我真的-真的不明白为什么。PrintPosQueryRack是一个计算字段,我创建为普通字符串。因为据我所知,在后来的 Delphi 版本中,字符串是Unicode(UnicodeString)。
我在这里也有一个变量strRack:如果我把它赋给PrintPosQueryRack.Value(即System.WideString),我会得到相同的Warrning。
我可以通过改变strRack来“修复”这个问题:string到strRack:AnsiString,并将PrintPosQueryExtraText.Value更改为PrintPosQueryExtraText.AnsiString。
但我在这里有点迷路了。
谢谢大家。
2条答案
按热度按时间70gysomp1#
**TL;DR:**计算字段的类型使用WideString,StringFields内部基于AnsiString。
如果你创建一个String类型的字段,(ftString),你会得到一个TStringField。它的值仍然是“旧的”AnsiString。这可能是出于兼容性的原因。
也就是说,它依赖于NEXTGEN定义,这基本上意味着经典桌面应用程序的TStringField。Value仍然是AnsiString,而对于用 Delphi 编写的iOS和Android应用程序,它确实是(unicode)String。
但这仅适用于
Value
属性。您还可以使用显式AsString,AsWideString或AsAnsiString属性。这些属性可用于任何字段类型,但您给予或获取的值将转换为字段的内部类型。对于TStringFields,该类型仍然是AnsiString,无论您如何设置值。对于unicode值,请使用
WideString
或WideMemo
字段。sqxo8psd2#
要解决此问题,请使用ShortString函数: