文字列解析のカスタム列挙子を作成するときに、奇妙なエラーメッセージが表示されます。レコードの代わりに、私は時々、いくつかの内部エラーを取得Delphiのカスタム列挙子で奇妙なエラーが発生する
E2010 Incompatible types: 'TSplitStringEnumerator' and 'Pointer'
クラスを使用して(コード内のいくつかの.Create呼び出しを挿入):
は誰もが知っていたレコードを使用する場合は、次のエラーが発生します列挙型をクラスの代わりにレコードデータ型で保持する方法は?このコードはコンパイルとDelphi 2010年に私のために成功した出力を実行するように見える
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;
+1はOPがマネージタイプを使用しているのでかなり説明しそうです –
はい、文字列を置き換えますPCharはD2009のコンパイルエラーを効果的に削除します。 –
D2010に移動せずに動作させるには、クラスに切り替える必要があると思います。レコードでは、管理対象のタイプを使用できない場合、リークを回避する方法はありません。 –