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

时间:2012-05-03 18:17:50

标签: 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;

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

3 个答案:

答案 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]的类型感到困惑,所以我不得不将其击败。