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