Arrays
ユーザー定義の列挙型を使用してインデックスを作成できます。例えば:
type
TIndexValue = (ZERO = 0, ONE, TWO, THREE, FOUR);
var
MyArray: array[Low(TIndexValue) .. High(TIndexValue)] of String;
この配列の要素は、TIndexValue
値をインデックスとして使用して参照できます。
MyArray[ZERO] := 'abc';
これと同じ一般的な機能を。で取得しようとしていTStringList
ます。
Integer
簡単な解決策の1つは、参照時にすべてのインデックス値を型にキャストすることです。
MyStringList[Integer(ZERO)] := 'abc';
別の解決策(すべてのキャストを非表示にする)は、のサブクラスを作成し、継承されたプロパティTStringList
にアクセスするこのサブクラスのサブルーチンへのすべてのキャストを延期することです。Strings
type
TIndexValue = (ZERO = 0, ONE, TWO, THREE, FOUR);
type
TEIStringList = class(TStringList)
private
function GetString(ItemIndex: TIndexValue): String;
procedure SetString(ItemIndex: TIndexValue; ItemValue: String);
public
property Strings[ItemIndex: TIndexValue]: String
read GetString write SetString; default;
end;
function TEIStringList.GetString(ItemIndex: TIndexValue): String;
begin
Result := inherited Strings[Integer(ItemIndex)];
end;
procedure TEIStringList.SetString(ItemIndex: TIndexValue; ItemValue: String);
begin
inherited Strings[Integer(ItemIndex)] := ItemValue;
end;
これは、列挙型を使用する単一の実装で正常に機能しますTIndexValue
。
ただし、可能な列挙型ごとにサブクラスTStringList
を定義することなく、この同じロジックまたはサブクラスを、異なる列挙型によってインデックス付けされたいくつかの異なるオブジェクトに再利用したいと思います。TStringList
このようなことは可能ですか?Delphiのジェネリックに依存する必要があるのではないかと思いますが、これを実現するためのより簡単な方法があることを知りたいと思います。