Propriedade componente não grava
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
Curtidas 0
Melhor post
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
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.
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