Fórum Criação de componente #266964

01/02/2005

0

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:

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

Sistemald

Responder

Posts

01/02/2005

Massuda

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].


Responder

Gostei + 0

01/02/2005

Sistemald

Valeu as dicas, olha só

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?!?


Responder

Gostei + 0

01/02/2005

Sistemald

Olha só dei uma acoxambrada

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].


Responder

Gostei + 0

01/02/2005

Sistemald

Olha só dei uma acoxambrada

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].


Responder

Gostei + 0

01/02/2005

Sistemald

Olha só dei uma acoxambrada

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].


Responder

Gostei + 0

01/02/2005

Massuda

... 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; 
é usada pela IDE e pelo mecanismo de serialização do componente. Você precisa incluir explicitamente no construtor de seu componente a inicialização do valor da propriedade, ou seja:
constructor TPanelform.Create(AOwner: TComponent); 
begin 
  inherited; 

  FCor := clActiveCaption;
end;



Responder

Gostei + 0

01/02/2005

Sistemald

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.


Responder

Gostei + 0

01/02/2005

Massuda

... 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; 



Responder

Gostei + 0

01/02/2005

Sistemald

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.

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.


Responder

Gostei + 0

01/02/2005

Massuda

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ê faz
lbl:= TLabel.Create(Self);
O valor de Parent define sobre qual componente/form seu controle interno será desenhado.

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) ...
Isso faz com que o código dentro do if seja executando apenas se o componente estiver sendo utilizado fora da IDE do Delphi.


Responder

Gostei + 0

02/02/2005

Sistemald

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


Responder

Gostei + 0

02/02/2005

Sistemald

Estou com problemas na destruição do comp.

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


Responder

Gostei + 0

02/02/2005

Marcelo Saviski

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


Responder

Gostei + 0

21/02/2005

Sistemald

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? :?: :?: :?: :?:


Responder

Gostei + 0

21/02/2005

Sistemald

Algum evento que seja disparado após alteração de alguma propriedade.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar