Propriedade componente não grava

Delphi

POO

09/05/2022

Estou criando um componente baseado em TDBGrid, incrementando algumas funcionalidades, por exemplo, para zebrar, porém, mesmo eu ativando TRUE na propriedade ZEBRAR, ele aparece FALSE quando passa pelo código debugando, e a opção escolhida para a propriedade não fica salvo no projeto também, como se não estivesse indo para o ".dfm", sendo assim, ao abrir o projeto, a propriedade esta FALSE novamente. (ao fechar o projeto o delphi trava também). Alguém pode me dar uma dica onde estou errando? Já procurei na internet e não consigo encontrar a solução. Grato. Segue a implementação:
unit MZDBGrid;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.Grids, Vcl.DBGrids, Vcl.Graphics, System.Types;

type
  TBloqueios = (blqInsert, blqDelete);
  TBloqueio = set of TBloqueios;

  TCorZebra = class
  private
    FZebrar: Boolean;
    FCorPrimaria: TColor;
    FCorSecundaria: TColor;
  public
    constructor Create;  
  published
    property Zebrar: Boolean read FZebrar write FZebrar default False;
    property CorPrimaria: TColor read FCorPrimaria write FCorPrimaria default clWindow;
    property CorSecundaria: TColor read FCorSecundaria write FCorSecundaria default clSilver;
  end;

  TMZDBGrid = class(Vcl.DBGrids.TDBGrid)
  private
    FCorZebra: TCorZebra;
    FBloqueio: TBloqueio;  
    procedure SetCorZebra(Value: TCorZebra);
  protected   
    procedure DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property CorZebra: TCorZebra read FCorZebra write SetCorZebra stored True; // NAO FICA GRAVADO NO PROJETO
    property Bloqueio: TBloqueio read FBloqueio write FBloqueio stored True; // NAO FICA GRAVADO NO PROJETO
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MZComponents', [TMZDBGrid]);
end;

{ TMZDBGrid }

constructor TMZDBGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCorZebra := TCorZebra.Create;
  FCorZebra.CorPrimaria := clWindow;
  FCorZebra.CorSecundaria := clSilver;
  Include(FBloqueio, blqInsert);
  Include(FBloqueio, blqDelete);
end;

destructor TMZDBGrid.Destroy;
begin
  FCorZebra.DisposeOf;
  inherited Destroy;
end;

procedure TMZDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  inherited;
  if FCorZebra.Zebrar then // MESMO COLOCANDO TRUE NO PROJETO, AO DEBUGAR CHEGA AQUI FALSE 
  begin
    if Odd(Self.DataSource.DataSet.RecNo) then
      Self.Canvas.Brush.Color := FCorZebra.CorPrimaria
    else
      Self.Canvas.Brush.Color := FCorZebra.CorSecundaria;

    Self.Canvas.FillRect(Rect);
    Self.DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
end;

procedure TMZDBGrid.SetCorZebra(Value: TCorZebra);
begin
  if Assigned(FCorZebra) then
    FCorZebra := Value;
end;

{ TCorZebra }

constructor TCorZebra.Create;
begin
  FZebrar := False;
  FCorPrimaria := clWindow;
  FCorSecundaria := clSilver;
end;

end.
Welinton Dias

Welinton Dias

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

09/05/2022

tente isto:
unit MZDBGrid;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.Grids, Vcl.DBGrids, Vcl.Graphics, System.Types;

type
  TBloqueios = (blqInsert, blqDelete);
  TBloqueio = set of TBloqueios;

{$M+}

  TCorZebra = class(TPersistent)
  private
    FZebrar: Boolean;
    FCorPrimaria: TColor;
    FCorSecundaria: TColor;
  public
    constructor Create;
  published
    property Zebrar: Boolean read FZebrar write FZebrar;
    property CorPrimaria: TColor read FCorPrimaria write FCorPrimaria;
    property CorSecundaria: TColor read FCorSecundaria write FCorSecundaria;
  end;

  TMZDBGrid = class(Vcl.DBGrids.TDBGrid)
  private
    FCorZebra: TCorZebra;
    FBloqueio: TBloqueio;
    procedure SetCorZebra(Value: TCorZebra);
    procedure SetBloqueio(const Value: TBloqueio);
  protected
    procedure DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property CorZebra: TCorZebra read FCorZebra write SetCorZebra;
    property Bloqueio: TBloqueio read FBloqueio write SetBloqueio;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MZComponents', [TMZDBGrid]);
end;

{ TMZDBGrid }

constructor TMZDBGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FCorZebra := TCorZebra.Create;
  Include(FBloqueio, blqInsert);
  Include(FBloqueio, blqDelete);
end;

destructor TMZDBGrid.Destroy;
begin
  FCorZebra.DisposeOf;
  inherited Destroy;
end;

procedure TMZDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  inherited;
  if FCorZebra.Zebrar then // MESMO COLOCANDO TRUE NO PROJETO, AO DEBUGAR CHEGA AQUI FALSE
  begin
    if Odd(Self.DataSource.DataSet.RecNo) then
      Self.Canvas.Brush.Color := FCorZebra.CorPrimaria
    else
      Self.Canvas.Brush.Color := FCorZebra.CorSecundaria;

    Self.Canvas.FillRect(Rect);
    Self.DefaultDrawColumnCell(Rect, DataCol, Column, State);
  end;
end;

procedure TMZDBGrid.SetBloqueio(const Value: TBloqueio);
begin
  FBloqueio := Value;
end;

procedure TMZDBGrid.SetCorZebra(Value: TCorZebra);
begin
  if Assigned(FCorZebra) then
    FCorZebra := Value;
end;

{ TCorZebra }

constructor TCorZebra.Create;
begin
  FZebrar := False;
  FCorPrimaria := clWindow;
  FCorSecundaria := clSilver;

  inherited;
end;

end.
GOSTEI 1

Mais Respostas

Welinton Dias

Welinton Dias

09/05/2022

Perfeito, funcionou certinho agora.
Estou começando agora a me aventurar em criação de componente, sendo assim, desconheço alguns detalhes. Irei estudar as alterações que você fez, para entender meu erro.
Muito obrigado, sucessos pra vc sempre.
GOSTEI 0
POSTAR