Delphi,如何在D2009,D2010中避免unicode警告消息

Roy*_*ver 2 delphi unicode warnings

在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;  
Run Code Online (Sandbox Code Playgroud)

其中txt是一个字符串.这在D2007中工作正常,但会在D2009和D2010中发出警告我不知道为什么但是有什么方法可以让它在D2009和D2010中没有警告的情况下工作吗?

Roy M Klever

Fra*_*ois 9

使用CharInSet或更好地使用Character.IsDigit


Mas*_*ler 9

你是否在设置表达式中将"WideChar缩减为字节字符.考虑在'SysUtils'单元中使用'CharInSet'函数"消息?

这是问题所在.在D2009中,默认字符串类型已从AnsiString更改为UnicodeString.AnsiString为每个字符使用一个字节,为您提供256个可能的字符.UnicodeString每个字符使用2个字节,最多可提供64K个字符.但Pascal集最多只能包含256个元素.所以它不能创建一组"WideChar",因为有太多可能的元素.

警告是一个警告,您试图将txt [n](一个来自Unicode字符串的WideChar)与一组字符进行比较.它不能创建一组WideChars,所以它必须将它们减少到AnsiChars以使它们适合Pascal集,并且你的txt [n]可能完全在Ansi边界之外.

您可以使用CharInSet或将txt设为AnsiString来修复它,如果您确定不需要任何Unicode字符.或者,如果这不会很好,你可以禁用警告,但我认为这是最后的手段.