Fórum Identificar se o frame foi criado dinamicamente #411215

04/01/2012

0

Boa noite. Saudações a todos, esse é meu primeiro post.

No form que criei inseri um PageControl e nele crio dinamicamente as Tabs. Quando crio uma Tab chamo um frame já existente porém não declarado no Type da classe TForm (tudo funciona normal).

O problema ocorre se o botão que chama o frame for clicado 2x, pois o objeto já criado não pode ser aberto novamente.

Pergunta: Se o frame não está declarado no TForm como faço para identificar se ele já está criado ?


Código:
procedure Tfrm_Principal.Action11Execute(Sender: TObject);
begin
  //cria o Formulário Principal
  Application.CreateForm(Tfrm_Principal, frm_Principal);
  //cria o TabSheet
  TabSheet := TTabSheet.Create(PageControl1);
  TabSheet.PageControl := PageControl1;
  TabSheet.Caption := Pessoas;
  //Carrega o frame no tab criado
  Frame := Tfra_Pessoa.Create(self);
  Frame.Parent := tabSheet;
  Frame.Align := alClient;
end;
Lucas Barbeiro

Lucas Barbeiro

Responder

Posts

05/01/2012

Alan Souza

tenta assim:

procedure Tfrm_Principal.Action11Execute(Sender: TObject);
begin
  //cria o Formulário Principal
  Application.CreateForm(Tfrm_Principal, frm_Principal);
  //cria o TabSheet
  TabSheet := TTabSheet.Create(PageControl1); 
  TabSheet.PageControl := PageControl1;
  TabSheet.Caption := Pessoas;
  //Carrega o frame no tab criado
  if not Assigned(Frame) then
  begin
    Frame := Tfra_Pessoa.Create(self);
    Frame.Parent := tabSheet;
    Frame.Align := alClient;
  end;
end;
Responder

Gostei + 0

06/01/2012

Lucas Barbeiro

Obrigado alanps, mas ainda falta um pouquinho talvez por eu ter escrito de forma errada.

Da forma que você sugeriu o frame só abre no primeiro tab, está ok. Mas ai continua a criar as tabs (Pessoas) vazias (sem o frame).

Preciso verificar se o objeto (tabsheet e/ou frame) foi criado pelo nome, assim não acontecerá o erro.

Abs
Responder

Gostei + 0

06/01/2012

Alan Souza

tenta usar a variável Frame como local, pois o que me pareceu é que você está tentando usar o Frame criado em mais de uma aba, e isso não é possível...

pode também ser feito uma lista de objetos com os frames criados, um para cada aba.
Responder

Gostei + 0

06/01/2012

Alan Souza

ou assim:

procedure Tfrm_Principal.Action11Execute(Sender: TObject);
begin
Application.CreateForm(Tfrm_Principal, frm_Principal);
TabSheet := TTabSheet.Create(PageControl1); 
TabSheet.PageControl := PageControl1;
TabSheet.Caption := Pessoas;
with Tfra_Pessoa.Create(self) do
begin
Parent := tabSheet;
Align := alClient;
end;
end;


não posso testar agora, mas costumo usar assim às vezes.
Responder

Gostei + 0

06/01/2012

Lucas Barbeiro

ok.. vou tentar colocar a variável Frame como local...

A segunda está idêntica ao código que iniciei :)

Vlw
Responder

Gostei + 0

07/01/2012

Lucas Barbeiro

Bom dia !
Ainda não consegui... :(
Responder

Gostei + 0

08/01/2012

Lucas Barbeiro

Obrigado pela ajuda.

Desenvolvi 2 soluções para o meu caso:

1 - utilizar a função
FindComponent(Nome do componente);

2 - desabilitar o botão logo após a chamada do tabsheet/frame


Essa segunda é mais simples, prática e eficiente.
Responder

Gostei + 0

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

Aceitar