我正在寻找一种方法来重新路由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
有人可以建议一个可能的解决方案吗?我希望我很清楚,我是第一次发表海报。提前感谢您提供的任何帮助。
答案 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
只是简单易行。