GARANTIR DESCONTO

Fórum como destruir objeto de um componente ? #338054

20/02/2007

0

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.


Exxpert

Exxpert

Responder

Posts

20/02/2007

Massuda

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.
if Assigned(SeuObjeto) then begin
  SeuObjeto.Free;
  SeuObjeto := nil;
end
Você pode também usar FreeAndNil(), mas certifique-se que o objeto passado ao FreeAndNil() não é nil.


Responder

Gostei + 0

20/02/2007

Exxpert

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.
if Assigned(SeuObjeto) then begin
  SeuObjeto.Free;
  SeuObjeto := nil;
end
Você pode também usar FreeAndNil(), mas certifique-se que o objeto passado ao FreeAndNil() não é nil.


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.


Responder

Gostei + 0

20/02/2007

Massuda

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).


Responder

Gostei + 0

20/02/2007

Exxpert

[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.


Responder

Gostei + 0

20/02/2007

Massuda

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.


Responder

Gostei + 0

20/02/2007

Exxpert

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar