Obrigado pela explicação, agora entendi o porquê do erro.

[]s
  ----- Original Message ----- 
  From: Eduardo 
  To: delphi-br@yahoogrupos.com.br 
  Sent: Wednesday, September 20, 2006 6:28 PM
  Subject: Re: [delphi-br] Erro de acesso à memória


  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 
   

  __________ Informação do NOD32 1.1764 (20060920) __________

  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]



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