Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit UNotifier;
- interface
- uses Classes, Dialogs, UMeta;
- type
- TRefreshProc = procedure (ASign: string) of object;
- ArrayOfString = array of string;
- TSubscriber = record
- Signs: ArrayOfString;
- Obj: TObject;
- Refresh: TRefreshProc;
- end;
- TNotifier = class
- private
- Subs: array of TSubscriber;
- public
- procedure SendChanges(ASign: string);
- procedure Subscribe(AObj: TObject; ASign: ArrayOfString; ARefresh: TRefreshProc);
- procedure UnSubscribe(AObj: TObject);
- end;
- function GetSigns(ANum: integer; SelfInclude: boolean): ArrayOfString;
- var
- Notif: TNotifier;
- implementation
- function GetSigns(ANum: integer; SelfInclude: boolean): ArrayOfString;
- var
- i: Integer;
- begin
- if SelfInclude then begin
- SetLength(result, Length(result) + 1);
- result[High(result)] := Meta.FTables[ANum].Name;
- end;
- with Meta.FTables[ANum] do
- for i := 0 to High(TableFields) do
- if TableFields[i].RefTable > -1 then begin
- SetLength(result, Length(result) + 1);
- result[High(result)] := Meta.FTables[TableFields[i].RefTable].Name;
- end;
- end;
- { TNotifier }
- procedure TNotifier.SendChanges(ASign: string);
- var
- i, j: Integer;
- begin
- for i := 0 to High(Subs) do
- for j := 0 to High(Subs[i].Signs) do
- if Subs[i].Signs[j] = ASign then
- Subs[i].Refresh(ASign);
- end;
- procedure TNotifier.Subscribe(AObj: TObject; ASign: ArrayOfString; ARefresh: TRefreshProc);
- var NewSub: TSubscriber;
- begin
- NewSub.Signs := ASign;
- NewSub.Obj := AObj;
- NewSub.Refresh := ARefresh;
- SetLength(Subs, Length(Subs)+1);
- Subs[High(Subs)] := NewSub;
- end;
- procedure TNotifier.UnSubscribe(AObj: TObject);
- var
- i, Index: Integer;
- begin
- Index := 0;
- for i := 0 to High(Subs) do
- if Subs[i].Obj = AObj then begin
- Index := i;
- break;
- end;
- for i := Index to High(Subs)-1 do
- Subs[i] := Subs[i+1];
- SetLength(Subs, Length(Subs)-1);
- end;
- initialization
- Notif := TNotifier.Create;
- end.
Add Comment
Please, Sign In to add comment