1

OnMouseEnterTPanelのイベント ハンドラを再ルーティングする方法を探しています。座席表を表すために使用している TPanel の配列を含むクラスがあります。OnMouseEnter実行時に動的に作成される各 TPanel のイベントにカスタム イベントを割り当てられるようにしたいと考えています。明確にするために、いくつかの疑似コードを提供します。

//Class Declaration

TMyClass = Class(TObject)
 PanelArray : Array of TPanel;
end

//Forms declarations

MyClass : TMyClass //Created on the on create event of form.

//Loop assigning the new event
For I:=0 To High(MyClass.PanelArray) do
Begin
  //Instance of panel
  MyClass.PanelArray[I].OnMouseEnter := NewOnMouseEnterEvent(Parm1,Parm2,Parm3,....ParmN);
end;

NewOnMouseEnterイベントが呼び出されると、TPanel の代わりにOnMouseEnter、設計時にパネルをフォームに配置しOnMouseEnter、オブジェクトのインスペクターからイベントを作成した場合とまったく同じように機能すると思いますが、追加のパラメーターを渡すことができます。

TForm1.Panel1OnMouseEnter(Sender: Tobject; Parm1,Parm2,Parm3,....ParmN:String);
begin
  ShowMessage(Parm1);
end;

誰でもこれに対する可能な解決策を提案できますか? 私は十分に明確だったと思います。私は初めてのポスターです。ご協力いただきありがとうございます。

4

1 に答える 1

3

OnMouseEnterプロパティには typeがあります。TNotifyEventこれは、正確に 1 つのパラメーターを期待するメソッド ポインターです。他のシグネチャを持つ他のメソッドにポインターを割り当てることはできません。

取得するパラメーターはSenderであり、技術的に必要なのはこれだけです。これにより、どのパネルが操作されているかがわかります。それを使用して、そのパネルに関連付ける必要がある他の値を検索できます。たとえば、他のすべてのパラメータを保持するレコードを定義し、それらをパネルをキーにしたディクショナリに保存できます。

type
  TMouseEnterParameters = record
    Param1, Param2, ..., ParamN: string;
  end;

  TMouseEnterDictionary = TDictionary<TPanel, TMouseEnterParameters>;

イベント ハンドラーを割り当てるときに辞書を作成します。

for i := 0 to High(MyClass.PanelArray) do begin
  MyClass.PanelArray[i].OnMouseEnter := Panel1OnMouseEnter;
  ParamDict[MyClass.PanelArray[i]] := MakeParameters(Param1, Param2, ..., ParamN);
end;

OnMouseEnter次に、ハンドラーで関連する値を見つけることができます。

Params := ParamDict[Sender as TPanel];

Delphi のバージョンが古すぎてジェネリックTDictionaryクラスをサポートできない場合は、他のデータ構造をいくつでも使用できます。TDictionary簡単にするだけです。

于 2013-05-10T15:43:30.613 に答える