クラスヘルパーで既存のクラスを継承することなく拡張する

クラスヘルパーを使うと、既存のクラスを継承しなくても拡張することができます。

■サンプル

次の例はTListBoxにItemIndexValueという関数を追加しています。

デザインモードではいつも通りにコンポーネントを配置します。

クラスヘルパーでTListBoxにItemIndexValue関数を追加します。

type
  TListboxHelper = class helper for TListBox
    function ItemIndexValue: String;
  end;

implementation

function TListboxHelper.ItemIndexValue: String;
begin
  Result := '';
  if ItemIndex >= 0 then
    Result := Items[ItemIndex];
end;

ListBox1をクリックした時、選択されている項目をEdit1に表示します。

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Edit1.Text := ListBox1.ItemIndexValue; //追加した関数を呼び出す
end;

ListBox1の項目を選択すると、項目の値がEdit1に表示されます。

■おまけ

TListBoxを継承した同名のクラスを作成する方法もあります。

type
  //標準のTListBoxを継承した新しいTListBoxを作成
  //コンパイラはこっちのTListBoxを優先して使用する
  TListbox = class (StdCtrls.TListBox)
    function ItemIndexValue: String;
  end;

implementation

function TListbox.ItemIndexValue: String;
begin
  Result := '';
  if ItemIndex >= 0 then
    Result := Items[ItemIndex];
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  Edit1.Text := ListBox1.ItemIndexValue; //追加した関数を呼び出す
end;

2011年8月22日追記:名前空間の検索順序に関する間違った記述を削除した。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください