Guest User

Untitled

a guest
Aug 9th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.00 KB | None | 0 0
  1. unit UNotifier;
  2.  
  3. interface
  4.  
  5. uses Classes, Dialogs, UMeta;
  6.  
  7. type
  8.  
  9.   TRefreshProc = procedure (ASign: string) of object;
  10.  
  11.   ArrayOfString = array of string;
  12.  
  13.   TSubscriber = record
  14.     Signs: ArrayOfString;
  15.     Obj: TObject;
  16.     Refresh: TRefreshProc;
  17.   end;
  18.  
  19.   TNotifier = class
  20.   private
  21.     Subs: array of TSubscriber;
  22.   public
  23.     procedure SendChanges(ASign: string);
  24.     procedure Subscribe(AObj: TObject; ASign: ArrayOfString; ARefresh: TRefreshProc);
  25.     procedure UnSubscribe(AObj: TObject);
  26.   end;
  27.  
  28.   function GetSigns(ANum: integer; SelfInclude: boolean): ArrayOfString;
  29.  
  30. var
  31.   Notif: TNotifier;
  32.  
  33. implementation
  34.  
  35. function GetSigns(ANum: integer; SelfInclude: boolean): ArrayOfString;
  36. var
  37.   i: Integer;
  38. begin
  39.   if SelfInclude then begin
  40.     SetLength(result, Length(result) + 1);
  41.     result[High(result)] := Meta.FTables[ANum].Name;
  42.   end;
  43.   with Meta.FTables[ANum] do
  44.   for i := 0 to High(TableFields) do
  45.     if TableFields[i].RefTable > -1 then begin
  46.       SetLength(result, Length(result) + 1);
  47.       result[High(result)] := Meta.FTables[TableFields[i].RefTable].Name;
  48.     end;
  49. end;
  50.  
  51. { TNotifier }
  52.  
  53. procedure TNotifier.SendChanges(ASign: string);
  54. var
  55.   i, j: Integer;
  56. begin
  57.   for i := 0 to High(Subs) do
  58.     for j := 0 to High(Subs[i].Signs) do
  59.       if Subs[i].Signs[j] = ASign then
  60.         Subs[i].Refresh(ASign);
  61. end;
  62.  
  63. procedure TNotifier.Subscribe(AObj: TObject; ASign: ArrayOfString; ARefresh: TRefreshProc);
  64. var NewSub: TSubscriber;
  65. begin
  66.   NewSub.Signs := ASign;
  67.   NewSub.Obj := AObj;
  68.   NewSub.Refresh := ARefresh;
  69.   SetLength(Subs, Length(Subs)+1);
  70.   Subs[High(Subs)] := NewSub;
  71. end;
  72.  
  73. procedure TNotifier.UnSubscribe(AObj: TObject);
  74. var
  75.   i, Index: Integer;
  76. begin
  77.   Index := 0;
  78.   for i := 0 to High(Subs) do
  79.     if Subs[i].Obj = AObj then begin
  80.       Index := i;
  81.       break;
  82.     end;
  83.   for i := Index to High(Subs)-1 do
  84.     Subs[i] := Subs[i+1];
  85.   SetLength(Subs, Length(Subs)-1);
  86. end;
  87.  
  88. initialization
  89.  
  90. Notif := TNotifier.Create;
  91.  
  92. end.
Add Comment
Please, Sign In to add comment