Delphi, как избежать предупреждения Unicode в D2009, D2010 - PullRequest
2 голосов
/ 13 февраля 2010

В процедуре сортировки в Delphi 2007 я использую такой код:

(txt[n] in ['0'..'9'])

function ExtractNr(n: Integer; var txt: String): Int64;  
begin  
  while (n <= Length(txt)) and (txt[n] in ['0'..'9']) do n:= n + 1;  
  Result:= StrToInt64Def(Copy(txt, 1, (n - 1)), 0);  
  Delete(txt, 1, (n - 1));  
end;  

где txt - строка. Это отлично работает в D2007, но выдает предупреждения в D2009 и D2010. Я понятия не имею, почему, но есть ли способ заставить его работать без предупреждения в D2009 и D2010?

Рой М Клевер

Ответы [ 2 ]

9 голосов
/ 13 февраля 2010

Получаете ли вы "WideChar, уменьшенный до байта Char в выражениях набора. Рассмотрите возможность использования функции 'CharInSet' в сообщении 'SysUtils' unit"?

Вот проблема. В D2009 тип строки по умолчанию был изменен с AnsiString на UnicodeString. AnsiString использует один байт для каждого символа, давая вам 256 возможных символов. UnicodeString использует 2 байта на символ, давая до 64K символов. Но набор Паскаля может содержать до 256 элементов. Так что он не может создать «набор WideChar», потому что слишком много возможных элементов.

Предупреждение - это предупреждение о том, что вы пытаетесь сравнить txt [n], который является WideChar из строки Unicode, с набором символов. Он не может создать набор WideChars, поэтому ему пришлось сократить их до AnsiChars, чтобы поместить их в набор Pascal, и ваш txt [n] может быть полностью вне границ Ansi.

Вы можете исправить это, используя CharInSet или сделав txt AnsiString, если вы уверены, что вам не понадобятся символы Юникода для него. Или, если это не сработает, вы можете отключить предупреждение, но я бы посчитал это последним средством.

9 голосов
/ 13 февраля 2010

использовать CharInSet или лучше использовать Character.IsDigit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...