dobserver.pp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. { This demo is very basic, but shows the Observer support in the RTL }
  2. program dobserver;
  3. {$mode objfpc}{$h+}
  4. {$ifdef mswindows}{$apptype console}{$endif}
  5. uses
  6. Classes, SysUtils, typinfo;
  7. type
  8. TMyObserver = class(TObject, IFPObserver)
  9. private
  10. procedure FPOObservedChanged(ASender : TObject; Operation : TFPObservedOperation; Data : Pointer);
  11. end;
  12. { TMyObserver }
  13. procedure TMyObserver.FPOObservedChanged(ASender: TObject;
  14. Operation: TFPObservedOperation; Data: Pointer);
  15. function OperationToString(AOperation: TFPObservedOperation): string;
  16. begin
  17. result := GetEnumName(TypeInfo(TFPObservedOperation),
  18. Ord(AOperation));
  19. end;
  20. var
  21. intf: IFPObserved;
  22. begin
  23. if Operation = ooFree then
  24. begin
  25. writeln('[ooFree] detected so we should detach ourselves');
  26. if Supports(ASender, IFPObserved, intf) then
  27. intf.FPODetachObserver(self);
  28. end
  29. else
  30. begin
  31. writeln(ASender.ClassName + ' has changed ['+
  32. OperationToString(Operation) + ']');
  33. end;
  34. end;
  35. var
  36. sl: TStringList;
  37. observer: TMyObserver;
  38. intf: IFPObserved;
  39. begin
  40. { This stringlist will be the subject (observed) }
  41. sl := TStringList.Create;
  42. { this instance will be the observer - notified when StringList changes }
  43. observer := TMyObserver.Create;
  44. { attach observer }
  45. if Supports(sl, IFPObserved, intf) then
  46. begin
  47. intf.FPOAttachObserver(observer);
  48. end;
  49. { Do something to the stringlist }
  50. sl.Add('Item one');
  51. sl.Add('Item two');
  52. sl.Delete(0);
  53. { Clean-up code - also shows ooFree operation }
  54. sl.Free;
  55. observer.Free;
  56. end.