Você está na página 1de 7

07/09/2018 Comando Para Criar Componentes - Delphi, Kylix - Fórum Script Brasil

Comando Para Criar Componentes


Por deio, Maio 10, 2007 em Delphi, Kylix 

deio     
 0

Postado Maio 10, 2007  

oi, gostaria de saber qual seria o comando para quando clicar em um botão criasse
um novo page dentro do tabbednotebook, e dentro desse novo page criasse um
DBGrid

Editado Maio 10, 2007 por deio

Micheus     
 0

Postado Maio 11, 2007  

 deio disse:

oi, gostaria de saber qual seria o comando para quando clicar em um botão
criasse um novo page dentro do tabbednotebook, e dentro desse novo page
criasse um DBGrid
deio , você utiliza o mesmo método aplicado a qualquer componente - Create. A
questão, no caso dos componentes visuais (os descendentes de TWinControl), é que
você tem que ajustar a propriedade Parent para apontar para o componente visual
que mostrará o mesmo. Segue um ex.:

procedure TForm2.Button2Click(Sender: TObject);


begin
TabbedNotebook1.Pages.Append('Aba
'+IntToStr(TabbedNotebook1.Pages.Count));
with TDBGrid.Create(self) do
begin
Parent :=
TWinControl(TabbedNotebook1.Pages.Objects[TabbedNotebook1.Pages.C
ount -1]);
Name := 'DBGrid1'; // *** este nome deve ser único
Top := 8;
Left := 8;
Width := TabbedNotebook1.Width - 16;
Height := TabbedNotebook1.Height - 16;
end;
end;

Uma perguntinha...

Porque você está utilizando o TabbedNoteBook (lá do Windows 3.1 - 16bits)? Acho
que seria mais apropriado você utilizar as versões mais recentes TabControl
ou PageControl (Windows - 32bits), com muito mais recursos (propriedades,
metodos e eventos).

https://www.scriptbrasil.com.br/forum/topic/101549-comando-para-criar-componentes/ 1/7
07/09/2018 Comando Para Criar Componentes - Delphi, Kylix - Fórum Script Brasil

Abraços

deio     
 0

Postado Maio 11, 2007  

falta de conhecimento sobre a existência dos mesmos XD

sendo assim, como seria o mesmo código para esse componente citado?

Micheus     
 0

Postado Maio 12, 2007  

O processo é o mesmo que o mencionado anteriormente: cria a guia, define


seu parent, cria os componentes a inserir na guia, definindo a mesma como
seu parent:

procedure TForm3.BtnAddSheetClick(Sender: TObject);


var
TabSheet :TTabSheet;
begin
TabSheet := TTabSheet.Create(Self);
TabSheet.Name := 'TabSheet'+IntToStr(PageControl1.PageCount
+1); // garante nome único
TabSheet.Caption := 'TabSheet '+IntToStr(PageControl1.PageCount
+1);
// efetiva a inserção no componente PageControl (equivale a
setar o Parent no outro componente)
TabSheet.PageControl := PageControl1;
with TDBGrid.Create(self) do
begin
Parent := TabSheet;
Name := 'DBGrid2';
Top := 8;
Left := 8;
Width := TabSheet.Width - 16;
Height := TabSheet.Height - 16;
end;
end;

Outras propriedades a serem inicializadas dependem da necessidade - se necessário


consulte o help sobre o componente em questão.

deio     
 0

Postado Maio 14, 2007  

https://www.scriptbrasil.com.br/forum/topic/101549-comando-para-criar-componentes/ 2/7
07/09/2018 Comando Para Criar Componentes - Delphi, Kylix - Fórum Script Brasil

vlw, já ajudou bastante, agora que eu consegui o código para criar, estou tentando
fazer o codigo para fechar a aba selecionada, o problema é que a nova aba é criada
em tempo de execução e não sei como me referir a este novo componente criado...

Micheus     
 0

Postado Maio 14, 2007  

 deio disse:

vlw, já ajudou bastante, agora que eu consegui o código para criar, estou
tentando fazer o codigo para fechar a aba selecionada, o problema é que a nova
aba é criada em tempo de execução e não sei como me referir a este novo
componente criado...
Se você prestou atenção aos comentários, você deve ter observado que deve dar um
nome único para cada componente. Posto isso, utilize o método
FindComponent(nome_componente) do seu form. Todos os componentes que
tiveram como Owner o Form (self) estarão numa lista que poderá ser consultada com
este método que retorna um TComponente (declare a variável para receber o retorno,
teste se não é nula e depois apenas chame o Free dela) - dê uma olhada no help.

deio     
 0

Postado Maio 14, 2007  

acho que eu não perguntei direito, o componente não existe até que você execute tal
função dentro do programa, e se você tentar declará-lo o delphi irá te dizer que ele
não existe.

Ex:

executa o programa

clica no button1

o programa cria um button3

clica no button2 e exclui o button3

(esse button3 é criado enquanto você executa o programa, que antes de você
executá-lo o componente não existia)

espero ter deixado minha dúvida um pouco mais clara :lol:

Micheus     
 0

Postado Maio 15, 2007  

estou achando é que eu foi quem não explicou direito. :huh:

https://www.scriptbrasil.com.br/forum/topic/101549-comando-para-criar-componentes/ 3/7
07/09/2018 Comando Para Criar Componentes - Delphi, Kylix - Fórum Script Brasil

Você não quer excluir um botão que você criou dinamicamente? Então, se você tem o
nome dele na criação, você tem como localizá-lo e destruí-lo. Não é isso que você
quer?

Veja o código a seguir:

procedure Form1.Button1Click(Sender :TObject);


begin
with TButton.Create(Self) do
begin
Name := 'Button3';
Left := 15;
Top := 20;
Parent := TabSheet1;
end;
end;

procedure Form1.Button2Click(Sender :TObject);


var
Componente :TComponent;
begin
Componente := FindComponent('Button3');
if Assigned(Componente) then
Componente.Free;
end;

Foi isso que eu quiz dizer no outro post

deio     
 0

Postado Maio 15, 2007  

agora foi XD

micheus, está dando erro quando eu tento criar mais de um tabsheet, ele diz que já
existe um DbGrid com esse nome...

sabe aquele exemplo do tabsheet que tu escreveu neste tópico, como ficaria este
exemplo pra fechar feito sobre aquele, ou seja, ao clicar num button, ele fecharia a
nova aba.

como ficaria para ao invés de fechar uma nova aba, ele fechasse a aba selecionada?

Editado Maio 15, 2007 por deio

Micheus     
 0

Postado Maio 15, 2007  

 deio disse:

https://www.scriptbrasil.com.br/forum/topic/101549-comando-para-criar-componentes/ 4/7
07/09/2018 Comando Para Criar Componentes - Delphi, Kylix - Fórum Script Brasil

sabe aquele exemplo do tabsheet que tu escreveu neste tópico, como ficaria
este exemplo pra fechar feito sobre aquele, ou seja, ao clicar num button, ele
fecharia a nova aba.

como ficaria para ao invés de fechar uma nova aba, ele fechasse a aba
selecionada?

A idéia é a mesma. Entretanto, como sua idéia é "matar" o mesmo e não apenas
ocultar, é conveniente que os componentes adicionados à ela não a tenham apenas
como Parent (local onde são desenhadas), mas sim, como Owner também. Isso
garantirá que ao ser destruída (via método Free), esses componentes que a ela forma
adicionados também o sejam.

Para acessar a guia ativa (a TabSheet), você deve obter sua instância, que nesse
caso seria a guia ativa no PageControl, ou seja, via propriedade
PageControl.ActivePage.

A forma mais elegante, digamos assim, seria você remover o componente de seu
Owner para depois eliminá-lo. Por ex.:

var
Componente :TComponent;
begin
Componente := PageControl.ActivePage;
PageControl.RemoveComponent(Componente); // remove-o da lista
de componentes interna do Owner
Componente.Free;
end;

Mas pelo que me lembro, o método anterior (mais simplista) também resulta na
remoção correta do componente. É testar para ver.

Abraços

deio     
 0

Postado Maio 16, 2007  

 deio disse:

micheus, está dando erro quando eu tento criar mais de um tabsheet, ele diz
que já existe um DbGrid com esse nome...

falto só essa parte...

meu DbGrid principal está com o nome de DbGrid1 mesmo, acho que precisa fazer
um contador, que para cada dbgrid criado, adicione +1 no numero dele.

Ex : Dbgrid4, Dbgrid5....

consegui fazer o programa fechar a aba selecionada XD

 Micheus disse:

https://www.scriptbrasil.com.br/forum/topic/101549-comando-para-criar-componentes/ 5/7
07/09/2018 Comando Para Criar Componentes - Delphi, Kylix - Fórum Script Brasil

(...)
procedure Form1.Button2Click(Sender :TObject);
var
Componente :TComponent;
begin
Componente := FindComponent('Button3');
if Assigned(Componente) then
Componente.Free;
end;

var
Componente :TComponent;
begin
Componente := PageControl.ActivePage;
PageControl.RemoveComponent(Componente); // remove-o da
lista de componentes interna do Owner
Componente.Free;
end;

o que eu fiz foi misturar o dois e deu certo e fiz o seguinte :

(aprendi a usar essa janelinha XD )


var
Componente :TComponent;
begin
Componente := PageControl.ActivePage;
if Assigned(Componente) then
Componente.Free;
end;

Editado Maio 16, 2007 por deio

Micheus     
 0

Postado Maio 16, 2007  

 deio disse:

 deio disse:

micheus, está dando erro quando eu tento criar mais de um tabsheet, ele
diz que já existe um DbGrid com esse nome...

falto só essa parte...

meu DbGrid principal está com o nome de DbGrid1 mesmo, acho que precisa
fazer um contador, que para cada dbgrid criado, adicione +1 no numero dele.

https://www.scriptbrasil.com.br/forum/topic/101549-comando-para-criar-componentes/ 6/7
07/09/2018 Comando Para Criar Componentes - Delphi, Kylix - Fórum Script Brasil

Ex : Dbgrid4, Dbgrid5....

no primeiro post que eu lhe respondi tem a seguinte linha no código:

Name := 'DBGrid1'; // *** este nome deve ser único

no post seguinte:

TabSheet.Name := 'TabSheet'+IntToStr(PageControl1.PageCount +1); // garante

nome único

no seguinte:

Se você prestou atenção aos comentários, você deve ter observado que deve dar um

nome único  para cada componente.

e ainda no próximo:

Você não quer excluir um botão que você criou dinamicamente? Então, se você tem

o nome dele na criação , você tem como localizá-lo e destruí-lo.

Acho que esta questão já está respondida, além do que parece-me que você já tem a
resposta - por favor preste mais atenção ao ler os comentários. <_<

 Citar

consegui fazer o programa fechar a aba selecionada XD

o que eu fiz foi misturar o dois e deu certo e fiz o seguinte :

(aprendi a usar essa janelinha XD )


var
Componente :TComponent;
begin
Componente := PageControl.ActivePage;
if Assigned(Componente) then
Componente.Free;
end;

https://www.scriptbrasil.com.br/forum/topic/101549-comando-para-criar-componentes/ 7/7