como destruir objeto de um componente ?
Boa Tarde Galera,
Estou desenvolvendo um componente nele crio um objeto quanto uma propriedade no Object Insperctor é mudada para TRUE, até aí tudo ok, o problema é quando muda para FALSE eu tenho q destruir esse objeto, mas não da certo sempre da erro.
Eu testo se objeto já foi criado assim
if Assigned(Objeto) then
E já tentei destruir com Destroy ( ele até destroi mas some o componente também), tentei o Objeto.Destroy (da erro), FreeAndNil(Objeto) mas retorna erro também...
Alguem sabe alguma dica para esses casos ??
Obrigado.
Aguardo resposta.
Estou desenvolvendo um componente nele crio um objeto quanto uma propriedade no Object Insperctor é mudada para TRUE, até aí tudo ok, o problema é quando muda para FALSE eu tenho q destruir esse objeto, mas não da certo sempre da erro.
Eu testo se objeto já foi criado assim
if Assigned(Objeto) then
E já tentei destruir com Destroy ( ele até destroi mas some o componente também), tentei o Objeto.Destroy (da erro), FreeAndNil(Objeto) mas retorna erro também...
Alguem sabe alguma dica para esses casos ??
Obrigado.
Aguardo resposta.
Exxpert
Curtidas 0
Respostas
Massuda
20/02/2007
Quando destruir o objeto (com Free), atribua nil à variável, ja que a simples ação de destruir o objeto não anula eventuasi referencias que existam a ele.Você pode também usar FreeAndNil(), mas certifique-se que o objeto passado ao FreeAndNil() não é nil.
if Assigned(SeuObjeto) then begin SeuObjeto.Free; SeuObjeto := nil; end
GOSTEI 0
Exxpert
20/02/2007
Quando destruir o objeto (com Free), atribua nil à variável, ja que a simples ação de destruir o objeto não anula eventuasi referencias que existam a ele.Você pode também usar FreeAndNil(), mas certifique-se que o objeto passado ao FreeAndNil() não é nil.
if Assigned(SeuObjeto) then begin SeuObjeto.Free; SeuObjeto := nil; end
Tudo bem Massuda,
Fiz como você disse mas continua dando erro:
Acess violation at adress 400057B0 in module ´rtl70.bpl´. Read of adress 6AEC8B51.
Sabe oque pode estar acontendo ?
Lembrando que é um componente, ao destruir o objeto ele esta trabalhando em modo design nada executavel.
Obrigado.
Aguardando Resposta.
GOSTEI 0
Massuda
20/02/2007
Acess violation at adress 400057B0 in module ´rtl70.bpl´. Read of adress 6AEC8B51.
Isso indica que provavelmente que alguma parte do seu código faz uso de algum objeto [b:6e429bb766]depois[/b:6e429bb766] que el foi destruído (a mensagem de erro não permite dizer nada mais sobre isso).GOSTEI 0
Exxpert
20/02/2007
[quote:cd7cb855bf=´Exxpert´]Acess violation at adress 400057B0 in module ´rtl70.bpl´. Read of adress 6AEC8B51.
Isso indica que provavelmente que alguma parte do seu código faz uso de algum objeto [b:cd7cb855bf]depois[/b:cd7cb855bf] que el foi destruído (a mensagem de erro não permite dizer nada mais sobre isso).[/quote:cd7cb855bf]Pela minha analise não era para estar ocorrendo isso, mas se você puder analisar o código abaixo (só nesse trecho de código faço a utilização desse objeto), talvez consiga detectar algo que eu não estou enxergando.
procedure TRaveIntegrado.SetUsarDataSet(const Value: boolean); var rdData: TRvDataSetConnection; begin FUsarDataSet := Value; if FUsarDataSet then begin rdData := TDataSetConnection.Create(Self); rdData.Name := Name + ´Con´; rdData.RuntimeVisibility := rtDeveloper; rdData.DataSet := FligDataSource; end else begin if Assigned(rdData) then begin rdData.Free; //gera o erro que comentei aqui no post rdData := nil; end; end; end;
Obrigado Massuda.
Aguardo resposta.
GOSTEI 0
Massuda
20/02/2007
Uma das coisas estranhas nesse seu pedaço de código é que rdData é uma variável local (que ´vive´ apenas durante a execução da procedure) que você está usando para guardar um valor que aparentemente deveria ficar ´vivo´ enquanto o objeto TRaveIntegrado existir.
Outra coisa é declarar rdData como sendo de uma classe mas estar criando um objeto de uma classe diferente (possivelmente ancestral da classe correta). Isso costuma dar problemas difíceis de diagnosticar.
Outra coisa é declarar rdData como sendo de uma classe mas estar criando um objeto de uma classe diferente (possivelmente ancestral da classe correta). Isso costuma dar problemas difíceis de diagnosticar.
GOSTEI 0
Exxpert
20/02/2007
Uma das coisas estranhas nesse seu pedaço de código é que rdData é uma variável local (que ´vive´ apenas durante a execução da procedure) que você está usando para guardar um valor que aparentemente deveria ficar ´vivo´ enquanto o objeto TRaveIntegrado existir.
Outra coisa é declarar rdData como sendo de uma classe mas estar criando um objeto de uma classe diferente (possivelmente ancestral da classe correta). Isso costuma dar problemas difíceis de diagnosticar.
Massuda matou o problema era porque eu estava declarando a variável naquela procedure mesmo, eu declarei ela agora como global e esta funcionando 100¬. Obrigado.
Sobre declara rdData como de uma classe e criar como outra foi erro na hora de passar o código aqui.
Obrigado novamente.
GOSTEI 0