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,它是一个方法指针,只需要一个参数。您不能将指针分配给具有其他签名的其他方法。

你得到的参数是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;

然后你可以在handler中找到相关的值OnMouseEnter

Params := ParamDict[Sender as TPanel];

如果您的 Delphi 版本太旧而无法支持泛型TDictionary类,您也可以使用任意数量的其他数据结构。TDictionary只是让它变得容易。

于 2013-05-10T15:43:30.613 回答