2013-08-14 5 views
5

イベントハンドラを持つ特定のコンポーネントを持つフォームがあります。これらのイベントハンドラ(これらのメソッド)を、設計時にオブジェクトインスペクタを使用してコンポーネントイベントに割り当てることができる別のユニットに移動したいと思います。IDEがデザイン時にコンポーネントイベントに割り当てることを可能にする、イベントメソッドのための別のユニットの作成方法?

オブジェクトインスペクタで設計時に割り当てることができるように、イベントメソッドに対してのみ別のユニットを作成することはできますか?

私は公共の手順でそのユニットを作るならばのは、言ってみましょう:

unit Unit2; 

interface 

procedure ButtonClick(Sender: TObject); 

implementation 

procedure ButtonClick(Sender: TObject); 
begin 
    // do something here 
end; 

end. 

またはこのような発表された方法でクラスに:イベントメソッドのために別々のユニットにする方法

unit Unit2; 

interface 

type 
    TMyClass = class 
    published 
    procedure ButtonClick(Sender: TObject); 
    end; 

var 
    MyClass: TMyClass; 

implementation 

{ TMyClass } 

procedure TMyClass.ButtonClick(Sender: TObject); 
begin 
    // do something here 
end; 

end. 

どのIDEで設計時にコンポーネントイベントに割り当てることができますか?例えば同様:

enter image description here

+4

OK。先に行く。あなたはそれをやめて何を止めていますか? –

+0

デザイン時にこのイベントをButtonに割り当てることができません。 ¿あなたに例がありますか? – user2683734

+5

OPが何を求めているのかが実際にはっきりしていることと、より多くのスペースを必要とする説明を誰もが理解できないという理由で、この質問が成り立つのは残念です。コメントが許可するもの。 – MartynA

答えて

4

ほとんどのイベントはメソッドポインタです。つまり、クラス内のプロシージャや関数を指しています。だから、あなただけのボタンのクリックイベントにする手順Unit2.ButtonClickを添付することはできませんが、このようなイベントハンドラを実装するクラス、何か書くことができます。

type 
    TMainFormButtonEventHandler = class 
    procedure ButtonClick(Sender: TObject); 
    end; 

procedure TMainFormButtonEventHandler.ButtonClick(Sender: TObject); 
begin 
    ShowMessage('Clicked'); 
end; 

は今、あなたは、このような作成することができますがイベントにリンクしてください:

handler := TMainFormButtonEventHandler.Create; 
Form1.Button1.OnClick := handler.ButtonClick; 

私はこれが最良のアプリケーション構造ではないと思います。私は、フォームのユニットの外からフォームのGUI要素にフックしません。しかし、そうしたいと思うなら、これがどのように行われたかです。

GUIとロジックの分離を探している場合は、アクションを見てください。 TAction(ActionListで囲まれています)は、ボタンのようなGUIコンポーネントとそれが実行するアクションコードの間の第1の境界です。

便利なことは、これらのアクションをデザイン時に作成して、ボタンや他のコントロールにアタッチできることです。 ButtonClickのコードを記述するのではなく、ActionExecute(アクションのOnExecuteイベント)のコードを記述します。ボタンをクリックすると、関連するアクションが実行されることがわかります。

+0

私は申し訳ありません、私はデルファイの初心者ですが、どこに入れた **ハンドラ:= TMainFormButtonEventHandler.Create; ** ** Form1.Button1.OnClick:=ハンドラ.ButtonClick; *** – user2683734

+0

それはあなたのアプリケーションの初期化コードのどこかにありますが、とにかく、それは実行時の解決策であり、あなたのような設計時の解決策ではありません。私は設計時のソリューションに最も近いのは、私の答えの一番下に記載されているように、どんなイベントのドロップインソリューションではありません。 – GolezTrol

+0

助けてくれてありがとうございます。 – user2683734

関連する問題