加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读