Delphi并防止事件处理
发布时间:2020-12-15 04:13:48 所属栏目:大数据 来源:网络整理
导读:当事件处理已经运行时,如何防止新的事件处理启动? 我按下按钮1并启动事件处理程序,例如慢打印工作. 表单按钮,编辑,组合中有几个控件,我希望只有在运行处理程序完成后才允许新事件. 我已经使用fRunning变量来锁定共享事件处理程序中的处理程序.有更聪明的方
当事件处理已经运行时,如何防止新的事件处理启动?
我按下按钮1并启动事件处理程序,例如慢打印工作. 我已经使用fRunning变量来锁定共享事件处理程序中的处理程序.有更聪明的方法来处理这个问题吗? procedure TFormFoo.Button_Click(Sender: TObject); begin if not fRunning then try fRunning := true; if (Sender = Button1) then // Call something slow ... if (Sender = Button2) then // Call something ... if (Sender = Button3) then // Call something ... finally fRunning := false; end; end; 解决方法
另一个选项(不需要标志字段)将临时为事件分配NIL:
procedure TForm1.Button1Click(Sender: TObject); var OldHandler: TNotifyEvent; begin OldHandler := (Sender as TButton).OnClick; (Sender as TButton).OnClick := nil; try ... finally (Sender as TButton).OnClick := OldHandler; end; end; 为方便起见,这可以包装在一个界面中: interface function TempUnassignOnClick(_Btn: TButton): IInterface; implementation type TTempUnassignOnClick = class(TInterfacedObject,IInterface) private FOldEvent: TNotifyEvent; FBtn: TButton; public constructor Create(_Btn: TButton); destructor Destroy; override; end; constructor TTempUnassignOnClick.Create(_Btn: TButton); begin Assert(Assigned(_Btn),'Btn must be assigned'); inherited Create; FBtn := _Btn; FOldEvent := FBtn.OnClick; FBtn.OnClick := NIL; end; destructor TTempUnassignOnClick.Destroy; begin FBtn.OnClick := FOldEvent; inherited; end; function TempUnassignOnClick(_Btn: TButton): IInterface; begin Result := TTempUnassignOnClick(_Btn); end; 像这样使用: procedure TForm1.Button1Click(Sender: TObject); begin TempUnassignOnClick(Sender as TButton); ... end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |