pKa*_*ian 5 delphi controls event-handling
当事件处理已经运行时,如何防止新的事件处理启动?
我按下按钮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;
Run Code Online (Sandbox Code Playgroud)
另一个选项(不需要标志字段)将临时为事件分配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;
Run Code Online (Sandbox Code Playgroud)
为方便起见,这可以包装在一个界面中:
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;
Run Code Online (Sandbox Code Playgroud)
像这样使用:
procedure TForm1.Button1Click(Sender: TObject);
begin
TempUnassignOnClick(Sender as TButton);
...
end;
Run Code Online (Sandbox Code Playgroud)