3

文字列解析用のカスタム列挙子を作成すると、奇妙なエラー メッセージが表示されます。レコードを使用すると、次のエラーが発生します。

E2010 互換性のない型: 'TSplitStringEnumerator' および 'Pointer'

レコードの代わりにクラス (コードにいくつかの .Create 呼び出しを挿入) を使用すると、時々内部エラーが発生します。

クラスではなくレコードデータ型で列挙を機能させる方法を知っている人はいますか?

type
    TSplitStringEnumerator = record
        StringToParse:          string;
        Separator:              Char;
        S:                      Integer;
        E:                      Integer;
        L:                      Integer;
        function    GetCurrent  (): string; inline;
        function    MoveNext    (): Boolean; inline;
        property    Current:    string read GetCurrent;
    end;

    TSplitStringGenerator = record
        Enum:                   TSplitStringEnumerator;
        function GetEnumerator: TSplitStringEnumerator; inline;
    end;

function SplitString( const StringToParse: string; Separator: Char ): TSplitStringGenerator; //inline;
begin
    Result.Enum.StringToParse := StringToParse;
    Result.Enum.Separator     := Separator;
    Result.Enum.S             := 0;
    Result.Enum.E             := 0;
    Result.Enum.L             := Length( StringToParse );
end;

procedure Test();
var
    S: string;
begin
    for S in SplitString( 'A;B;C', ';' ) do begin
        OutputDebugString( PChar( S ) );
    end;
end;

{ TSplitStringGenerator }

function TSplitStringGenerator.GetEnumerator(): TSplitStringEnumerator;
begin
    Result := Enum;
end;

{ TSplitStringEnumerator }

function TSplitStringEnumerator.GetCurrent(): string;
begin
    Result := Copy( StringToParse, S, E - S );
end;

function TSplitStringEnumerator.MoveNext(): Boolean;
begin
    S := E + 1;
    Result := S <= L;
    E := S;
    while ( E <= L ) and ( StringToParse[ E ] <> Separator ) do Inc( E );
end;
4

2 に答える 2

4

QCで同様のバグ レポート #72213を見つけました。このバグは、Delphi 2010 で修正されました (解決コメントを参照してください)。

于 2011-01-29T18:21:50.410 に答える
2

そのコードはコンパイルされ、Delphi 2010 で正常に実行されるように見えます。出力は次のとおりです。

Debug Output: A Process Project4.exe (4656)
Debug Output: B Process Project4.exe (4656)
Debug Output: C Process Project4.exe (4656)

Delphi 2007 で、レコードを含む列挙子がサポートされていない可能性はありますか?

于 2011-01-29T17:46:44.010 に答える