Identificar se o frame foi criado dinamicamente
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:
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
Curtidas 0
Respostas
Alan Souza
04/01/2012
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;
GOSTEI 0
Lucas Barbeiro
04/01/2012
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
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
GOSTEI 0
Alan Souza
04/01/2012
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.
pode também ser feito uma lista de objetos com os frames criados, um para cada aba.
GOSTEI 0
Alan Souza
04/01/2012
ou assim:
não posso testar agora, mas costumo usar assim às vezes.
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.
GOSTEI 0
Lucas Barbeiro
04/01/2012
ok.. vou tentar colocar a variável Frame como local...
A segunda está idêntica ao código que iniciei :)
Vlw
A segunda está idêntica ao código que iniciei :)
Vlw
GOSTEI 0
Lucas Barbeiro
04/01/2012
Bom dia !
Ainda não consegui... :(
Ainda não consegui... :(
GOSTEI 0
Lucas Barbeiro
04/01/2012
Obrigado pela ajuda.
Desenvolvi 2 soluções para o meu caso:
1 - utilizar a função
2 - desabilitar o botão logo após a chamada do tabsheet/frame
Essa segunda é mais simples, prática e eficiente.
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.
GOSTEI 0