Неявное приведение строки с потенциальной потерей данных из строки в AnsiString / ADOQuery - PullRequest
0 голосов
/ 08 марта 2019

получил здесь Delphi 10.3 Update 1. В форме у меня есть ADOQuery с полем с именем ExtraText, это поле TWideStringField.

В моей Программе я назначаю это так:

 PrintPosQueryRack.Value:=PrintPosQueryExtraText.Value;

если навести курсор на PrintPosQueryRack.Value, я получаю System.WideString если я наведу курсор на PrintPosQueryExtraText.Value, я получу System.String

Я действительно ... действительно не понимаю, почему. PrintPosQueryRack - это вычисляемое поле, которое я создал в виде простой строки. Потому что, насколько я знаю, в более поздних версиях Delphi строка в Unphode (UnicodeString) в Delphi.

У меня также есть переменная здесь strRack: string. Если я назначу его для PrintPosQueryRack.Value (который является System.WideString), я получу тот же Warrning.

Я могу «исправить» это, изменив strRack: string на strRack: AnsiString и изменив PrintPosQueryExtraText.Value на PrintPosQueryExtraText.AnsiString.

Но я вроде как потерян.

Спасибо.

1 Ответ

4 голосов
/ 08 марта 2019

TL; DR: Используйте WideString в качестве типа для вычисляемого поля.Внутренние поля StringFields основаны на AnsiString.

Если вы создадите поле типа String (ftString), вы получите TStringField.Его значением по-прежнему является «старая» AnsiString.Это, вероятно, по причинам совместимости.

То есть, это зависит от определения NEXTGEN , что в основном означает, что для классических настольных приложений TStringField.Value по-прежнему является AnsiString, а для приложений iOS и Android, написанных на Delphi, -действительно (Unicode) String.

Но это только для свойства Value.Вы также можете использовать явные свойства AsString, AsWideString или AsAnsiString.Эти свойства доступны для любого типа поля, но значение, которое вы даете или получаете, переводится во внутренний тип поля и из него.Для TStringFields этот тип по-прежнему является AnsiString, независимо от того, как вы устанавливаете значение.

Для значений в Unicode используйте WideString или WideMemo поля.

...