Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

marcio.theis

Criando componentes de forma dinâmica

Recommended Posts

Pequeno exemplo de como criar componente de forma dinâmica, no caso criando 10 TCheckBox, TEdit e TSpeedButton.

Adicione um botão na tela, e no evento OnClick faça:

 

procedure TForm1.BitBtn1Click(Sender: TObject); var	 x: integer; begin  for x:=1 to 10 do	 begin	 with TCheckBox.Create(Self) do		 begin		 Parent:=Self;		 Top:=10 + (x * 22);		 Left:=50;		 Caption:='Check Box' + IntToStr(x) + ':';		 Name:='ckb_' + IntToStr(x);		 end;	 with TEdit.Create(Self) do		 begin		 Parent:=Self;		 Top:=10 + (x * 22);		 Left:=150;		 Caption:='Edit' + IntToStr(x);		 Name:='edt_' + IntToStr(x);		 end;	 with TSpeedButton.Create(Self) do		 begin		 Parent:=Self;		 Caption:='...';		 Top:=10 + (x * 22);		 Left:=270;		 Flat:=True;		 Hint:='btn_' + IntToStr(x);		 ShowHint:=True;		 Name:='btn_' + IntToStr(x);		 OnClick:=ExecutaClick;		 end;	 end; end;

 

Crie uma procedure da seguinte forma:

procedure TForm1.ExecutaClick(speed: TObject); begin ShowMessage(PChar('Você apertou o ' + TSpeedButton(speed).Hint)); end;
Esta procedure no caso serve tb de forma dinâmica para o evento OnClick dos TSpeedButton criados dinâmicamente...

 

Sendo que é uma base de como criar, para os demais componentes mudam poucas coisas...

Share this post


Link to post
Share on other sites

MUITO BOM!!posso usar em minha de Delphi aula como exemplo?Abraços amigo Marcio.

Claro Panto...Se precisar de mais exemplos, só dizer :D
Pow valew....essas coisas são simples e muito necessárias para quem quer seguir esse ramo de porg em POO!e se rpecisar nao exitarei mesmo em pedir hein!^^abraços

Share this post


Link to post
Share on other sites

Marcio, uma pequena dúvida: esse exemplo deu certinho para o que eu estava precisando.

Só que uma determinada ação eu preciso destuir os componentes criados.

 

Como se faz isso dinamicamente?

Share this post


Link to post
Share on other sites

Sim, estou criando alguns checkbox e preciso em uma determinada ação destruí-los e dependendo de algumas condições criar-los de novo (ou não).

Entendeu?

Eu tentei usar o FreeAndNil mas não deu mto certo:

 

procedure TfrmPerguntas.KillCheck();
var
  x: integer;
  i: integer;
  obj: TCheckBox;
begin

  i:= 1;
  for x := 0 to ComponentCount - 1 do
  begin
	If Components[x].ClassType = tCheckBox then
	begin
	  obj.Name := 'ckbQuest'+ IntToStr(i);
	  FreeAndNil(obj);
	  i:= i + 1;
	end;
  end;

end;

Tem alguma outra forma?

Share this post


Link to post
Share on other sites

Acho que esta mesmo, tente utilizando o x no lugar do i, sendo que ele não se faz necessário, ficando:

 

procedure TfrmPerguntas.KillCheck();
var
  x: integer;
  obj: TCheckBox;
begin
  for x := 0 to ComponentCount - 1 do
  begin
	If Components[x].ClassType = tCheckBox then
	begin
	  obj.Name := 'ckbQuest'+ IntToStr(x);
	  FreeAndNil(obj);
	end;
  end;
end;

Share this post


Link to post
Share on other sites

Então é aí que vai dar access violation mesmo.

Eu só vou ter ckbquest de 1 a 5 no máximo.

 

O componentcount nesse caso vai até 33 se eu não me engano, e o x dentro do for tá acompanhando ele né...

Share this post


Link to post
Share on other sites

Consegui!!!

Era mais fácil do que eu imaginava:

 

for x := ComponentCount - 1 downto 0 do
	begin
	  If Components[x].ClassType = tCheckBox then
		TCheckBox(Components[x]).Destroy;
	end;

Só funcionou quando eu inverti a contagem no FOR para downto, não entendi exatamente porque... mas tá funcionando.

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.