unit interposer_class;

interface

uses
 Vcl.Forms, Vcl.Controls, CommCtrl, Messages, sPanel, sEdit, sPageControl, System.Classes, AdvCGrid, Uni, pixel_classes;

{$TYPEINFO ON}

type
 TForm = class(Vcl.Forms.TForm)
  protected
   procedure CreateParams(var Params: TCreateParams); override;
  public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 end;

 TsPanel = class(sPanel.TsPanel)
  protected
   procedure CreateParams(var Params: TCreateParams); override;
 end;

 TsEdit = class(sEdit.TsEdit)
  protected
   procedure CreateParams(var Params: TCreateParams); override;
 end;

 TsPageControl = class(sPageControl.TsPageControl)
  protected
   procedure CreateParams(var Params: TCreateParams); override;
  private
   procedure TCMAdjustRect(var Msg: TMessage); message TCM_ADJUSTRECT;
 end;

 TAdvColumnGrid = class(AdvCGrid.TAdvColumnGrid)
  private
   FByPassAF: TArray<Boolean>;
   function GetCellz(ACol, ARow: Integer): TZString;
   procedure SetCellz(ACol, ARow: Integer; const Value: TZString);
   function GetBypassAF(ACol: Integer): Boolean;
   procedure SetBypassAF(ACol: Integer; const Value: Boolean);
  protected
   procedure CreateParams(var Params: TCreateParams); override;
  public
   property Cellz[ACol, ARow: Integer]: TZString read GetCellz write SetCellz;
   property BypassAutoFit[ACol: Integer]: Boolean read GetBypassAF write SetBypassAF;
  published
   function CriaLinhaObjeto(MyObject: TObject): Integer;
   function CriaLinha: Integer;
   function GetColumnIndexByName(const nome: string): Integer;
   procedure SetBasicColumnConfig;
 end;

implementation

uses
 pixel_utils, System.Math, System.Types, Windows, System.SysUtils, TypInfo, Generics.Collections, Data.DB, Vcl.Graphics, ComCtrls, Vcl.Grids;

procedure TForm.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 StrPCopy(Params.WinClassName, 'ZPro');
end;

constructor TForm.Create(AOwner: TComponent);
begin
 inherited;
end;

destructor TForm.Destroy;
begin
 inherited;
end;

procedure TsPanel.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 StrPCopy(Params.WinClassName, 'Painel');
end;

procedure TsEdit.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 StrPCopy(Params.WinClassName, 'Editor');
end;

procedure TsPageControl.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 StrPCopy(Params.WinClassName, 'PagCtrl');
end;

procedure TsPageControl.TCMAdjustRect(var Msg: TMessage);
begin
 inherited;
 case TabPosition of
  tpTop:
   begin
    PRect(Msg.LParam)^.Left:= 0;
    PRect(Msg.LParam)^.Right:= ClientWidth;
    PRect(Msg.LParam)^.Bottom:= ClientHeight;

    { // exemplo abaixo acertaria nas 4 direções:
      PRect(Msg.LParam)^.Left := 0;
      PRect(Msg.LParam)^.Right := PageControl1.ClientWidth;
      Dec(PRect(Msg.LParam)^.Top, 4);
      PRect(Msg.LParam)^.Bottom := PageControl1.ClientHeight;
    }
   end;
 end;
end;

procedure TAdvColumnGrid.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 StrPCopy(Params.WinClassName, 'Grid');
end;

function TAdvColumnGrid.GetCellz(ACol, ARow: Integer): TZString;
begin
 Result:= Self.Cells[ACol, ARow];
end;

procedure TAdvColumnGrid.SetCellz(ACol, ARow: Integer; const Value: TZString);
begin
 Self.Cells[ACol, ARow]:= string(Value);
end;

function TAdvColumnGrid.GetBypassAF(ACol: Integer): Boolean;
begin
 Result:= FByPassAF[ACol];
end;

procedure TAdvColumnGrid.SetBypassAF(ACol: Integer; const Value: Boolean);
begin
 if Length(FByPassAF) < ACol + 1 then SetLength(FByPassAF, ACol + 1);
 FByPassAF[ACol]:= Value;
end;

function TAdvColumnGrid.CriaLinha: Integer;
begin
 Self.RowCount:= Self.RowCount + 1;
 Self.ClearRows(Self.RowCount - 1, 1);
 Result:= Self.RowCount - 1;
end;

function TAdvColumnGrid.CriaLinhaObjeto(MyObject: TObject): Integer;
begin
 Self.RowCount:= Self.RowCount + 1;
 Self.ClearRows(Self.RowCount - 1, 1);
 Self.Objects[0, Self.RowCount - 1]:= MyObject;
 Result:= Self.RowCount - 1;
end;

function TAdvColumnGrid.GetColumnIndexByName(const nome: string): Integer;
begin
 Result:= 0;
 for var i:= 1 to Pred(Self.ColCount) do
  if Self.Columns[i].Name = nome then Exit(i);
end;

procedure TAdvColumnGrid.SetBasicColumnConfig;
var i: Integer;
begin
 with Self do
 begin
  SuppressColumn(0);
  for i:= 1 to ColCount - 1 do
   if Columns[i].Tag = 0 then
   begin
    Columns[i].HeaderAlignment:= taCenter;
    Columns[i].HeaderFont.Name:= 'Tahoma';
    Columns[i].HeaderFont.Size:= MulDiv(8, 96, Self.CurrentPPI);
    Columns[i].HeaderFont.Color:= clWhite;
    Columns[i].HeaderFont.Style:= [fsBold];
   end;
  for i:= 1 to ColCount - 1 do
   if Columns[i].Tag = 0 then
   begin
    Columns[i].Font.Name:= 'Verdana';
    Columns[i].Font.Size:= MulDiv(10, 96, Self.CurrentPPI);
    Columns[i].Font.Style:= [];
   end;
  for i:= 1 to ColCount - 1 do
   if Columns[i].Tag = 0 then
   begin
    Columns[i].ShowBands:= True;
    // if i mod 2 = 0 then Colors[i,0]:= RGB($D5,$F5,$D5) else Colors[i,0]:= RGB($D0,$F0,$D0);
    Colors[i, 0]:= RGB($41, $3F, $42);
   end;

  for i:= 1 to ColCount - 1 do Columns[i].Tag:= 1; // marca que já foram colocadas as configurações "default"

  Bands.PrimaryColor:= $00EFEFEF;
  Bands.SecondaryColor:= $00F9F9F9;
  MouseActions.DirectEdit:= True;
  MouseActions.DirectComboDrop:= True;
  Bands.Active:= True;
  ActiveCellShow:= False;
  Navigation.SkipDisabledRows:= True;
  Navigation.AutoComboSelect:= False;
  ShowSelection:= True;
  HideFocusRect:= True;
  Options:= Options - [goRangeSelect] + [goRowSelect];
  HoverRow:= True;
  HoverRowColor:= clYellow;
  ActiveRowShow:= True;
  ActiveRowColor:= clLime;
  SelectionColor:= clLime;
  SelectionTextColor:= clBlack;
  ColumnSize.Stretch:= False;
  ColumnSize.StretchColumn:= - 1; // Sets the index of the column to be stretched. By default this is "-1" to let the rightmost column stretch
  ColumnSize.SynchWithGrid:= False;
  FixedRowAlways:= True;
  FixedRows:= 1;
 end;
end;

end.
-------------------
Expand this interposer_class unit so each column of the TAdvColumnGrid will have a new string property: ORMfield