Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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?

Compartilhar este post


Link para o post
Compartilhar em outros 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;

Compartilhar este post


Link para o post
Compartilhar em outros 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é...

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.