persist.inc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. {
  2. This file is part of the Free Component Library (FCL)
  3. Copyright (c) 1999-2000 by the Free Pascal development team
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. {****************************************************************************}
  11. {* TPersistent *}
  12. {****************************************************************************}
  13. procedure TPersistent.AssignError(Source: TPersistent);
  14. Var SourceName : String;
  15. begin
  16. If Source<>Nil then
  17. SourceName:=Source.ClassName
  18. else
  19. SourceName:='Nil';
  20. raise EConvertError.CreateFmt (SAssignError,[SourceName,ClassName]);
  21. end;
  22. procedure TPersistent.AssignTo(Dest: TPersistent);
  23. begin
  24. Dest.AssignError(Self);
  25. end;
  26. procedure TPersistent.DefineProperties(Filer: TFiler);
  27. begin
  28. end;
  29. function TPersistent.GetOwner: TPersistent;
  30. begin
  31. Result:=Nil;
  32. end;
  33. destructor TPersistent.Destroy;
  34. begin
  35. If Assigned(FObservers) then
  36. begin
  37. FPONotifyObservers(Self,ooFree,Nil);
  38. FreeAndNil(FObservers);
  39. end;
  40. inherited Destroy;
  41. end;
  42. procedure TPersistent.FPOAttachObserver(AObserver: TObject);
  43. Var
  44. I : IFPObserver;
  45. begin
  46. If Not AObserver.GetInterface(SGUIDObserver,I) then
  47. Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
  48. If not Assigned(FObservers) then
  49. FObservers:=TFPList.Create;
  50. FObservers.Add(AObserver);
  51. end;
  52. procedure TPersistent.FPODetachObserver(AObserver: TObject);
  53. Var
  54. I : IFPObserver;
  55. begin
  56. If Not AObserver.GetInterface(SGUIDObserver,I) then
  57. Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
  58. If Assigned(FObservers) then
  59. begin
  60. FObservers.Remove(AObserver);
  61. If (FObservers.Count=0) then
  62. FreeAndNil(FObservers);
  63. end;
  64. end;
  65. procedure TPersistent.FPONotifyObservers(ASender: TObject;
  66. AOperation: TFPObservedOperation; Data : Pointer);
  67. Var
  68. O : TObject;
  69. I : Integer;
  70. Obs : IFPObserver;
  71. begin
  72. If Assigned(FObservers) then
  73. For I:=FObservers.Count-1 downto 0 do
  74. begin
  75. O:=TObject(FObservers[i]);
  76. If O.GetInterface(SGUIDObserver,Obs) then
  77. Obs.FPOObservedChanged(Self,AOperation,Data);
  78. end;
  79. end;
  80. procedure TPersistent.Assign(Source: TPersistent);
  81. begin
  82. If Source<>Nil then
  83. Source.AssignTo(Self)
  84. else
  85. AssignError(Nil);
  86. end;
  87. function TPersistent.GetNamePath: string;
  88. Var OwnerName :String;
  89. TheOwner: TPersistent;
  90. begin
  91. Result:=ClassName;
  92. TheOwner:=GetOwner;
  93. If TheOwner<>Nil then
  94. begin
  95. OwnerName:=TheOwner.GetNamePath;
  96. If OwnerName<>'' then Result:=OwnerName+'.'+Result;
  97. end;
  98. end;
  99. {****************************************************************************}
  100. {* TInterfacedPersistent *}
  101. {****************************************************************************}
  102. procedure TInterfacedPersistent.AfterConstruction;
  103. Var TheOwner: TPersistent;
  104. begin
  105. inherited;
  106. TheOwner:=GetOwner;
  107. if assigned(TheOwner) then
  108. TheOwner.GetInterface(IUnknown,FOwnerInterface);
  109. end;
  110. function TInterfacedPersistent._AddRef: Integer;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  111. begin
  112. if assigned(FOwnerInterface) then
  113. Result:=FOwnerInterface._AddRef
  114. else
  115. Result:=-1;
  116. end;
  117. function TInterfacedPersistent._Release: Integer;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  118. begin
  119. if assigned(FOwnerInterface) then
  120. Result:=FOwnerInterface._Release
  121. else
  122. Result:=-1;
  123. end;
  124. function TInterfacedPersistent.QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} IID: TGUID; out Obj): HResult;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  125. begin
  126. if GetInterface(IID, Obj) then
  127. Result:=0
  128. else
  129. Result:=HResult($80004002);
  130. end;
  131. {****************************************************************************}
  132. {* TRecall *}
  133. {****************************************************************************}
  134. constructor TRecall.Create(AStorage,AReference: TPersistent);
  135. begin
  136. inherited Create;
  137. FStorage:=AStorage;
  138. FReference:=AReference;
  139. Store;
  140. end;
  141. destructor TRecall.Destroy;
  142. begin
  143. if Assigned(FReference) then
  144. FReference.Assign(FStorage);
  145. Forget;
  146. inherited;
  147. end;
  148. procedure TRecall.Forget;
  149. begin
  150. FReference:=nil;
  151. FreeAndNil(FStorage);
  152. end;
  153. procedure TRecall.Store;
  154. begin
  155. if Assigned(FStorage) and Assigned(FReference) then
  156. FStorage.Assign(FReference);
  157. end;