Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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?
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+!
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
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+!
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;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+!
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...)
alguem?