Criação de componente
Estu fazendo um componente (TpanelForm) derivado do TPanel.
Eu quero o seguinte, quero colocar um Tlabel no topo onde será o titulo, até aí tudo bem.
implentei no oncreate Tpaneform:
obs. Destruir é uma procedure; e o componente compila sem nenhum erro , hint e warinig.
Gostaria de que assim que mudasse o nome do TPanelForm o label e do button tabém fosse alterado
e gostaria de acrescentar o comando ´Tpanelform.destroy´ no ´OnClick´ do Tbutton.
Eu quero o seguinte, quero colocar um Tlabel no topo onde será o titulo, até aí tudo bem.
implentei no oncreate Tpaneform:
constructor TPanelform.Create(AOwner: TComponent); var lbl:Tlabel; btn:Tbutton; begin inherited; if (csdesigning in ComponentState) then begin //criação do label -> Titulo lbl:= Tlabel.Create(AOwner); lbl.Name:= ´titulo´ + name; <- o name esta em branco lbl.parent:= self; with lbl do begin Caption:= name; height:= 21; Layout:= tlCenter; visible:=True; autosize := False; color:= clactivecaption; font.Color:= clCaptiontext; lbl.Align:= altop; end; //Criação do botão btn:= TButton.Create(Aowner); btn.Name:= ´Btnclose´ + name; <- name ainda está em branco btn.parent:= self; btn.Left:= width - 20; btn.onclick:= Destruir; <- não funciona with btn do begin caption:= ´X´; width:= 17; height:= 17; Top:= 3; end; end; end;
obs. Destruir é uma procedure; e o componente compila sem nenhum erro , hint e warinig.
Gostaria de que assim que mudasse o nome do TPanelForm o label e do button tabém fosse alterado
e gostaria de acrescentar o comando ´Tpanelform.destroy´ no ´OnClick´ do Tbutton.
Sistemald
Curtidas 0
Respostas
Massuda
01/02/2005
Gostaria de que assim que mudasse o nome do TPanelForm o label e do button tabém fosse alterado ...
Implemente sua versão do método SetName:type TPanelform = class(... protected procedure SetName(const NewName: TComponentName); override; // ... procedure TPanelform.SetName(const NewName: TComponentName); begin inherited SetName(NewName); // ajuste o nome do label e do botão de acordo com NewName end;
... gostaria de acrescentar o comando ´Tpanelform.destroy´ no ´OnClick´ do Tbutton.
Dê uma olhada [url=http://forum.clubedelphi.net/viewtopic.php?t=57985]neste tópico recente[/url].GOSTEI 0
Sistemald
01/02/2005
Valeu as dicas, olha só
Coloquei o seguinte
e tb ...
Mas as propriedades sempre aperacem pretas e sem texto, não está respeintado o Default, e mesmo trocando no object inperctor não funciona, acredtido por estou tentando acessar as propriedades no oncreate.
Tem algum afterCreate?!?
Coloquei o seguinte
TPanelform = class(TPanel) private lbl:Tlabel; btn:Tbutton; Fcor:TColor; Ffontecor:TColor; FTitulo:String; Procedure Gettitulo(valor:string); Procedure GetCor(valor:Tcolor); Procedure GetFonteCor(valor:Tcolor);
e tb ...
published property Titulonome:String read Ftitulo write GetTitulo; property Titulocor:TColor read Fcor write GetCor Default clActiveCaption; property Titulofontcolor:TColor read Ffontecor write GetFonteCor Default clCaptionText;
Mas as propriedades sempre aperacem pretas e sem texto, não está respeintado o Default, e mesmo trocando no object inperctor não funciona, acredtido por estou tentando acessar as propriedades no oncreate.
Tem algum afterCreate?!?
GOSTEI 0
Sistemald
01/02/2005
Olha só dei uma acoxambrada
Mas ainda não consegui usar a propriedade [b:f88bc2e360]Default[/b:f88bc2e360].
type
TPanelform = class(TPanel)
private
lbl:Tlabel;
btn:Tbutton;
Fcor:TColor;
Ffontecor:TColor;
FTitulo:String;
Procedure Gettitulo(valor:string);
Procedure GetCor(valor:Tcolor);
Procedure GetFonteCor(valor:Tcolor);
procedure criaoresto;
{ Private declarations }
protected
// procedure SetName(const NewName: TComponentName); override;
{ Protected declarations }
public
procedure Destruir(Sender: TObject);
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
property Titulonome:String read Ftitulo write GetTitulo;
property Titulocor:TColor read Fcor write GetCor Default clActiveCaption;
property Titulofontcolor:TColor read Ffontecor write GetFonteCor Default clCaptionText;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(´Donato´, [TPanelform]);
end;
{ TPanelform }
procedure TPanelform.GetCor(valor: Tcolor);
begin
FCor:= Valor;
Criaoresto;
end;
procedure TPanelform.GetFonteCor(valor: Tcolor);
begin
FFonteCor:= Valor;
end;
procedure TPanelform.Gettitulo(valor: string);
begin
FTitulo:= valor;
end;
constructor TPanelform.Create(AOwner: TComponent);
begin
inherited;
end;
destructor TPanelform.Destroy;
begin
if not (csdesigning in ComponentState) then
begin
lbl.Destroy;
btn.Destroy;
end;
inherited;
end;
procedure TPanelform.Destruir(Sender: TObject);
begin
destroy;
end;
procedure TPanelform.criaoresto;
begin
if not (csdesigning in ComponentState) then
begin
//criação do label -> Titulo
lbl:= Tlabel.Create(self);
lbl.Name:= ´titulo´ + name;
lbl.parent:= self;
with lbl do
begin
Caption:= FTitulo;
height:= 21;
Layout:= tlCenter;
visible:=True;
autosize := False;
color:= Fcor;
font.Color:= Ffontecor;
lbl.Align:= altop;
end;
//Criação do botão
btn:= TButton.Create(self);
btn.Name:= ´Btnclose´ + name;
btn.parent:= self;
btn.Left:= width - 20;
with btn do
begin
caption:= ´X´;
width:= 17;
height:= 17;
Top:= 3;
onclick:= Destruir;
end;
end;
end;
Mas ainda não consegui usar a propriedade [b:f88bc2e360]Default[/b:f88bc2e360].
GOSTEI 0
Sistemald
01/02/2005
Olha só dei uma acoxambrada
Mas ainda não consegui usar a propriedade [b:b64d8fce25]Default[/b:b64d8fce25].
type
TPanelform = class(TPanel)
private
lbl:Tlabel;
btn:Tbutton;
Fcor:TColor;
Ffontecor:TColor;
FTitulo:String;
Procedure Gettitulo(valor:string);
Procedure GetCor(valor:Tcolor);
Procedure GetFonteCor(valor:Tcolor);
procedure criaoresto;
{ Private declarations }
protected
// procedure SetName(const NewName: TComponentName); override;
{ Protected declarations }
public
procedure Destruir(Sender: TObject);
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
property Titulonome:String read Ftitulo write GetTitulo;
property Titulocor:TColor read Fcor write GetCor Default clActiveCaption;
property Titulofontcolor:TColor read Ffontecor write GetFonteCor Default clCaptionText;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(´Donato´, [TPanelform]);
end;
{ TPanelform }
procedure TPanelform.GetCor(valor: Tcolor);
begin
FCor:= Valor;
Criaoresto;
end;
procedure TPanelform.GetFonteCor(valor: Tcolor);
begin
FFonteCor:= Valor;
end;
procedure TPanelform.Gettitulo(valor: string);
begin
FTitulo:= valor;
end;
constructor TPanelform.Create(AOwner: TComponent);
begin
inherited;
end;
destructor TPanelform.Destroy;
begin
if not (csdesigning in ComponentState) then
begin
lbl.Destroy;
btn.Destroy;
end;
inherited;
end;
procedure TPanelform.Destruir(Sender: TObject);
begin
destroy;
end;
procedure TPanelform.criaoresto;
begin
if not (csdesigning in ComponentState) then
begin
//criação do label -> Titulo
lbl:= Tlabel.Create(self);
lbl.Name:= ´titulo´ + name;
lbl.parent:= self;
with lbl do
begin
Caption:= FTitulo;
height:= 21;
Layout:= tlCenter;
visible:=True;
autosize := False;
color:= Fcor;
font.Color:= Ffontecor;
lbl.Align:= altop;
end;
//Criação do botão
btn:= TButton.Create(self);
btn.Name:= ´Btnclose´ + name;
btn.parent:= self;
btn.Left:= width - 20;
with btn do
begin
caption:= ´X´;
width:= 17;
height:= 17;
Top:= 3;
onclick:= Destruir;
end;
end;
end;
Mas ainda não consegui usar a propriedade [b:b64d8fce25]Default[/b:b64d8fce25].
GOSTEI 0
Sistemald
01/02/2005
Olha só dei uma acoxambrada
Mas ainda não consegui usar a propriedade [b:82e36bc333]Default[/b:82e36bc333].
type
TPanelform = class(TPanel)
private
lbl:Tlabel;
btn:Tbutton;
Fcor:TColor;
Ffontecor:TColor;
FTitulo:String;
Procedure Gettitulo(valor:string);
Procedure GetCor(valor:Tcolor);
Procedure GetFonteCor(valor:Tcolor);
procedure criaoresto;
{ Private declarations }
protected
// procedure SetName(const NewName: TComponentName); override;
{ Protected declarations }
public
procedure Destruir(Sender: TObject);
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
{ Public declarations }
published
property Titulonome:String read Ftitulo write GetTitulo;
property Titulocor:TColor read Fcor write GetCor Default clActiveCaption;
property Titulofontcolor:TColor read Ffontecor write GetFonteCor Default clCaptionText;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(´Donato´, [TPanelform]);
end;
{ TPanelform }
procedure TPanelform.GetCor(valor: Tcolor);
begin
FCor:= Valor;
Criaoresto;
end;
procedure TPanelform.GetFonteCor(valor: Tcolor);
begin
FFonteCor:= Valor;
end;
procedure TPanelform.Gettitulo(valor: string);
begin
FTitulo:= valor;
end;
constructor TPanelform.Create(AOwner: TComponent);
begin
inherited;
end;
destructor TPanelform.Destroy;
begin
if not (csdesigning in ComponentState) then
begin
lbl.Destroy;
btn.Destroy;
end;
inherited;
end;
procedure TPanelform.Destruir(Sender: TObject);
begin
destroy;
end;
procedure TPanelform.criaoresto;
begin
if not (csdesigning in ComponentState) then
begin
//criação do label -> Titulo
lbl:= Tlabel.Create(self);
lbl.Name:= ´titulo´ + name;
lbl.parent:= self;
with lbl do
begin
Caption:= FTitulo;
height:= 21;
Layout:= tlCenter;
visible:=True;
autosize := False;
color:= Fcor;
font.Color:= Ffontecor;
lbl.Align:= altop;
end;
//Criação do botão
btn:= TButton.Create(self);
btn.Name:= ´Btnclose´ + name;
btn.parent:= self;
btn.Left:= width - 20;
with btn do
begin
caption:= ´X´;
width:= 17;
height:= 17;
Top:= 3;
onclick:= Destruir;
end;
end;
end;
Mas ainda não consegui usar a propriedade [b:82e36bc333]Default[/b:82e36bc333].
GOSTEI 0
Massuda
01/02/2005
... Mas ainda não consegui usar a propriedade [b:76be8f8afa]Default[/b:76be8f8afa].
A declaração [b:76be8f8afa]default[/b:76be8f8afa] de uma propriedade como em:type TPanelform = class(TPanel) // ... published property Titulocor:TColor read Fcor write GetCor Default clActiveCaption;
constructor TPanelform.Create(AOwner: TComponent); begin inherited; FCor := clActiveCaption; end;
GOSTEI 0
Sistemald
01/02/2005
Consegui usar a propriedade [b:d28b15677e]Default[/b:d28b15677e], faltava incluir no oncreate
achei um ótimo artigo
http://www.clubedelphi.net/artigos/criacao_componentes.asp
mas ainda falta uma maneira de executar uma procedure logo após o create do componente.
achei um ótimo artigo
http://www.clubedelphi.net/artigos/criacao_componentes.asp
mas ainda falta uma maneira de executar uma procedure logo após o create do componente.
GOSTEI 0
Massuda
01/02/2005
... mas ainda falta uma maneira de executar uma procedure logo após o create do componente.
você está chamando a procedure [b:1a7241905e]CriaOResto[/b:1a7241905e] dentro da GetCor; chame essa procedure dentro do construtor Create.Outra coisa... procure não chamar diretamente o destrutor Destroy, mas sim usar a procedure Free, que é a prática recomendada. Dessa forma, seu destrutor ficaria assim:
destructor TPanelform.Destroy; begin lbl.Free; btn.Free; inherited; end;
GOSTEI 0
Sistemald
01/02/2005
No código
Preciso de algo do tipo
deste jeito assim que destruir o TpanelForm seus Tlabel e o Tbutton será destruido automaticamente.
E a respeito do Criaoreto no [b:4f5b215dc5]oncreate[/b:4f5b215dc5] não funciona pois a var vem em branco ou com a opção default.
lbl.parent:= self;
Preciso de algo do tipo
lbl.parent:= TPanelForm;
deste jeito assim que destruir o TpanelForm seus Tlabel e o Tbutton será destruido automaticamente.
E a respeito do Criaoreto no [b:4f5b215dc5]oncreate[/b:4f5b215dc5] não funciona pois a var vem em branco ou com a opção default.
GOSTEI 0
Massuda
01/02/2005
No código
lbl.parent:= self;
Preciso de algo do tipo
lbl.parent:= TPanelForm;
deste jeito assim que destruir o TpanelForm seus Tlabel e o Tbutton será destruido automaticamente.
Não... o que garante a destruição dos seus controles internos é o Owner do controle, que é definido quando você fazlbl:= TLabel.Create(Self);
E a respeito do Criaoreto no [b:3e886a1f26]oncreate[/b:3e886a1f26] não funciona pois a var vem em branco ou com a opção default.
Qual ´var´ vem em branco?Você incluiu no código da procedure CriaOResto e do destrutor Destroy o seguinte:
if not (csdesigning in ComponentState) ...
GOSTEI 0
Sistemald
01/02/2005
a var titulo vem em branco
e as duas Tcolor vem com o default, não importando a o que se coloca no object inpector.
fiz um timer para ser executado depois do oncreate e funcionou
mas acredito ter um jeito melhor
e as duas Tcolor vem com o default, não importando a o que se coloca no object inpector.
fiz um timer para ser executado depois do oncreate e funcionou
mas acredito ter um jeito melhor
GOSTEI 0
Sistemald
01/02/2005
Estou com problemas na destruição do comp.
No compo tem o bto fechar com o código:
Quando ele é pressionado da [b:0fd01d523a]Violação de memória[/b:0fd01d523a]
Mas se no em um projeto eu coloco um botão fora do compo com o mesmo código da certo, sem erros.
Alguém tem uma dica
No compo tem o bto fechar com o código:
Free;
Quando ele é pressionado da [b:0fd01d523a]Violação de memória[/b:0fd01d523a]
Mas se no em um projeto eu coloco um botão fora do compo com o mesmo código da certo, sem erros.
Alguém tem uma dica
GOSTEI 0
Marcelo Saviski
01/02/2005
achei um ótimo artigo
http://www.clubedelphi.net/artigos/criacao_componentes.asp
Desse artigo, acho que muita gente não reparou, mais tem a 2º parte
http://www.clubedelphi.net/artigos/criacao_componentes2.asp
GOSTEI 0
Sistemald
01/02/2005
Olha inda, preciso executar uma procedure logo após o create do componente, se eu colocar no [b:d495584995]Constructor Create[/b:d495584995], as var propriedades ainda estão em brancas
Alguém sabe como resolver isto? :?: :?: :?: :?:
Alguém sabe como resolver isto? :?: :?: :?: :?:
GOSTEI 0
Sistemald
01/02/2005
Algum evento que seja disparado após alteração de alguma propriedade.
GOSTEI 0
Beppe
01/02/2005
Existe um método protegido chamado Loaded, executado após todos os construtores.
Após a aleração de alguma propriedade, apenas o método determinado na cláusula write, não existe uma maneira global...
protected procedure Loaded; override; ...
Após a aleração de alguma propriedade, apenas o método determinado na cláusula write, não existe uma maneira global...
GOSTEI 0