我有以下不会编译的代码snippit:
procedure Frob(const Grob: WideString);
var
s: WideString;
begin
s :=
Grob[7]+Grob[8]+Grob[5]+Grob[6]+Grob[3]+Grob[4]+Grob[1]+Grob[2];
...
end;
Delphi 5 抱怨Incompatible types
。
我尝试将其简化为:
s := Grob[7];
有效,并且:
s := Grob[7]+Grob[8];
没有。
我只能假设WideString[index]
没有返回WideChar
。
我试图迫使事情成为WideChars
:
s := WideChar(Grob[7])+WideChar(Grob[8]);
但那也失败了:
不兼容的类型
5
:Delphi 5 答案 0 :(得分:10)
在您的情况下,更简单,更快速的是以下代码:
procedure Frob(const Grob: WideString);
var
s: WideString;
begin
SetLength(s,8);
s[1] := Grob[7];
s[2] := Grob[8];
s[3] := Grob[5];
s[4] := Grob[6];
s[5] := Grob[3];
s[6] := Grob[4];
s[7] := Grob[1];
s[8] := Grob[2];
...
end;
使用WideString(Grob[7])+WideString(Grob[8])
表达式将起作用(它绕过Delphi 5的错误,你无法通过WideString
的串联来生成WideChars
,但速度要慢得多。< / p>
创建WideString
非常慢:它不使用Delphi内存分配器,而是使用Windows提供的BSTR内存分配器(用于OLE),这是非常慢的。
答案 1 :(得分:7)
Grob[7]
是WideChar
;这不是问题。
问题似乎是+
运算符无法对广泛的字符进行操作。但它可以作用于宽字符串,任何宽字符都可以转换为宽字符串:
S := WideString(Grob[7]) + WideString(Grob[8]);
答案 2 :(得分:4)
正如Geoff在Delphi中指出我处理WideString古怪的另一个问题时,我从那里随机尝试了我的解决方案:
procedure Frob(const Grob: WideString);
var
s: WideString;
const
n: WideString = ''; //n=nothing
begin
s :=
n+Grob[7]+Grob[8]+Grob[5]+Grob[6]+Grob[3]+Grob[4]+Grob[1]+Grob[2];
end;
它有效。德尔福对于WideString[index]
的类型感到困惑,所以我不得不将其击败。