如何通过索引访问WideString的字符?

Ian*_*oyd 4 delphi delphi-5 widestring

我有以下代码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;
Run Code Online (Sandbox Code Playgroud)

德尔福5抱怨Incompatible types.

我尝试将其简化为:

s := Grob[7]; 
Run Code Online (Sandbox Code Playgroud)

哪个有效,并且:

s := Grob[7]+Grob[8];
Run Code Online (Sandbox Code Playgroud)

没有.

我只能假设WideString[index]没有返回WideChar.

我试图强迫事情WideChars:

s := WideChar(Grob[7])+WideChar(Grob[8]);
Run Code Online (Sandbox Code Playgroud)

但那也失败了:

不兼容的类型

脚注

  • 5:Delphi 5

Arn*_*hez 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;
Run Code Online (Sandbox Code Playgroud)

使用WideString(Grob[7])+WideString(Grob[8])表达式将起作用(它绕过Delphi 5的错误,你不能通过WideString它连接起来WideChars),但速度要慢得多.

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


And*_*and 7

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

问题似乎是+运营商无法对广泛的角色采取行动.但是它可以作用于宽字符串,并且任何宽字符都可以转换为宽字符串:

S := WideString(Grob[7]) + WideString(Grob[8]);
Run Code Online (Sandbox Code Playgroud)