2016-11-18 3 views
6

TCustomPanelに基づいて新しいコンパウンドコンポーネントを作成しました。その上 私が(下部はそれほど重要ではない)このレイアウトを参照して、すべての表面を覆って、2つのラベルと1つのイメージを持っている:複合コンポーネントの子からダブルクリックを処理するにはどうすればよいですか?

Layout of the control

私の質問のいずれかのダブルクリックの機能をエクスポートする方法でありますこれらのコントロール?新しいコントロールのダブルクリック(イベント)を使用して、子コントロールの子コントロールを管理することは可能でしょうか?

答えて

3

私はあなたが以下のアプローチを使用してそれを行うべきだと思う:

  1. 化合物成分にOnDblClickイベントを追加します。
  2. FOnInternalDblClick(名前は重要ではありません)というメソッドを追加し、複合コンポーネントにTNotifyEventと互換性があります。
  3. FOnInternalDblClickの中に、化合物成分のOnDblClickを実行します。
  4. 複合コンポーネントのコンストラクターで、イベントを管理するすべてのコンポーネントのOnDblClickイベントにFOnInternalDblClickを割り当てます。

例コード:

TMyCompoundComponent = class(TCustomPanel) 
protected 
    FOnDblClick : TNotifyEvent; 
    procedure FOnInternalDblClick(ASender : TObject); 
public 
    constructor Create(AOwner : TComponent); override; 
published 
    property OnDblClick : TNotifyEvent read FOnDblClick write FOnDblClick; 
end; 

constructor TMyCompoundComponent.Create(AOwner : TComponent); 
begin 
    inherited; 
    //Lab1.OnDblClick := FOnInternalDblClick; 
    //Lab2.OnDblClick := FOnInternalDblClick; 
    //... 
end; 

procedure TMyCompoundComponent.FOnInternalDblClick(ASender : TObject); 
begin 
    if(@FOnDblClick <> nil) 
    then FOnDblClick(ASender); 
end; 

注:化合物成分のOnDblClickイベントハンドラで

ASenderパラメータは、内部部品(Lab1Lab2Lab3あろう.. )。あなたはASenderパラメータとして化合物成分自体を受け取ることを好む場合は、ASenderの代わりにSelfを渡すことでFOnInternalDblClick方法を変更することができます:

procedure TMyCompoundComponent.FOnInternalDblClick(ASender : TObject); 
begin 
    if(@FOnDblClick <> nil) 
    then FOnDblClick(Self); 
end; 
+0

Tnxたくさん、ちょうど私が必要なもの。 よろしくお願いいたします。 –

2

どちらもあなたの要求が可能です。それはあなたがしたいことにかかっています。それぞれのサブアイテムごとにプログラムにコードを書きたい場合は、コンポーネントの3つの追加の公開プロパティを作成し、対応するサブコンポーネントプロパティにマップする必要があります。このように(1つのサブコンポーネントのために示しただけ - 他の2のために繰り返す):

type 
    TMyPanelForm1 = class(TPanel) 
    private 
    fLabel1, fLabel2 : TLabel; 
    fImage : TImage; 
    procedure SetLabel1DblClick(const Value: TNotifyEvent); 
    function GetLabel1DblClick: TNotifyEvent; 
    public 
    constructor Create(AOwner: TComponent); override; 
    published 
    property OnLabel1DblClick : TNotifyEvent 
      read GetLabel1DblClick write SetLabel1DblClick; 
    end; 
... 
function TMyPanelForm1.GetLabel1DblClick: TNotifyEvent; 
begin 
    Result := fLabel1.OnDblClick; 
end; 

procedure TMyPanelForm1.SetLabel1DblClick(const Value: TNotifyEvent); 
begin 
    fLabel1.OnDblClick := Value; 

end; 

を一方、あなたがコントロールを一元管理、すべての3つのサブコントロール「継承」主成分のように行動したい場合ダブルクリックすると、次のような割り当てが波及します。

他の解決策も可能です。

+0

Tnx Dsm、実際には2番目の解決策です。私もこのアプローチを試しましたが、私は欠けていました。 –

関連する問題