Ir para conteúdo

POWERED BY:

Arquivado

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

deio

Codigo pra verificar se há componentes no form

Recommended Posts

ola a todos, tenho um codigo q cria componentes em um form secundario, mas ao fechar o form e executar o codigo novamente o programa da erro e avisa q um componente com esse nome ja foi criado.

 

as duas soluções q achei para isso entaum são : ter um comando q ver se há algum componente nesse segundo form, ou um comando q delete esses componentes...

 

alguém sabe algum comando q faça isso, verificar se há componente ou deletá-los?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que acontece é o seguinte: quando o form fecha você aparentemente não está liberando o form da memória. Por isso os componentes continuam criados. Como você está criando os componentes em tempo de execução? Os componentes são visuais?

 

Se após exibir o form, você der um FreeAndNil nele deve resolver, mas dependendo da forma como você cria os componentes pode ser necessário dar um FreeAndNil nele ou o form pode fazer isso por você...

 

Qualquer dúvida, poste aqui de novo.

 

t+!

Compartilhar este post


Link para o post
Compartilhar em outros sites

oi, desculpa a demora da resposta, fiquei sem computador esse tempo, sim , os componentes sao criados em tempo de execução....

vou explicar basicamente o q o meu programa faz, dai a gente tenta achar a solução XD

 

o meu programa vai abrir uma tabela com a extensão .dbf, como pode ser qualquer tabela com essa extensão o numero de colunas nessa tabela pode variar para a outra, por isso o form naum tem um numero definido de componentes, e por isso ele criado em tempo de execução...

o comando eh ativado qndo o usuario da um clique duplo sobre uma linha da tabela, dai abre o form com os componentes q correspondem ao nome da coluna e a informação contida na linha e no final após criar todos os componentes o programa cria um tdbnavigator para caso o usuario queira ver a proxima linha...

 

oq acontece é o seguinte, após abrir o form e ter criado os componentes, ao ser fechado e executado a função novamente o programa avisa q os componentes ja foram criados e da um erro ( pois a função tentaria cria-los novamente com o mesmo nome)...

 

entaum as duas possiveis soluções seriam :

 

1) criar um comando para verificar se existe um desses (ou todos) componentes no form : TLabel, TDBEdit ou TDBNavigator, com isso é só colocar uma condição no comando para ao invés de tentar criá-los novamente, só modificasse as suas propriedades ( dbedit.text e label.caption)

 

ou

 

2)Deletar/excluir/eliminar os componentes para q possam ser criados novamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, é o que eu havia dito mesmo. A melhor opção seria a número 2, creio eu.

 

Para isso, após fechar o form você deve executar o comando FreeAndNil(NOME_DO_FORM) para liberá-lo da memória.

Mas tem o seguinte: qual o código que você usa para criar os componentes em tempo de execução?

 

Porque se você fizer: Componente := TComponente.Create(nil)

não vai adiantar nada dar FreeAndNil no form porque o componente continuará criado.

Nesse caso além de executar FreeAndNil(NOME_DO_FORM) você deve executar FreeAndNil(NOME_DO_COMPONENTE).

 

Se você usa Componente := TComponente.Create(Form1)

então FreeAndNil(NOME_DO_FORM) resolverá o problema porque ao liberar a memória do form ele mesmo se encarregará de liberar a memória desse componente.

 

Caso você prefira verificar se um componente já existe basta verificar:

 

if FindComponent('NOME_DO_COMPONENTE')<>nil then

ShowMessage('Esse componente já existe!')

else ShowMessage('Esse componente não existe!');

 

Mas... liberar a memória é mais aconselhável visto que da outra forma você corre o risco de não liberar em momento nenhum a memória e acabar sobrecarregando o computador...

 

t+!

Compartilhar este post


Link para o post
Compartilhar em outros sites

vou testar aki entaum, e repondo como ficou XD

 

testei e naum funcionou, vou colocar o codigo q estou usando para criar os componentes :

 

procedure TForm1.RecordView1Click(Sender: TObject);
var
n,i : integer;
begin
  for i := 0 to ComponentCount -1 do
	begin
	  if Components[i] is TDbedit then
		 begin
			if Components[i] is TDbedit then
			   begin
				 TDbedit(Components[i]).datasource := datamodule6.datasource1;
				 TDbedit(Components[i]).datafield := datamodule6.dbf1.FieldDefs.Items[n-1].Name;
			   end;
			if Components[i] is Tlabel then
			   begin
				  Tlabel(Components[i]).caption:= datamodule6.dbf1.FieldDefs[n-1].Name;
			   end;
		 end;
	  if i=0 then
   Begin
	  for n:=1 to datamodule6.dbf1.FieldCount do
		begin
		inc(n2, 24);
		 with TDBEdit.Create(self) do
		  begin
			parent := form2;
			name := 'dbedit'+ inttostr(n);
			datasource := datamodule6.datasource1;
			datafield := datamodule6.dbf1.FieldDefs.Items[n-1].Name;
			left := 125;
			top := 2 + n2;
			width := 297;
		  end;
		with Tlabel.create (self) do
		  begin
			parent := form2;
			caption:= datamodule6.dbf1.FieldDefs[n-1].Name;
			name := 'label'+inttostr(n+3);
			top := 4 + n2;
			left := 40;
		  end;
		with form2 do
		  begin
			width := 500;
			height:= height +24;
		  end;
	end;
 if datamodule6.dbf1.FieldCount > 0 then
  begin
	with Tdbnavigator.Create(self) do
	  begin
		parent := form2;
		datasource := datamodule6.datasource1;
		top := 35 + n2;
		name := 'dbnavigator1';
		left := 125;
	  end;
	end;
form2.show;
end;
end;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok. Vamos por partes.

 

1) Em que momento o Form2 é criado?

 

2) O Form2 precisa ser exibido com o comando "Show"? Não poderia ser "ShowModal"?

 

3) Existe algum código no evento OnClose e/ou OnDestroy do Form2?

 

t+!

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) naum lembro o nome agora, eh o outro tempo, tem o tempo de execução e esse outro q eu naum lembro >.<

2) qual a diferença?

3) nenhum evento....

 

(deu pra perceber q naum entendo muito de termos utilizados em programação...)

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.