Fórum Propriedade componente não grava #618057
09/05/2022
0
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
Curtir tópico
+ 0
Responder
Post mais votado
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.Emerson Nascimento
Responder
Gostei + 1
Mais Posts
09/05/2022
Welinton Dias
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.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)