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;

Delphi 5は文句を言いIncompatible typesます。

私はそれを次のように単純化しようとしました:

s := Grob[7]; 

動作し、次のとおりです。

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

そうではありません。

WideString[index]を返さないとしか思えません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 のバグを回避します)、はるかに遅くなります。WideStringWideChars

の作成WideStringは非常に遅いです。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 に答える