Criando Comp em Execução - Comportamento Estranho do D7

Delphi

14/07/2009

Olá,

Estou tentando executar uma rotina bem simples, mas não consigo fazer o que eu quero.
Preciso apenas criar um tPanel em tempo de execução, mas, para que não seja instanciado várias vezes, preciso verificar antes se ele já foi criado.
Numa aplicação nova fiz o seguinte:
Coloquei um tbutton e, no onClick dele, coloquei a rotina (não fiz mais nada além disso):
procedure TForm1.Button1Click(Sender: TObject);
Var
VPanel : TPanel;
begin
if not Assigned(VPanel) then
begin
VPanel := Tpanel.Create(application);
VPanel.Parent := Form1;
end
else
begin
showMessage(vpanel.Caption);
vpanel.Free;
end;
end;

O problema é que a aplicação está assumindo como VPanel o botão (tButton) que chamou a rotina. O resultado do showMessage, por exemplo é ´button1´, ou seja, mostra o caption do botão e o botão some, ou seja, é destruído pelo vpanel.free.

Alguém tem alguma dica de onde estou errando?

Obrigado.


Armindo

Armindo

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

14/07/2009

não sei dizer porque o sistema está assumindo o botão, mas sei dizer que sua verificação não dará certo, porque a variável é local e VPanel nunca estará criada.

o correto é você mover a declaração da variável VPanel para a seção private do seu form e daí tudo passará a funcionar como você precisa.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    VPanel: TPanel;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(VPanel) then
  begin
    VPanel := Tpanel.Create(application);
    Vpanel.Caption := ´TESTE VPANEL´;
    VPanel.Parent := Form1;
  end
  else
  begin
    showMessage(Vpanel.Caption);
    FreeAndNil(Vpanel);
  end;
end;

end.


agora, o fato de o programa assumir que VPanel é o botão creio ser um BUG.


GOSTEI 0
Armindo

Armindo

14/07/2009

não sei dizer porque o sistema está assumindo o botão, mas sei dizer que sua verificação não dará certo, porque a variável é local e VPanel nunca estará criada. o correto é você mover a declaração da variável VPanel para a seção private do seu form e daí tudo passará a funcionar como você precisa.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    VPanel: TPanel;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(VPanel) then
  begin
    VPanel := Tpanel.Create(application);
    Vpanel.Caption := ´TESTE VPANEL´;
    VPanel.Parent := Form1;
  end
  else
  begin
    showMessage(Vpanel.Caption);
    FreeAndNil(Vpanel);
  end;
end;

end.
agora, o fato de o programa assumir que VPanel é o botão creio ser um BUG.


Obrigado pela dica emerson. Declarando a varíavel onde você sugeriu, funcionou beleza.


GOSTEI 0
POSTAR