* Applied and expanded patch from Luiz Americo to implement faster notifyobservers (bug ID 23419)

git-svn-id: trunk@23089 -
This commit is contained in:
michael 2012-12-02 11:14:49 +00:00
parent e3b48d6eb2
commit 66553a253e
2 changed files with 8 additions and 12 deletions

View File

@ -667,7 +667,7 @@ begin
Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
If not Assigned(FObservers) then
FObservers:=TFPList.Create;
FObservers.Add(AObserver);
FObservers.Add(I);
end;
procedure TList.FPODetachObserver(AObserver: TObject);
@ -679,7 +679,7 @@ begin
Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
If Assigned(FObservers) then
begin
FObservers.Remove(AObserver);
FObservers.Remove(I);
If (FObservers.Count=0) then
FreeAndNil(FObservers);
end;
@ -689,7 +689,6 @@ procedure TList.FPONotifyObservers(ASender: TObject;
AOperation: TFPObservedOperation; Data : Pointer);
Var
O : TObject;
I : Integer;
Obs : IFPObserver;
@ -697,9 +696,8 @@ begin
If Assigned(FObservers) then
For I:=FObservers.Count-1 downto 0 do
begin
O:=TObject(FObservers[i]);
If O.GetInterface(SGUIDObserver,Obs) then
Obs.FPOObservedChanged(Self,AOperation,Data);
Obs:=IFPObserver(FObservers[i]);
Obs.FPOObservedChanged(ASender,AOperation,Data);
end;
end;

View File

@ -68,7 +68,7 @@ begin
Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
If not Assigned(FObservers) then
FObservers:=TFPList.Create;
FObservers.Add(AObserver);
FObservers.Add(I);
end;
procedure TPersistent.FPODetachObserver(AObserver: TObject);
@ -80,7 +80,7 @@ begin
Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
If Assigned(FObservers) then
begin
FObservers.Remove(AObserver);
FObservers.Remove(I);
If (FObservers.Count=0) then
FreeAndNil(FObservers);
end;
@ -89,7 +89,6 @@ end;
procedure TPersistent.FPONotifyObservers(ASender: TObject;
AOperation: TFPObservedOperation; Data : Pointer);
Var
O : TObject;
I : Integer;
Obs : IFPObserver;
@ -97,9 +96,8 @@ begin
If Assigned(FObservers) then
For I:=FObservers.Count-1 downto 0 do
begin
O:=TObject(FObservers[i]);
If O.GetInterface(SGUIDObserver,Obs) then
Obs.FPOObservedChanged(ASender,AOperation,Data);
Obs:=IFPObserver(FObservers[i]);
Obs.FPOObservedChanged(Self,AOperation,Data);
end;
end;