delphi 隐式字符串转换,从“string”到“AnsiString”可能会丢失数据/ ADOQuery

ncecgwcz  于 2023-04-11  发布在  其他
关注(0)|答案(2)|浏览(271)

在这里 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。
但我在这里有点迷路了。
谢谢大家。

70gysomp

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值,请使用WideStringWideMemo字段。

sqxo8psd

sqxo8psd2#

要解决此问题,请使用ShortString函数:

PrintPosQueryRack.Value := ShortString(PrintPosQueryExtraText.Value);

相关问题