Delphi事件的广播 转

时间:2021-08-29 05:36:21

明天就是五一节了,辛苦了好几个月,借此机会应该尽情放松一番。可是想到Blog好久没有写文章,似乎缺些什么似的。这几个月来在项目中又增长了许多经验,学到许多实际应用的常识。不如把一些对照有用的记录下来,供伴侣们参考可好。

我想到Delphi的事件,那可真是个便利的对象,初学者在窗体上拉几个控件,并指定它们的事件,写几句代码,立刻就得到他们想要的效果。可是事件在便利的同时也有一个不敷之处,就是只能指定一个接收事件的东西,这在某些应用中会受收限制,好比多视图对应一个业务逻辑时,当一个业务东西想通知视图更新它们的状态,如果用事件,那只能有一个视图得到通知。

有没有步伐让东西触发事件时,多个东西同时能收到呢?其实仔细一想,还是有挺多的,根柢的就是维护一张接收事件东西的列表,事件产生时,遍历列表并挪用相应的要领。本文介绍两种要领,这两种要领都对照好用。

第一种要领是从ApplicationEvents控件的实现方法学来的。ApplicationEvents是为了便利地措置惩罚惩罚Application的所有事件,一个措施中放多个ApplicationEvents,它们都能同时通报Application的事件到事件接收类中,下面是一个例子,在一个窗体上放两个ApplicationEvents控件,并指定它们的OnMessage事件,并写如下代码:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  Edit1.Text := IntToStr(i1);
  Inc(i1);
end;

procedure TForm1.ApplicationEvents2Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  Edit2.Text := IntToStr(i2);
  Inc(i2);
end;

运行措施,可以看到两个事件措置惩罚惩罚要领都产生了,i1和i2猖獗的增长。也就是说Application通过ApplicationEvents这个控件使得它的事件可以被多个东西同时接收,显然ApplicationEvents不是简单地通报Application的事件,必然是运用了某些技巧,看看它的源码如何。

打开AppEvnts这个单元,发明里面的代码并不久不多,在初始节中有这样的代码:

initialization
  ... ...

  MultiCaster := TMultiCaster.Create(Application);
end.

MultiCaster是TMultiCaster类的一个全局东西,结构函数传进Appication东西,可以必定,在里面MultiCaster将接收Application的所有事件,看看源码就知道了。

constructor TMultiCaster.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FAppEvents := TComponentList.Create(False);
  with Application do
  begin
    OnActionExecute := DoActionExecute;
    OnActionUpdate := DoActionUpdate;
    OnActivate := DoActivate;
    OnDeactivate := DoDeactivate;
    OnException := DoException;
    OnHelp := DoHelp;
    OnHint := DoHint;
    OnIdle := DoIdle;
    OnMessage := DoMessage;
    OnMinimize := DoMinimize;
    OnRestore := DoRestore;
    OnShowHint := DoShowHint;
    OnShortCut := DoShortcut;
    OnSettingChange := DoSettingChange;
    OnModalBegin := DoModalBegin;
    OnModalEnd := DoModalEnd;
  end;
end;

    上面也可以看到有一个FAppEvents列表类,它应该就是生存所有的ApplicationEvents的列表,再看看ApplicationEvents的结构函数。

constructor TCustomApplicationEvents.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if Assigned(MultiCaster) then
    MultiCaster.AddAppEvent(Self);
end;

    每创建一个ApplicationEvents,它就将本身加进MultiCaster全局东西的列表中。