Muito simples, você esta tendo dentro de um metodo ( função ou 
procedimento ) destruir o objeto que chamou este metodo. Por tanto 
quando ele sai do metodo o objeto não existe mais.

Um exemplo bem tosco seria você é um objeto, você entra dentro de um 
carro e explode o carro, como você vai sair do carro depois da explosão 
? Você não sai, você é destruido na explosão.


Eduardo

WILLER escreveu:
> Legal, funcionou. Só não entendi porque dá erro quando não uso o 
> timer. Se eu coloco o código todo no click do botão dá erro por quê?
>   ----- Original Message -----
>   From: Eduardo
>   To: delphi-br@yahoogrupos.com.br
>   Sent: Wednesday, September 20, 2006 10:11 AM
>   Subject: Re: [delphi-br] Erro de acesso à memória
>
>
>   Ve se é isso que vc quer.
>
>   unit Unit1;
>
>   interface
>
>   uses
>     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
> Dialogs,
>     ExtCtrls, StdCtrls, Menus;
>
>   type
>     TForm1 = class(TForm)
>       Timer1: TTimer;
>       procedure Timer1Timer(Sender: TObject);
>       procedure FormContextPopup(Sender: TObject; MousePos: TPoint;
>         var Handled: Boolean);
>       procedure FormCreate(Sender: TObject);
>       procedure Button1Click(Sender: TObject);
>     private
>       { Private declarations }
>     public
>       { Public declarations }
>       vNome     : Integer;
>       vEndereco : Integer;
>     end;
>
>   var
>     Form1: TForm1;
>
>   implementation
>
>   {$R *.DFM}
>
>   procedure TForm1.Timer1Timer(Sender: TObject);
>   begin
>
>      if TButton(vEndereco) <> Nil then
>         FreeAndNil(TButton(vEndereco));
>      Timer1.Enabled := False;
>
>   end;
>
>   procedure TForm1.FormContextPopup(Sender: TObject; MousePos: TPoint; 
> var
>   Handled: Boolean);
>   var
>      MyBtn : TButton;
>   begin
>       MyBtn := TButton.Create(Self);
>       with MyBtn do
>       begin
>         Inc(vNome);
>         name:='b'+inttostr(vNome);
>         Parent:=Form1;
>         left:=mousepos.x;
>         top:=mousepos.y;
>         caption:='s';
>         OnClick := Button1Click;
>         Tag := Integer(MyBtn); //Guardo na tag o endereço de memória 
> do obj
>       end;
>     end;
>
>   procedure TForm1.FormCreate(Sender: TObject);
>   begin
>
>      vNome := 0;
>
>   end;
>
>   procedure TForm1.Button1Click(Sender: TObject);
>   begin
>
>      if Sender is TButton then
>      begin
>         vEndereco := TButton(Sender).Tag;
>         Timer1.Enabled := True;
>      end;
>
>   end;
>
>   end.
>
>
>   Testei aqui com o intervalo do Timer de 500. Voce tb pode criar uma
>   lista e assim procurando os objetos da lista para destruir.
>   Eu só tinha esquecido ontem quando fiz o exemplo do detalhe fundamental
>   de quem estava chamando este obj. Me desculpe não prestei a atenção 
> devida.
>
>   Eduardo
>
>   WILLER escreveu:
>   > Essa linha não funcionou:
>   >     FreeAndNil(TButton(TButton(Sender).Tag));
>   > O Compilador dá uma mensagem dizendo: Constat objetc cannot be passed
>   > as var parameter.
>   >
>   >
>   >   ----- Original Message -----
>   >   From: Eduardo
>   >   To: delphi-br@yahoogrupos.com.br
>   >   Sent: Tuesday, September 19, 2006 2:17 PM
>   >   Subject: Re: [delphi-br] Erro de acesso à memória
>   >
>   >
>   >   Exatamente onde está o erro eu não sei, mas vai uma dica.
>   >
>   >   procedure TForm1.FormContextPopup(Sender: TObject; MousePos: TPoint;
>   >     var Handled: Boolean);
>   >     var
>   >       MyBtn : TButton;
>   >       xx:string;
>   >   begin
>   >     MyBtn := TButton.Create(Self);
>   >     with MyBtn do
>   >     begin
>   >       name:='b'+inttostr(i);
>   >       Parent:=Form1;
>   >       left:=mousepos.x;
>   >       top:=mousepos.y;
>   >       caption:='s';
>   >       OnClick:=Button1OnClick;
>   >       Tag := Integer(MyBtn); //Guardo na tag o endereço de memória 
> do obj
>   >       i:=i+1;
>   >     end;
>   >   end;
>   >
>   >   procedure TForm1.Button1Click(Sender: TObject);
>   >   begin
>   >
>   >      if Sender is TButton then
>   >      begin
>   >         //Não preciso testar se o obj existe por q se ele não 
> existe eu
>   >   não chegava aqui !!!
>   >         FreeAndNil(TButton(TButton(Sender).Tag));
>   >      end;
>   >
>   >   end;
>   >
>   >
>   >   Eduardo
>   >
>   >
>   >   WILLER escreveu:
>   >   > Foi exatamente o que fiz, o erro ocorre ao destruir o objeto.
>   >   >   ----- Original Message -----
>   >   >   From: Rubem Nascimento da Rocha
>   >   >   To: delphi-br@yahoogrupos.com.br
>   >   >   Sent: Tuesday, September 19, 2006 1:11 PM
>   >   >   Subject: RE: [delphi-br] Erro de acesso à memória
>   >   >
>   >   >
>   >   >   { o código correto para FormContextPopup }
>   >   >   procedure TForm1.FormContextPopup(Sender: TObject; MousePos: 
> TPoint;
>   >   >     var Handled: Boolean);
>   >   >     var xx:string;
>   >   >   begin
>   >   >     with TButton.Create(Self) do begin
>   >   >       name:='b'+inttostr(i);
>   >   >       Parent:=Form1;
>   >   >       left:=mousepos.x;
>   >   >       top:=mousepos.y;
>   >   >       caption:='s';
>   >   >       OnClick:=Button1OnClick;
>   >   >       i:=i+1;
>   >   >     end;
>   >   >   end;
>   >   >
>   >   >
>   >   >
>   >   >   >From: "WILLER" <[EMAIL PROTECTED]>
>   >   >   >Reply-To: delphi-br@yahoogrupos.com.br
>   >   >   >To: <delphi-br@yahoogrupos.com.br>
>   >   >   >Subject: [delphi-br] Erro de acesso à memória
>   >   >   >Date: Tue, 19 Sep 2006 10:04:49 -0300
>   >   >   >
>   >   >   >Esse programa deveria, a cada clique com o botão direito do 
> mouse,
>   >   > criar um
>   >   >   >botão. E cada botão, ao receber um clique deveria ser 
> destruído.
>   >   >   >Quando crio um botão e o destruo em seguida, não dá erro. O 
> erro
>   >   > ocorre
>   >   >   >quando crio mais de um botão e depois tento destruí-lo.
>   >   >   >Alguém poderia me ajudar, me dar uma dica ou indicar onde 
> errei?
>   >   >   >
>   >   >   >
>   >   >   >
>   >   >   >unit Unit1;
>   >   >   >
>   >   >   >interface
>   >   >   >
>   >   >   >uses
>   >   >   >   Windows, Messages, SysUtils, Variants, Classes, Graphics,
>   > Controls,
>   >   >   >Forms,
>   >   >   >   Dialogs, StdCtrls;
>   >   >   >
>   >   >   >
>   >   >   >type
>   >   >   >   TForm1 = class(TForm)
>   >   >   >     Button1: TButton;
>   >   >   >     procedure FormContextPopup(Sender: TObject; MousePos: 
> TPoint;
>   >   >   >       var Handled: Boolean);
>   >   >   >     procedure Button1Click(Sender: TObject);
>   >   >   >   private
>   >   >   >     { Private declarations }
>   >   >   >   public
>   >   >   >     j:TButton;
>   >   >   >     i:integer;
>   >   >   >     { Public declarations }
>   >   >   >   end;
>   >   >   >
>   >   >   >
>   >   >   >
>   >   >   >var
>   >   >   >   Form1: TForm1;
>   >   >   >
>   >   >   >implementation
>   >   >   >
>   >   >   >uses Types;
>   >   >   >
>   >   >   >{$R *.dfm}
>   >   >   >
>   >   >   >procedure TForm1.FormContextPopup(Sender: TObject; MousePos:
>   > TPoint;
>   >   >   >   var Handled: Boolean);
>   >   >   >   var xx:string;
>   >   >   >begin
>   >   >   >   with TButton.Create(Self) do begin
>   >   >   >     name:='b'+inttostr(i);
>   >   >   >     Parent:=Form1;
>   >   >   >     left:=mousepos.x;
>   >   >   >     top:=mousepos.y;
>   >   >   >     caption:='s';
>   >   >   >     OnClick:=Button1.OnClick;
>   >   >   >     i:=i+1;
>   >   >   >   end;
>   >   >   >end;
>   >   >   >
>   >   >   >procedure TForm1.Button1Click(Sender: TObject);
>   >   >   >begin
>   >   >   >   if sender is TButton then begin
>   >   >   >     if assigned( TButton(sender)) then begin
>   >   >   >       FreeAndNil(TButton(Sender));
>   >   >   >     end;
>   >   >   >   end;
>   >   >   >
>   >   >   >end;
>   >   >   >
>   >   >   >end.
>   >   >   >
>   >   >   >[As partes desta mensagem que não continham texto foram 
> removidas]
>   >   >   >
>   >   >
>   >   >   
> _________________________________________________________________
>   >   >   MSN Busca: fácil, rápido, direto ao ponto.  
> http://search.msn.com.br
>   >   >
>   >   > 
>   >   >
>   >   > [As partes desta mensagem que não continham texto foram removidas]
>   >   >
>   >   >
>   >
>   >
>   >             
>   >   _______________________________________________________
>   >   Novidade no Yahoo! Mail: receba alertas de novas mensagens no seu
>   > celular. Registre seu aparelho agora!
>   >   http://br.mobile.yahoo.com/mailalertas/
>   >
>   >
>   >  
>   >
>   > [As partes desta mensagem que não continham texto foram removidas]
>   >
>   > 
>
>
>        
>
>        
>              
>   _______________________________________________________
>   Você quer respostas para suas perguntas? Ou você sabe muito e quer 
> compartilhar seu conhecimento? Experimente o Yahoo! Respostas !
>   http://br.answers.yahoo.com/
>   
>
>   __________ Informação do NOD32 1.1758 (20060915) __________
>
>   Esta mensagem foi verificada pelo NOD32 Sistema Antivírus
>   http://www.nod32.com.br
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  


                
_______________________________________________________ 
Yahoo! Acesso Grátis - Internet rápida e grátis. Instale 
o discador agora! 
http://br.acesso.yahoo.com


-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

<*> Para ver as mensagens antigas, acesse:
    http://br.groups.yahoo.com/group/delphi-br/messages

<*> Para falar com o moderador, envie um e-mail para:
    [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 


Responder a