12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- { This demo is very basic, but shows the Observer support in the RTL }
- program dobserver;
- {$mode objfpc}{$h+}
- {$ifdef mswindows}{$apptype console}{$endif}
- uses
- Classes, SysUtils, typinfo;
- type
- TMyObserver = class(TObject, IFPObserver)
- private
- procedure FPOObservedChanged(ASender : TObject; Operation : TFPObservedOperation; Data : Pointer);
- end;
-
- { TMyObserver }
- procedure TMyObserver.FPOObservedChanged(ASender: TObject;
- Operation: TFPObservedOperation; Data: Pointer);
- function OperationToString(AOperation: TFPObservedOperation): string;
- begin
- result := GetEnumName(TypeInfo(TFPObservedOperation),
- Ord(AOperation));
- end;
- var
- intf: IFPObserved;
- begin
- if Operation = ooFree then
- begin
- writeln('[ooFree] detected so we should detach ourselves');
- if Supports(ASender, IFPObserved, intf) then
- intf.FPODetachObserver(self);
- end
- else
- begin
- writeln(ASender.ClassName + ' has changed ['+
- OperationToString(Operation) + ']');
- end;
- end;
-
- var
- sl: TStringList;
- observer: TMyObserver;
- intf: IFPObserved;
- begin
- { This stringlist will be the subject (observed) }
- sl := TStringList.Create;
- { this instance will be the observer - notified when StringList changes }
- observer := TMyObserver.Create;
- { attach observer }
- if Supports(sl, IFPObserved, intf) then
- begin
- intf.FPOAttachObserver(observer);
- end;
-
- { Do something to the stringlist }
- sl.Add('Item one');
- sl.Add('Item two');
- sl.Delete(0);
-
- { Clean-up code - also shows ooFree operation }
- sl.Free;
- observer.Free;
- end.
|