青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Chip Studio

常用鏈接

統(tǒng)計

最新評論

Delphi 7事件的多處理機制

Delphi 7事件的多處理機制
Allen Tao
2007-08-19

  首先解釋一下這個題目。在我使用Delphi 7的過程中發(fā)現(xiàn),一個對象的事件只能被一個過程處理。如果多次給這個對象的事件賦給處理事件的過程,最后真正處理事件的將是最后賦值的那個過程。例如,有 類TMyClass中定義了一個事件OnSomeFired,在類TClientClass中該類被實例化,它的事件被處理。如下所示:
constructor TClientClass.Create;
var
  myObj: TMyClass;
begin
  //…
  myObj:= TMyClass.Create;
  myObj.OnSomeFired:= SomeFired1;
  myObj.OnSomeFired:= SomeFired2;
  這里的SomeFired1與SomeFired2都是TClientClass中定義的處理過程。其最終的結果是當OnSomeFired事件發(fā)生時,只有SomeFired2被調用。
  但在編程的實際中,往往需要一個事件被多個方法所處理。為此,我參考了一些對這個問題的解決辦法,總結得出了一個自己的方法,稱為事件的多處理機制。

原理
  Delphi 7中的事件本質上是一種過程指針。但事件類型在定義時要比一般過程指針在最后多一個“of object”,如常用的TNotifyEvent的定義是:
TNotifyEvent = procedure(Sender: TObject) of object;
因此,給一個事件屬性賦值,也就是給一個類的過程指針類型的成員變量賦值,當然是最后一次的賦值才有效。要想多次賦值有效就必須有一個數(shù)據(jù)結構把每次賦 值賦給的過程指針變量都記錄下來,最合適的數(shù)據(jù)結構當然是列表TList。但如果在每一個有事件的類中都加一個記錄事件賦值的列表對象,自然是不方便的, 而且使用這個列表的代碼在不同類中也差不多,應該抽取出來形成一個類。這個類就是事件多處理機制的核心內容。

做法
  要記錄事件處理過程,就需要將過程指 針變量放入列表對象中。但列表對象只能添加指針類型對象(也就是引用類型),而過程指針變量是指類型變量,不能直接添加。這就需要有一個類對過程指針變量 進行包裝,轉化為指針類型對象。于是,先要定義包裝類TCallMethod,如下所示:
TCallMethod = class
  private
    _callback: TMethod;
  public
    property Callback: TMethod read _callback write _callback;
  end;
  這里的TMethod是Delphi預定義的記錄類型,任何過程指針變量都可以強制轉化為這種類型。之后,再定義記錄處理過程的類,如下所示:
  TEventObject = class
  private
    callList: TList;
    function GetItem(i: Integer): TMethod;
    function GetCount: Integer;
  public
    constructor Create;

    procedure Add(p: TMethod);
    procedure Remove(p: TMethod);

    property Count: Integer read GetCount;
    property Items[i: Integer]: TMethod read GetItem;  default;
  end;
  下面是實現(xiàn)部分:
constructor TEventObject.Create;
begin
  callList:= TList.Create;
end;

procedure TEventObject.Add(p: TMethod);
var
  a: TCallMethod;
begin
  a:= TCallMethod.Create;
  a.Callback:= p;
  callList.Add(a);
end;

procedure TEventObject.Remove(p: TMethod);
var
  i: Integer;
begin
  for i:= 0 to GetCount - 1 do
    if (TCallMethod(callList[i]).Callback.Code = p.Code) and
      (TCallMethod(callList[i]).Callback.Data = p.Data) then
      callList.Delete(i);
end;

function TEventObject.GetCount: Integer;
begin
  Result:= callList.Count;
end;

function TEventObject.GetItem(i: Integer): TMethod;
var
  a: TCallMethod;
begin
  a:= TCallMethod(callList[i]);
  Result:= a.Callback;
end;
  從上面的代碼可以看到,TEventObject的目的是包裝TList對象,屏蔽了TList類的大多數(shù)方法,只對外暴露了2個過程、1個屬性與1個索引,分別用于添加、刪除處理事件過程、獲得過程個數(shù)及通過序號檢索記錄的過程變量。

使用
  使用時,在需要使用事件的類中將事件的類型由過程指針改為TEventObject,即可使該事件擁有多處理的能力。如下面代碼所示:
  TMyClass=class
  private
    someFired: TEventObject;
  public
    constructor Create;
    procedure DoSth;
    property OnSomeFired: TEventObject read someFired write someFired; // 多處理事件
  end;
  以下是實現(xiàn)代碼:
constructor TMyClass.Create;
begin
  Self.someFired:= TEventObject.Create;
end;

procedure TMyClass.DoSth;
var
  i: Integer;
  method: TNotifyEvent;
begin
  if someFired.Count > 0 then
    for i:= 0  to someFired.Count - 1 do
    begin
      method:= TNotifyEvent(someFired[i]); // 在該類中事件的真正類型是TNotifyEvent,因此在觸發(fā)事件時先要轉成這種類型的過程指針后再進行調用
      method(Self);
    end;
end;
  定義了一個包含多處理事件的類后,再看看這種類如果在其客戶類中被調用。如以下代碼:
{類TClientClass中}
var
  myObj: TMyClass;
  //…
  myObj:= TMyClass.Create;
  myObj.OnSomeFired.Add(SomeFired1);
  myObj.OnSomeFired.Add(SomeFired2);
  當客戶類代碼中調用TMyClass的DoSth方法時,事件將被觸發(fā),而2個處理過程SomeFired1與SomeFired2則會依次調用,實現(xiàn)多處理的目的。

再發(fā)展一步
  上面的TEventObject 類可以實現(xiàn)事件多處理的目的,但它對加入其中的過程指針類型沒有檢查,這是一個隱患。因此可以針對每一種事件要求的過程指針類型從 TEventObject繼承一個類,實現(xiàn)類型檢查。如要求事件的類型是TNotifyEvent,就可以繼承一個TNotifyEventObject 類,如下面代碼:
  TNotifyEventObject = class(TEventObject)
  public
    procedure Add(p: TNotifyEvent); overload;
    procedure Remove(p: TNotifyEvent); overload;
  end;
  以下是實現(xiàn)部分:
procedure TNotifyEventObject.Add(p: TNotifyEvent);
begin
  inherited Add(TMethod(p));
end;

procedure TNotifyEventObject.Remove(p: TNotifyEvent);
begin
  inherited Remove(TMethod(p));
end;
  在這個類中重載了添加與移除方法,可以有效地對過程指針類型進行檢查。


posted on 2008-02-07 03:06 MyChip 閱讀(422) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            性色av一区二区三区| 久久精品国产69国产精品亚洲| 中文一区二区| 午夜国产一区| 国产美女精品视频| 久久国内精品自在自线400部| 久久精品国产一区二区三区免费看| 欧美日韩国产高清| 亚洲欧美网站| 狂野欧美激情性xxxx| 亚洲高清自拍| 欧美日韩精品三区| 欧美一区二区三区视频免费播放| 久久夜色精品国产欧美乱极品| 伊人伊人伊人久久| 欧美三区免费完整视频在线观看| 香蕉久久国产| 国产伦精品一区二区三区免费| 午夜亚洲一区| 欧美激情在线免费观看| 亚洲一区在线看| 怡红院精品视频| 欧美日韩一区二区在线观看视频 | 国产专区综合网| 欧美极品一区二区三区| 亚洲天堂偷拍| 欧美激情第六页| 久久精品日韩欧美| 在线一区二区三区四区五区| 国产一区二区三区高清| 欧美日韩久久不卡| 久久久一二三| 欧美影院久久久| 亚洲一区免费在线观看| 亚洲欧洲日本一区二区三区| 午夜精品理论片| 日韩亚洲欧美中文三级| 狠狠噜噜久久| 国产主播一区二区三区| 国产精品va在线| 欧美日韩高清不卡| 老色鬼久久亚洲一区二区| 欧美一区二区在线看| 99热精品在线| 亚洲一级片在线看| 亚洲福利电影| 久久免费偷拍视频| 亚洲自拍偷拍一区| 日韩一级在线| 99av国产精品欲麻豆| 在线国产精品播放| 国内外成人在线| 国产在线乱码一区二区三区| 国产精品视频yy9099| 欧美午夜精品久久久| 欧美日韩天天操| 欧美视频在线观看免费网址| 欧美日韩国产色站一区二区三区| 老司机午夜免费精品视频| 久久人人爽人人爽| 久久看片网站| 欧美凹凸一区二区三区视频| 免费欧美在线| 欧美久久久久久久久久| 欧美日韩午夜| 国产欧美一区二区精品性| 国产亚洲精品7777| 国产一区二区主播在线| 黄色小说综合网站| 亚洲国产精品久久久久婷婷884 | 欧美高清影院| 欧美日韩一级大片网址| 欧美日韩在线三级| 国产精品你懂的在线欣赏| 国产日韩欧美二区| 在线观看国产成人av片| 亚洲国产乱码最新视频| 亚洲最快最全在线视频| 亚洲欧美精品一区| 久久久视频精品| 亚洲福利久久| 亚洲综合好骚| 久久久久欧美| 欧美日韩一区二区视频在线观看| 国产乱码精品一区二区三区不卡| 狠狠色综合色综合网络| 洋洋av久久久久久久一区| 午夜精品久久久久久久蜜桃app| 久久久久网站| 亚洲人成在线观看| 欧美一区二区三区啪啪| 欧美成人精品h版在线观看| 国产精品久久久久aaaa| 在线观看91精品国产入口| 一区二区三区 在线观看视| 欧美中文字幕在线视频| 亚洲国产高清aⅴ视频| 亚洲国产成人高清精品| 国内久久婷婷综合| 亚洲电影观看| 午夜天堂精品久久久久| 欧美ab在线视频| 亚洲视频精选在线| 美日韩在线观看| 国产亚洲日本欧美韩国| 一区二区三区欧美成人| 美女国内精品自产拍在线播放| 中文亚洲字幕| 欧美激情小视频| 精品成人免费| 亚洲欧美精品在线观看| 亚洲精品免费在线播放| 久久影音先锋| 国产一区二区三区丝袜| 亚洲欧美精品suv| 亚洲精品视频在线播放| 久久婷婷国产综合精品青草| 国产精品永久免费在线| 亚洲小说欧美另类婷婷| 亚洲欧洲免费视频| 噜噜噜久久亚洲精品国产品小说| 国产欧美日本一区二区三区| 亚洲一区二区免费看| 亚洲激情在线激情| 欧美国产在线观看| 亚洲国产毛片完整版| 久热精品在线视频| 欧美一区二区在线免费播放| 国产精品自拍三区| 午夜在线一区二区| 亚洲欧美另类中文字幕| 国产精品中文在线| 性色av一区二区怡红| 亚洲夜间福利| 国产私拍一区| 玖玖国产精品视频| 久久蜜桃香蕉精品一区二区三区| 国产主播精品在线| 欧美77777| 欧美另类一区二区三区| 宅男噜噜噜66一区二区| av成人天堂| 国产精品高清一区二区三区| 西西人体一区二区| 欧美在线视频日韩| 18成人免费观看视频| 欧美激情按摩在线| 欧美日韩一区二区三区在线看| 在线视频精品一| 一区二区三区导航| 国产日韩欧美一区| 美日韩精品免费| 欧美精品午夜| 欧美在线高清视频| 久久综合久久综合久久| 亚洲美女免费精品视频在线观看| 一本色道久久99精品综合 | 亚洲一二区在线| 国产精品久99| 久久乐国产精品| 欧美高清在线视频观看不卡| 日韩视频免费看| 亚洲一本视频| 在线观看一区二区精品视频| 亚洲精品视频在线观看网站| 国产精品久久看| 蜜臀久久99精品久久久画质超高清| 欧美电影免费观看高清| 销魂美女一区二区三区视频在线| 久久精品欧美日韩| 日韩视频在线观看免费| 香港久久久电影| 一区二区精品在线| 欧美影院在线| 一区二区国产精品| 欧美在线视频网站| 中文在线资源观看网站视频免费不卡| 欧美专区在线| 亚洲欧美日韩一区二区| 欧美高清视频在线| 久久频这里精品99香蕉| 欧美日韩亚洲国产精品| 美国十次成人| 国产一区二区欧美| 国产精品99久久久久久久女警 | 亚洲电影在线| 亚洲——在线| 一区二区三区久久精品| 久久影院午夜论| 久久精品亚洲| 国产精品美女久久福利网站| 亚洲精品美女久久久久| 亚洲大片免费看| 久久国产黑丝| 久久国产精品久久国产精品| 欧美三区视频| 亚洲免费精品| 一本色道久久综合亚洲91| 欧美福利影院| 亚洲二区视频在线|