[fpc-pascal] TPersistent does not call IFPObserved.FPONotifyObservers

Dennis dec12 at avidsoft.com.hk
Fri Apr 22 11:51:17 CEST 2016


I have a class inheriting from Tpersistent:
type
   TCondition=class( TPersistent, ICondition)

var
   aCondition : TCondition;

  but surprisingly,  when I call
   aCondition.FPOAttachObserver(someobj);

I discovered that nothing was executed.
I used debugger to step through this line and nothing was executed.

As a result, when this aCondition is destroyed, it won't notify the 
observers.

I checked the source code  "persist.inc", it is indeed implemented!

procedure TPersistent.FPOAttachObserver(AObserver: TObject);
Var
    I : IFPObserver;

begin
    If Not AObserver.GetInterface(SGUIDObserver,I) then
      Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
    If not Assigned(FObservers) then
      FObservers:=TFPList.Create;
    FObservers.Add(I);
end;


What is wrong?  I am using FPC 3.1.1 trunk downloaded a few days ago.

 From the documentation, there is this line:

TPersistent implements the IFPObserved 
<http://www.freepascal.org/docs-html/rtl/classes/ifpobserved.html> 
interface for the benefit of descendent classes, but does not call 
IFPObserved.FPONotifyObservers 
<http://www.freepascal.org/docs-html/rtl/classes/ifpobserved.fponotifyobservers.html>. 
Descendents such as TStrings 
<http://www.freepascal.org/docs-html/rtl/classes/tstrings.html> and 
TCollection 
<http://www.freepascal.org/docs-html/rtl/classes/tcollection.html> and 
TCollectionItem 
<http://www.freepascal.org/docs-html/rtl/classes/tcollectionitem.html> 
do use it.



But the source code DOES CALL IFPObserved.FPONotifyObservers 
<http://www.freepascal.org/docs-html/rtl/classes/ifpobserved.fponotifyobservers.html>!

destructor TPersistent.Destroy;
begin
   If Assigned(FObservers) then
     begin
     FPONotifyObservers(Self,ooFree,Nil);
     FreeAndNil(FObservers);
     end;
   inherited Destroy;
end;

Why did the documentation say that?  Why was those code seemed not 
linked at all?  Some compiler options I messed up?

Dennis




More information about the fpc-pascal mailing list