在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中没有警告的情况下工作吗?
Roy M Klever
答案 0 :(得分:9)
使用CharInSet
或更好地使用Character.IsDigit
答案 1 :(得分: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边界之外。
如果您确定不需要任何Unicode字符,可以使用CharInSet或将txt设为AnsiString来修复它。或者,如果效果不好,您可以禁用警告,但我认为这是最后的手段。