deio 0 Denunciar post Postado Novembro 29, 2007 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
deio 0 Denunciar post Postado Novembro 30, 2007 alguem? Compartilhar este post Link para o post Compartilhar em outros sites
rvlira 0 Denunciar post Postado Dezembro 1, 2007 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
deio 0 Denunciar post Postado Dezembro 10, 2007 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
rvlira 0 Denunciar post Postado Dezembro 10, 2007 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
deio 0 Denunciar post Postado Dezembro 11, 2007 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
rvlira 0 Denunciar post Postado Dezembro 11, 2007 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
deio 0 Denunciar post Postado Dezembro 11, 2007 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