将自定义事件分配给Objects OnMouseEnter事件

时间:2013-05-10 15:33:31

标签: delphi

我正在寻找一种方法来重新路由TPanel的OnMouseEnter的事件处理程序。我有一个类,其中包含一组TPanels,我用它来代表座位表。我希望能够为每个TPanel的OnMouseEnter事件分配一个自定义事件,这些事件是在运行时动态创建的。我将提供一些伪代码来尝试帮助澄清:

//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;

当调用新的OnMouseEnter事件时,代替TPanel的OnMouseEnter我想它会像在设计时在表单上放置一个面板并创建一个{{来自对象Inspector的1}}事件,但能够传递其他参数:

OnMouseEnter

有人可以建议一个可能的解决方案吗?我希望我很清楚,我是第一次发表海报。提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:3)

OnMouseEnter属性的类型为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;

然后你可以在OnMouseEnter汉德:

中找到相关的值
Params := ParamDict[Sender as TPanel];

如果您的Delphi版本太旧而无法支持通用TDictionary类,那么您也可以使用任意数量的其他数据结构。 TDictionary只是简单易行。