Fabricio Semonetti Posted February 14, 2023 at 04:59 PM Report Share #630154 Posted February 14, 2023 at 04:59 PM Boa tarte a todos, estou criando um componente composto, ele consiste de um painel com 2 botões, 2 rótulos e três shapes. Porém, quando crio ele no inspetor de objetos, aparece somente o o evento onclick refente ao componente como um todo. Gostaria que aparece nos eventos algo tipo: OnClickBotaoEsquerda e OnClickBotaoDireita, tenho o código parcial, se poderem ajudar agradeço. unit PanelEstacaoMotor; {$mode ObjFPC}{$H+} interface uses Classes, SysUtils,extctrls,StdCtrls,Graphics; type { TPanelEstacaoMotor } TPanelEstacaoMotor = Class(TPanel) private Bdesliga : Tbutton; BLiga : Tbutton; FDescriInferior: string; FDescriSuperior: string; LDesligado:Tshape; LLigado :Tshape; LFalha :Tshape; Pisca : Ttimer; Nome : Tlabel; NomeS : Tlabel; procedure SetDescriInferior(AValue: string); procedure SetDescriSuperior(AValue: string); public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; procedure Paint; override; Function Tamanho(Texto:String; Fonte:TFont) : integer; published property DescriSuperior : string read FDescriSuperior write SetDescriSuperior; property DescriInferior : string read FDescriInferior write SetDescriInferior; end; procedure Register; implementation { TPanelEstacaoMotor } procedure Register; begin RegisterComponents('Fabricio', [TPanelEstacaoMotor]); end; Function TPanelEstacaoMotor.Tamanho(Texto:String; Fonte:TFont) : integer; var LBmp: TBitmap; begin LBmp := TBitmap.Create; try LBmp.Canvas.Font := Font; Result := LBmp.Canvas.TextWidth(Texto); finally LBmp.Free; end; end; procedure TPanelEstacaoMotor.SetDescriInferior(AValue: string); begin if FDescriInferior=AValue then Exit; FDescriInferior:=AValue; Nome.Left:=round((120-Tamanho(Avalue,Nome.Font))/2); Nome.Caption:=AValue; end; procedure TPanelEstacaoMotor.SetDescriSuperior(AValue: string); begin if FDescriSuperior=AValue then Exit; FDescriSuperior:=AValue; NomeS.Caption:=AValue; NomeS.Left:=round((120-Tamanho(Avalue,NomeS.Font))/2); NomeS.Caption:=AValue; end; constructor TPanelEstacaoMotor.Create(TheOwner: TComponent); begin inherited Create(TheOwner); Caption:=''; Color:=$00808040; Width:=120; Height:=60; Top:=50;; Left:=50; Bdesliga:= Tbutton.Create(nil); Bdesliga.parent:=self; Bdesliga.Color:=8; Bdesliga.Width:=20; Bdesliga.Height:=20; Bdesliga.Top:=40;; Bdesliga.Left:=0; Bdesliga.Caption:=''; BLiga:= Tbutton.Create(nil); BLiga.parent:=self; BLiga.Color:=8; BLiga.Width:=20; BLiga.Height:=20; BLiga.Top:=40;; BLiga.Left:=99; Bliga.Caption:=''; Nome:= Tlabel.Create(nil); Nome.Parent:=self; Nome.Caption:='Motor'; Nome.Top:=27;; Nome.Left:=4; NomeS:= Tlabel.Create(nil); NomeS.Parent:=self; NomeS.Caption:='Motor'; NomeS.Top:=17;; NomeS.Left:=4; Pisca:=Ttimer.create(nil); LDesligado:=Tshape.create(nil); LDesligado.parent:=self; LDesligado.Color:=8; LDesligado.Width:=18; LDesligado.Height:=18; LDesligado.Top:=1;; LDesligado.Left:=2; LDesligado.Brush.Color:=clGray; LFalha:=Tshape.create(nil); LFalha.parent:=self; LFalha.Color:=8; LFalha.Width:=18; LFalha.Height:=18; LFalha.Top:=1;; LFalha.Left:=50; LFalha.Brush.Color:=clMenuBar; LFalha.Shape:=stCircle; LLigado:=Tshape.create(nil); LLigado.parent:=self; LLigado.Color:=8; LLigado.Width:=18; LLigado.Height:=18; LLigado.Top:=1; LLigado.Left:=101; LLigado.Brush.Color:=clMenuBar; end; destructor TPanelEstacaoMotor.Destroy; begin inherited Destroy; Bdesliga.Destroy; BLiga.Destroy; LLigado.Destroy; LDesligado.Destroy; LFalha.Destroy; Pisca.Destroy; end; procedure TPanelEstacaoMotor.Paint; begin inherited Paint; end; end. Link to comment Share on other sites More sharing options...
nunopicado Posted February 16, 2023 at 12:03 PM Report Share #630182 Posted February 16, 2023 at 12:03 PM Tens de definir propriedades para o objeto na secção Published, e colocar um setter nessas propriedades que atribuam o evento passado para os botões internos. Já não faço isso há uns bons anos, mas será algo tipo: type TTeuComponente = class(TCustomPanel) private BotaoEsquerda: TButton; BotaoDireita: TButton; function GetClickBotaoEsquerda: TNotifyEvent; procedure SetClickBotaoEsquerda(AValue: TNotifyEvent); public // os teus procedimentos e funções e propriedades published property OnClickBotaoEsqueda: TNotifyEvent read GetClickBotaoEsquerda write SetClickBotaoEsquerda; end; // // procedure TTeuComponente.SetClickBotaoEsquerda(AValue: TNotifyEvent); begin BotaoEsquerda.OnClick := AValue; end; function TTeuComponente.GetClickBotaoEsqueda: TNotifyEvent; begin Result := BotaoEsquerda.OnClick; end; Se a tua ideia for definir os eventos por código, podes colocar a propriedade direto no Public. No Published a diferença é que, se registares o componente no IDE, poderás depois atribuir um evento dentro do próprio IDE como fazes com os botões normais. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum. Link to comment Share on other sites More sharing options...
Fabricio Semonetti Posted February 17, 2023 at 12:45 AM Author Report Share #630188 Posted February 17, 2023 at 12:45 AM Obrigado por responder, vou implementar o exemplo, depois retorno. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now