anchor.diff:      function    DataAndPropertyValid(const AData: TtiObject): Boolean;
     public
       constructor Create; override;
  -    constructor CreateCustom(AModel: TtiObjectList; AView: TfpgListView; ADisplayNames: string; IsObserving: Boolean = True);
  +    constructor CreateCustom(AModel: TtiObjectList; AView: TfpgListView; ADisplayNames: string; IsObserving: Boolean = True); overload;
  +    constructor CreateCustom(AModel: TtiObjectList; AView: TfpgListView;
  +      AOnBeforeSetupField: TOnBeforeSetupField; ADisplayNames: string; IsObserving: Boolean = True); overload;
       procedure   BeforeDestruction; override;
       procedure   Update(ASubject: TtiObject); override;
       { Called from the GUI to trigger events }
       procedure   HandleSelectionChanged; virtual;
  +    { Event handler to allow formatting of fields before they are written. }
  +    property    OnBeforeSetupField: TOnBeforeSetupField read FOnBeforeSetupField write SetOnBeforeSetupField;
     published
       property    View: TfpgListView read FView;
       property    Model: TtiObjectList read FModel;
  
positive.code:     else
        lColumnTotalWidth := lColumnTotalWidth + FView.ColumnWidth[i] + 20;
    end;
    for i := 0 to FModel.Count-1 do
    begin
      if not FModel.Items[i].Deleted or FShowDeleted then
  
negative.code:   { Composite mediator for TfpgStringGrid }
    TCompositeStringGridMediator = class(TtiObject)
    private
      function    GetSelectedObjected: TtiObject;
      procedure   SetSelectedObject(const AValue: TtiObject);
      procedure   SetShowDeleted(const AValue: Boolean);
      procedure   DoCreateItemMediator(AData: TtiObject); overload;
      procedure   DoCreateItemMediator(AData: TtiObject; pRowIdx : Integer); overload;
    protected
      FDisplayNames: string;
      FIsObserving: boolean;
      FShowDeleted: Boolean;
      FView: TfpgStringGrid;
      FModel: TtiObjectList;
      FMediatorList: TObjectList;
  