2010-02-13 33 views
2

在2007年德尔福排序例行我使用这样的代码:德尔福,如何避免D2009 unicode的警告信息,D2010

(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中不发出警告?

罗伊中号Klever

回答

10

您是否获得了“WideChar减少集表达式字节字符。考虑使用‘sysutils的’单位‘CharInSet’功能”的消息?

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

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

如果您确定不需要任何Unicode字符,则可以使用CharInSet或将txt作为AnsiString来解决此问题。或者如果这样做效果不好,可以禁用该警告,但我认为这是最后的手段。

+0

谢谢你的很好的解释,我现在明白了,并且能够通过使用(txt [n]> ='0')和(txt [n]> ='9')来避免警告 Roy M Klever – 2010-02-13 02:30:49

+0

我总是禁用警告,因为编译器为“WideChar in AnsiCharSet”生成完全有效的代码。因为我知道我的所有字符都是ASCII字符<#128,所以我没有必要用“内联”的CharInSet()函数来减缓紧密的循环。这可能与我喜欢快速和资源友好的代码有关。 – 2010-02-13 13:13:46

9

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