【发布时间】:2012-03-15 09:09:13
【问题描述】:
好的,我有一个返回TMouseEvent类型的函数
我需要执行返回的 TMouseEvent 但我不知道如何。
返回事件的简单函数:
function OMDold(obj: TObject): TMouseEvent
begin
... //some operations on obj
result := obj.OnMouseDown; //there is casting necessary, I skip it for simplify
end;
当前事件设置为 OMDnew,如下所示:
procedure TfmAPRBasedForm.TSDragEvent(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if something then dosomething
else
begin
Sender.OnMouseDOwn := OMDold // OMDold in most cases returns null but its ok I just want to clear custom event from the object
//line below is a point of my question - the one I used doesnt work
TButton(Sender).OnMouseDown(Sender,Button,Shift,X,Y) //this line throws Access viloation at me
end;
end;
我想要达到的目标:
获取按钮默认 OnMouseDown 事件并将其存储在一些记录数据中
将 ONMouseDown 事件更改为自定义
在自定义事件过程中,有一个条件 - 如果鼠标按下是拖动,我执行拖动代码,如果不是,我会继续普通点击
要使用普通点击来触发,我想恢复默认事件并重新启动它,以便可以执行点击
就是这样
【问题讨论】:
-
你为什么不直接打电话给
OMDnew。你可以做到的。 -
直接调用
OMDnew(sender, button, shift, x,y)有什么问题? -
我的描述不够清楚。 Justmade可能只是给了我正确的答案。但是,我编辑了我的帖子,以供进一步使用:)
-
如你所说,Sender.OnMouseDOwn := OMDold 通常返回 nil(非 null)。这意味着 Sender.OnMouseDOwn 也为零。这就是为什么你从调用它获得 AV 的原因。您需要在调用 TButton(Sender).OnMouseDown 之前添加 If Assigned(Sender.OnMouseDOwn) then 以便在 Sender.OnMouseDown 为空时跳过它。
-
我已经回答了你原来的问题,虽然它可能没有真正解决你的问题,因为你没有清楚地提出你的问题。不断改变问题并不是获得更多帮助的好方法。如果您的新问题确实与原来的问题有很大不同,那么您最好提出一个新问题。