我已经将一个应用程序从Delphi 2007更新到了Delphi 2010,一切都很好,只有一条语句编译得很好,但不能工作,它是:
If Edit1.Text[1] in ['S','س'] then
ShowMessage('Found')
else
ShowMessage('Not Found')
但是,我知道在will中不会这样,所以我改成了CharInSet
If CharinSet(Edit1.Text[1],['S','س']) then
ShowMessage('Found')
else
ShowMessage('Not Found')
但当字符串为س
时,它永远不起作用,但它总是适用于S
,即使我强制转换edt1。使用AnsiChar的文本1它总是不能处理阿拉伯字母。
我做错了什么,或者这不是CharInSet
的工作方式?或者这是CharinSet
中的一个错误
更新:
我的好朋友Issam Ali提出了另一个解决方案,它运行得很好:
If CharinSet(AnsiString(edt1.Text)[1],['S','س']) then
发布于 2010-11-21 19:04:59
CharInSet对于255以上的字符无效。在您的情况下,您应该使用
case C of
'S','س' : ShowMessage('Found');
end;
发布于 2010-11-22 22:25:03
这是因为set of char
结构化类型(最多256个元素)根本不支持Unicode。也就是说,将发出在set构造函数中被截断的任何字符Ord(ch) > High(AnsiChar)
,并警告W1061有关将WideChar缩小到AnsiChar的信息。请看下面的测试用例:
{ naturally, fails, emits CharInSet() suggestion }
Result := 'س' in ['S','س'];
{ fails because second argument is set of AnsiChar }
Result := CharInSet(
'س',
['S','س']
);
{ workaround for WideChar in AnsiCharSet, fails }
Result := WideStrUtils.InOpSet(
'س',
['S','س']
);
{ a syntactical workaround, which finally works }
Result := WideStrUtils.InOpArray(
'س',
['S','س']
);
if Result then
ShowMessage('PASS')
else
ShowMessage('FAIL');
发布于 2010-11-22 22:58:22
此外。
集合被限制为256个元素的序数值。所以AnsiChar适合,而(Unicode)Char不适合。您可以使用CharInSet将Delphi的pre unicode版本移植到unicode版本。由于集合的限制,集合对于字符不再是非常有用的。
这背后的原因是集合是以位掩码的形式实现的。您可以自由地实现自己版本的set。例如:
type
TSet<T> = class
public
procedure Add(const AElem: T);
function InSet(const AElem: T): Boolean;
end;
https://stackoverflow.com/questions/4237339
复制相似问题