Propriedade componente não grava
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 :)