MMObsrv.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 06.03.98 - 05:57:28 $                                        =}
  24. {========================================================================}
  25. unit MMObsrv;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.     Classes;
  30. type
  31.     TMMObsNotifyEvent   = procedure(Sender: TObject; Data: TObject) of object;
  32.     TMMObservable       = class;
  33.     {-- TMMObserver -----------------------------------------------------}
  34.     TMMObserver = class(TObject)
  35.     private
  36.        FObservable: TMMObservable;
  37.        FLocked    : Integer;
  38.        FOnNotify  : TMMObsNotifyEvent;
  39.     protected
  40.        procedure Notify(Data: TObject); virtual;
  41.        procedure DoNotify(Data: TObject);
  42.        function  GetLocked: Boolean;
  43.    public
  44.        destructor Destroy; override;
  45.        procedure Lock;
  46.        procedure UnLock;
  47.        property OnNotify: TMMObsNotifyEvent read FOnNotify write FOnNotify;
  48.        property Locked: Boolean read GetLocked;
  49.     end;
  50.     {-- TMMObservable -------------------------------------------------------}
  51.     TMMObservable = class(TObject)
  52.     private
  53.        FObservers: TList;
  54.        FLock     : Integer;
  55.     public
  56.        constructor Create;
  57.        destructor  Destroy; override;
  58.        procedure Lock;
  59.        procedure Unlock;
  60.        function  LockCount: Integer;
  61.        procedure NotifyObservers(Data: TObject);
  62.        procedure AddObserver(O: TMMObserver);
  63.        procedure RemoveObserver(O: TMMObserver);
  64.     end;
  65. {========================================================================}
  66. implementation
  67. {========================================================================}
  68. {== TMMObserver =========================================================}
  69. destructor  TMMObserver.Destroy;
  70. begin
  71.    if (FObservable <> nil) then
  72.       FObservable.RemoveObserver(Self);
  73.    inherited Destroy;
  74. end;
  75. {-- TMMObserver ---------------------------------------------------------}
  76. procedure TMMObserver.DoNotify(Data: TObject);
  77. begin
  78.    if Assigned(FOnNotify) then FOnNotify(Self, Data);
  79. end;
  80. {-- TMMObserver ---------------------------------------------------------}
  81. procedure TMMObserver.Notify(Data: TObject);
  82. begin
  83.    if FLocked = 0 then DoNotify(Data);
  84. end;
  85. {-- TMMObserver ---------------------------------------------------------}
  86. procedure TMMObserver.Lock;
  87. begin
  88.    Inc(FLocked);
  89. end;
  90. {-- TMMObserver ---------------------------------------------------------}
  91. procedure TMMObserver.UnLock;
  92. begin
  93.    Dec(FLocked);
  94. end;
  95. {-- TMMObserver ---------------------------------------------------------}
  96. function TMMObserver.GetLocked: Boolean;
  97. begin
  98.    Result := FLocked <> 0;
  99. end;
  100. {== TMMObservable =======================================================}
  101. constructor TMMObservable.Create;
  102. begin
  103.    inherited Create;
  104.    FObservers := TList.Create;
  105. end;
  106. {-- TMMObservable -------------------------------------------------------}
  107. destructor TMMObservable.Destroy;
  108. begin
  109.    if FObservers <> nil then
  110.    begin
  111.       while FObservers.Count > 0 do
  112.             RemoveObserver(TMMObserver(FObservers.Last));
  113.       FObservers.Free;
  114.    end;
  115.    inherited Destroy;
  116. end;
  117. {-- TMMObservable -------------------------------------------------------}
  118. procedure TMMObservable.NotifyObservers(Data: TObject);
  119. var
  120.     i: Integer;
  121. begin
  122.    if (FObservers = nil) or (FLock <> 0) then Exit;
  123.    for i:= FObservers.Count - 1 downto 0 do
  124.        TMMObserver(FObservers[i]).Notify(Data);
  125. end;
  126. {-- TMMObservable -------------------------------------------------------}
  127. procedure TMMObservable.AddObserver(O: TMMObserver);
  128. begin
  129.    if (O = nil) or (FObservers = nil) then
  130.       Exit;
  131.    if O.FObservable <> nil then
  132.       O.FObservable.RemoveObserver(O);
  133.    O.FObservable:= nil;
  134.    FObservers.Add(O);
  135.    O.FObservable:= Self;
  136. end;
  137. {-- TMMObservable -------------------------------------------------------}
  138. procedure TMMObservable.RemoveObserver(O: TMMObserver);
  139. begin
  140.    if (O = nil) or (O.FObservable <> Self) or (FObservers = nil) then
  141.        Exit;
  142.    FObservers.Remove(O);
  143.    O.FObservable:= nil;
  144. end;
  145. {-- TMMObservable -------------------------------------------------------}
  146. procedure TMMObservable.Lock;
  147. begin
  148.    Inc(FLock);
  149. end;
  150. {-- TMMObservable -------------------------------------------------------}
  151. procedure TMMObservable.Unlock;
  152. begin
  153.    Dec(FLock);
  154. end;
  155. {-- TMMObservable -------------------------------------------------------}
  156. function TMMObservable.LockCount: Integer;
  157. begin
  158.    Result := FLock;
  159. end;
  160. end.