Frage

Beim Erstellen eines benutzerdefinierten Enumerators für die String -Parsen sehe ich einige seltsame Fehlermeldungen. Bei der Verwendung von Datensatz ergibt der folgende Fehler:

E2010 Inkompatible Typen: 'TSPLITStringenumerator' und 'Zeiger'

Wenn Sie Klassen verwenden (ein paar .Create -Anrufe in den Code einfügen), erhalte ich von Zeit zu Zeit einige interne Fehler:

Weiß jemand, wie man die Aufzählung mit Datensätze anstelle von Klassen funktioniert?

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;
War es hilfreich?

Lösung

Ich habe das ähnliche gefunden Fehlerbericht Nr. 72213 auf QC. Der Fehler wurde in Delphi 2010 behoben (siehe Auflösungskommentare).

Andere Tipps

Dieser Code kompiliert und scheint für mich in Delphi 2010 erfolgreich auszuführen. Die Ausgabe lautet:

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

Ist es möglich, dass Aufzähler mit Aufzeichnungen in Delphi 2007 nicht unterstützt werden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top