Em 28/8/2012 09:15, michael.vancann...@wisa.be escreveu:


On Tue, 28 Aug 2012, Luiz Americo Pereira Camara wrote:


Why not let TFPObservedOperation as integer and define constants.

It could define a constant like ooUser = 32
Below ooUser is reserved for future default constants
Above ooUser could be added custom messages
This is how LCL messages works

Exactly because it is not meant as a general messaging interface, and I want the interface to reflect this.

There is a clear intended use case: Mainly notification of changes.

This is the purpose i intend to use (replace my implementation). Basically is a tree structure that needs to be observed. To avoid performance problems like having to parse all the tree when a change occurs i defined actions when a Child is added, deleted or inserted.

To be clear what i would need to do with the current approach:

const
  ChildAdded = 1;

type
  TMyNotifyInfo = record
     NType: Integer;
     NData: Pointer;
  end;
  PMyNotifyInfo = ^TMyNotifyInfo;

//notify

procedure TMyObserved.Changed;
var
  R: TMyNotifyInfo;
begin
  R.NType := ChildAdded;
  R.NData := ChildItemObject;
  FPONotifyObservers(Self,ooCustom,@R);
end;

//observe
procedure TMyObserver.FPOObservedChanged(ASender : TObject; Operation : TFPObservedOperation; Data : Pointer);
var
  R: PMyNotifyInfo;
begin
  if Operation = ooCustom then
  begin
     R := PMyNotifyInfo(Data);
     if R^.Ntype = ChildAdded then
        DoChildAdd(R^.NData);
  end;
end;

compare with my proposed solution of defining the type as integer:

const
  ooChildAdded = ooUser + 1;

//notify

procedure TMyObserved.Changed;
begin
  FPONotifyObservers(Self, ooChildAdded, ChildItemObject);
end;

//observe
procedure TMyObserver.FPOObservedChanged(ASender : TObject; Operation : TFPObservedOperation; Data : Pointer);
begin
  if Operation = ooChildAdded then
  begin
        DoChildAdd(Data);
  end;
end;

Simpler, less code, less memory use, extensible.

All that with just changing the TFPObservedOperation to a Integer or word type

IMO such feature at a low level class should be usable in the most use cases, otherwise it will have a half observer support.

My proposition does not increase complexity of the code, nor any type of overhead with the above gains.

Can you point the drawbacks?

Luiz
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to