4

我有以下无法编译的代码片段:

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;

德尔福5抱怨Incompatible types

我尝试将其简化为:

s := Grob[7]; 

哪个有效,并且:

s := Grob[7]+Grob[8];

没有。

我只能假设WideString[index]不返回 a WideChar

我试图强迫事情成为WideChars

s := WideChar(Grob[7])+WideChar(Grob[8]);

但这也失败了:

不兼容的类型

脚注

  • 5: 德尔福 5
4

3 回答 3

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从 的串联中生成 a WideChars),但速度要慢得多。

创建 aWideString非常慢:它不使用 Delphi 内存分配器,而是使用 Windows 提供的 BSTR 内存分配器(用于 OLE),这非常慢。

于 2012-05-03T18:57:38.760 回答
7

Grob[7]是一个WideChar;那不是问题。

问题似乎是+操作员不能对宽字符采取行动。但它可以作用于宽字符串,并且任何宽字符都可以转换为宽字符串:

S := WideString(Grob[7]) + WideString(Grob[8]);
于 2012-05-03T18:27:59.520 回答
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;

它有效。Delphi 对什么类型的 a 感到困惑WideString[index],所以我必须克服它。

于 2012-05-03T18:38:49.287 回答