隐式字符串强制转换,可能导致数据从“字符串”丢失到“ AnsiString” / ADOQuery

时间:2019-03-08 06:52:44

标签: string delphi ansistring

在这里获得了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。

但是我有点迷失在这里。

谢谢。

1 个答案:

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