Destruir componentes
Como destruir todos os componentes (tbutton) de uma só vez, que foram criados em tempo de execurção.
Grato
Grato
Zlink
Curtidas 0
Respostas
Ivanh
03/08/2005
ao cria-los poderia jogar todos em um vetor de tbutton :!:
depois basta percorrer o vetor e destruir
Ex.:
depois basta percorrer o vetor e destruir
Ex.:
vetorbotoes[i] := TButton.Create(nil);
GOSTEI 0
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
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
03/08/2005
Está dando o seguinte erro antes de apagar todos,
List index out of bounds (137)
Como eu resolvo este problema ?
List index out of bounds (137)
Como eu resolvo este problema ?
GOSTEI 0
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
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
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...
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).
... 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
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