Destruir componentes

Delphi

03/08/2005

Como destruir todos os componentes (tbutton) de uma só vez, que foram criados em tempo de execurção.

Grato


Zlink

Zlink

Curtidas 0

Respostas

Ivanh

Ivanh

03/08/2005

ao cria-los poderia jogar todos em um vetor de tbutton :!:
depois basta percorrer o vetor e destruir
Ex.:
vetorbotoes[i] := TButton.Create(nil);



GOSTEI 0
Adriano Santos

Adriano Santos

03/08/2005

procedure DestruirComps;
var
  I : Integer;
begin
   for I := 0 to Form1.ComponentCount-1 do
   begin
      //verifica se o componente é da classe que se deseja destruir
      if Form1.Components[I] is TButton then
         {seu codigo de destruição +/- assim}
         Form1.Components[I].Free; 
         //não sei se vai funcionar só com o Free
         //talvez tenha que usar o Destroy junto com o Nil
   end;
end;



GOSTEI 0
Ivanh

Ivanh

03/08/2005

procedure DestruirComps;
var
  I : Integer;
begin
   for I := 0 to Form1.ComponentCount-1 do
   begin
      //verifica se o componente é da classe que se deseja destruir
      if Form1.Components[I] is TButton then
         {seu codigo de destruição +/- assim}
         Form1.Components[I].Free; 
         //não sei se vai funcionar só com o Free
         //talvez tenha que usar o Destroy junto com o Nil
   end;
end;



não esqueça que o [b:0ba5c2753f]infoagenda[/b:0ba5c2753f] soh quer destruir os componentes criados em tempo de execucao


GOSTEI 0
Zlink

Zlink

03/08/2005

Está dando o seguinte erro antes de apagar todos,

List index out of bounds (137)

Como eu resolvo este problema ?


GOSTEI 0
Adriano Santos

Adriano Santos

03/08/2005

não esqueça que o [b:a6117e1aa7]infoagenda[/b:a6117e1aa7] soh quer destruir os componentes criados em tempo de execucao


Puts, é mesmo. Neste caso serão excluídos todos os componentes da classe informada inclusive os criados em tempo de projeto. O que vc pode fazer [b:a6117e1aa7]infoagenda[/b:a6117e1aa7] é na hora de localizar o componente verificar se ele foi criado em tempo de execução apartir de uma lista criada, por exemplo:

procedure DestruirComps;
var
  I : Integer;
  procedure LocalizaCompNoArray(SeuBotaoProcurado: String) : Boolean;
  var J : Integer;
  begin
    for J := 0 to High(SeuArrayDeBotoes) do
      if SeuBotaoProcurado = SeuArrayDeBotoes[J] then
      begin
        Result := True;
        Break;
      end;
  end;
begin
   for I := 0 to Form1.ComponentCount-1 do
   begin
     //verifica se o componente é da classe que se deseja destruir
     if Form1.Components[I] is TButton then
       //localiza seu botao criado em execução dentro do Array 
       if LocalizaCompNoArray(Form1.Components[I].Name) then
         //localizou então exclui
         Form1.Components[I].Free;
   end;
end;


Daí no momento da criação dos seus botões você então joga no Array o Name de cada botão criado.


GOSTEI 0
Adriano Santos

Adriano Santos

03/08/2005

Está dando o seguinte erro antes de apagar todos, List index out of bounds (137) Como eu resolvo este problema ?



Cara, eu digitei o código fonte direto aqui no fórum e não testei. Esse erro é quando você tah fazendo referência a um item da lista que não existe. Por exemplo uma lista de 5 itens enumeradas da seguinte forma:

0
1
2
3
4

Se tentar acessar o iten 5 não vai conseguir, pois a lista começa em 0, ou seja, o item cinco é o numero 4. Por isso da esse erro.


GOSTEI 0
Massuda

Massuda

03/08/2005

Tem um pequeno erro no código do asrsantos... como você está destruindo os componentes contidos no form, o valor de Form1.ComponentCount varia durante a execução do loop, o que faz que nem todos os componentes sejam testados e possibilita ocorrer o ´index out of bounds´... mude o loop para...
...
   for I := Form1.ComponentCount-1 downto 0 do
...

//não sei se vai funcionar só com o Free //talvez tenha que usar o Destroy junto com o Nil
Com relação à dúvida sobre Free vs Destroy, basta usar o Free; indiretamente ele executa o Destroy.

Sobre como diferenciar um componente criado em tempo de execução de um criado em tempo de projeto via IDE, um dos modos de diferenciar um do outro é convencionar que, ao criar um componente em tempo de execução, utiliza um determinado nome sequencial ou não utiliza nome algum (por nome entenda a propriedade Name).


GOSTEI 0
Adriano Santos

Adriano Santos

03/08/2005

Tem um pequeno erro no código do asrsantos... como você está destruindo os componentes contidos no form, o valor de Form1.ComponentCount varia durante a execução do loop, o que faz que nem todos os componentes sejam testados e possibilita ocorrer o ´index out of bounds´... mude o loop para...
...
   for I := Form1.ComponentCount-1 downto 0 do
...


O Massuda tem razão, até mesmo porque o ComponentCount vai diminuir a cada exclusão de componente.

Com relação à dúvida sobre Free vs Destroy, basta usar o Free; indiretamente ele executa o Destroy.


Em relação a isso, eu sei que o Free chama o Destroy, mas confesso que nem me passou pela cabeça na hora de responder...rs.

Sobre como diferenciar um componente criado em tempo de execução de um criado em tempo de projeto via IDE, um dos modos de diferenciar um do outro é convencionar que, ao criar um componente em tempo de execução, utiliza um determinado nome sequencial ou não utiliza nome algum (por nome entenda a propriedade Name).


Cada um tem uma forma de diferenciar. A forma que mencionei foi baseada na resposta do amigo [b:cb70e68f07]ivanh[/b:cb70e68f07]. Existem outras formas como a mencionada pelo [b:cb70e68f07]Massuda[/b:cb70e68f07], ou por exemplo tomar como regra mudar a propriedade Tag do compoente criado em Execução para diferenciar dos demais.


GOSTEI 0
POSTAR