Esse exemplo é legal, vejo isso todos os dias na televisao.. nao sabia q eles 
eram
programadores... hehehehehe.. so se fala em carro bomba... heheheheh
  ----- Original Message ----- 
  From: WILLER 
  To: delphi-br@yahoogrupos.com.br 
  Sent: Thursday, September 21, 2006 9:27 AM
  Subject: Re: [delphi-br] Erro de acesso à memória


  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]

   


------------------------------------------------------------------------------


  No virus found in this incoming message.
  Checked by AVG Free Edition.
  Version: 7.1.405 / Virus Database: 268.12.4/449 - Release Date: 15/9/2006


[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