Pet*_*ner 1 delphi unicode delphi-2009
为了我的目的,我实际上真的使用ASCII字符数据(用于将ASCII文本文件提交到状态),所以只使用unicodestring将无法帮助最终结果(我仍然需要转换一些东西).
我可以选择在Delphi 2009中转换StrComp函数,该函数从将AnsiString和PAnsiChar比较为UnicodeString和PAnsiChar.
Val : PAnsiChar
Mask : TEditMask;
Run Code Online (Sandbox Code Playgroud)
....
这是我的原始代码,它并不好
StrComp(PAnsiChar(Mask.EditText), Val);
Run Code Online (Sandbox Code Playgroud)
....
所以,我可以改为:
StrComp(PAnsiChar(AnsiString(MAskEdit.EditText), Val);
Run Code Online (Sandbox Code Playgroud)
或者,我可以将其更改为此(额外转换为"清晰度"):
StrComp(PChar(MAskEdit.EditText), PChar(String(AnsiString(Val))));
Run Code Online (Sandbox Code Playgroud)
我记得Marco Cantu说,不要在循环中做其中一个,我只是不记得是哪一个或为什么.
如果你编译这个:
StrComp(PAnsiChar(Mask.EditText), Val);
Run Code Online (Sandbox Code Playgroud)
有一个从Mask.EditTextas UnicodeString到temp的隐式转换,AnsiString以允许类型转换为PAnsiChar.那是你的第二行:
StrComp(PAnsiChar(AnsiString(MAskEdit.EditText), Val);
Run Code Online (Sandbox Code Playgroud)
但写作
StrComp(PChar(MAskEdit.EditText), PChar(String(AnsiString(Val))));
Run Code Online (Sandbox Code Playgroud)
将PChar(MAskEdit.EditText)返回a PChar,即a PWideChar,因此它将使用其他重载StrComp函数.
事实上,自从Delphi 2009以来在SysUtils.pas中定义了两个重载函数:
function StrComp(const Str1, Str2: PAnsiChar): Integer; overload;
function StrComp(const Str1, Str2: PWideChar): Integer; overload;
Run Code Online (Sandbox Code Playgroud)
这两个函数都不会调用windows API,但会逐个比较字符,区分大小写.
所以我的建议是你不要在代码中使用任何指针,而是在代码中的任何地方依赖plain string= UnicodeString变量,而是使用这个函数:
function CompareStr(const S1, S2: string): Integer;
Run Code Online (Sandbox Code Playgroud)
比较将是相同的,并且不会有隐藏的转换.与unicode和当前ansi页面之间的转换(两个WinAPI调用)相比,具有WideChar代替AnsiChar(即具有两倍的内存)的问题是无关紧要的.引用你的标题,转换方向并不重要:它总是慢于没有转换.
如果你搜索速度,我怀疑这肯定Mask.EditText是你的代码中的瓶颈.此方法将发送GDI消息,等待组件的响应,然后string用文本影响a .你最好在堆栈上使用临时变量,如果我怀疑你Mask.EditText在循环中使用这个表达式.
| 归档时间: |
|
| 查看次数: |
1299 次 |
| 最近记录: |