Fórum Como liberar tabsheet criada dinamicamente? #272296
14/03/2005
0
Estou pensando em desenvolver um sistema com a interface sugerida na matéria ´Sua aplicação com visual arrojado´, da revista clube delphi edição 60.
Vi dois problemas na matéria do Luciano Pimenta:
1º: Ele coloca uma imagem de close na aba de tela de boas vindas, mas não mostra como fazer para ativar o evento ao clicar em cima da imagem.
2º: Não mostrou como fechar uma tabsheet criada dinâmicamente.
Quando tento destruir um tabsheet já existente, não dá erro, mas se tento destruir um tabsheet criado dinâmicamente, dá erro de violação de memória!
Alguém pode me ajudar?
Abraços.
Wilder_lopes
Curtir tópico
+ 0Posts
14/03/2005
Massuda
Gostei + 0
14/03/2005
Wilder_lopes
Eu já tinha pesquisado esse tópico. Ele não ajudou pq não mostrou a solução.
As dicas q deram não funcionaram para o caso do botão q acionava o fechamento do tabsheet ser no próprio tabsheet.
Fico no aguardo, se algúem puder ajudar!
abraços!
Gostei + 0
15/03/2005
Sanses
Não fosse só este problema, tem mais imagine se vc for criar 25 forms em toda a sua aplicação !!!!! Teria que repetir o código 25 vezes....
Coloquei um outro post pedindo ajuda sobre como fazer para que no evento click do botão, seja passado apenas o nome do form para aquela rotina de criação, assim seria mais enxuto e fucional. O que acha? Mas não consegui fazer isso até agora.
Quanto a fechar o tabsheet criado dinamicamente, bem acho que um objeto não pode destruir-se
Qualquer coisa estamos ai, se eu conseguir realizar o que disse acima, posto pra vc.
Sanses
Gostei + 0
15/03/2005
Wilder_lopes
Acredito que vc teria mesmo q fazer a chamada 25 vezes para o código, uma para cada clique no menu. Mas não é necessário repetir 25 vezes a mesma coisa. vc pode fazer uma função que vai receber como parâmetro o nome do form. Revi o seu tópico e vc pode fazer exatamente o seguinte:
function Novoform(pform : tform); begin if Tab = nil then begin Tab := TTabSheet.Create(PageControl1); Tab.Caption := ´Teste´; Tab.PageControl := PageControl1; with (pForm as TForm).Create(Tab) do begin Parent := Tab; BorderStyle := bsNone; Align := alClient; Show; end; end; PageControl1.ActivePage := Tab; end;
Aproveitei o seu próprio código postado e só fiz algumas alterações.
Quanto aos tabsheets, até aceito q eles não possam se fechar, mas eu fiz o seguinte:
1 - criei o tabsheet dinamicamente.
2 - no evento close dele, mudo o tabsheet com foco e chamo um procedimento no form principal para liberá-lo. no caso, o form principal é q vai tentar fechá-lo.
O estranho é que se o tabsheet não for criado dinamicamente funciona.
abraços.
[/code:1:40a2a487c3][code:1:40a2a487c3]
Gostei + 0
15/03/2005
Lucianopimenta
caso vc queira fechar o TabSheet no formulário principal, basta fazer assim:
(Form.Parent as TTabSheet).Free;
Se vc quiser fechar com um botão no Form:
(Self.Parent as TTabSheet).Free;
Gostei + 0
15/03/2005
Wilder_lopes
Muito obrigado. Funcionou.
Parabéns pela matéria!
Gostei + 0
15/03/2005
Sanses
[b]no botão:[/b] begin CriaForm(Form1); end; [b]o procedimento[/b] procedure Tfrmshservidor.CriaForm(pform: tform); begin if T = nil then begin T := TTabSheet.Create(PageControl1); T.Caption := ´Teste´; T.PageControl := PageControl1; with (pForm as TForm).Create(T) do begin Parent := T; BorderStyle := bsNone; Align := alClient; Show; end; end; PageControl1.ActivePage := T; end;
mas dá access violation.
E quanto a dica do luciano, não entendi direito como colocar aquele comando no form que será fechado...
Agradeço a ajuda
Sanses
Gostei + 0
15/03/2005
Massuda
Tenho a impressão que o problema todo é o membro T usado para saber se o tabsheet já foi criado e que o AV ocorre na segunda vez que tenta criar o tabsheet.
Se for isso, no código que destrói o seu tabsheet, tem como você fazer algo do tipo
SeuForm.T := nil;
Gostei + 0
15/03/2005
Sanses
Obrigado pela atenção
Sanses
Gostei + 0
15/03/2005
Sanses
Debugando a aplicação notei que o erro ocorre por causa do Tform e Form. no exemplo do Wilder se for passado form1 por exemplo não funciona (AV) e se for passado Tform1 funciona, porém não consegui fazer esta passagem de parametros atravez de tform
erro:
with (pForm as TForm).Create(T) do
era pra realizar a passagem do form para Tform, mas não está passando
Aguardo ajuda
Obrigado
Sanses
Gostei + 0
15/03/2005
Massuda
Para evitar isso, experimente criar o form pela classe dele...
procedure CriaForm(AClass: TFormClass); begin if T = nil then begin T := TTabSheet.Create(PageControl1); T.Caption := ´Teste´; T.PageControl := PageControl1; with AClass.Create(T) do begin Parent := T; BorderStyle := bsNone; Align := alClient; Show; end; end; PageControl1.ActivePage := T; end;
Quanto ao AV ao destruir o tabsheet... seu pagecontrol contem apenas tabsheet criadas dinamicamente?
Gostei + 0
15/03/2005
Sanses
O pagecontrol tem somente 1 tabsheet criado na inicialização, não dinâmico, mas serão um total de 3 ao final do projeto. O restante será dinâmico.
Sanses
Gostei + 0
15/03/2005
Sanses
Mais uma coisa, se não for abusar da sua boa vontade, sobre a dica do Luciano para fechar o form pelo proprio form, eu não entendi onde será colocado o código, pois se for colocado no form 1 não compila, vc tem idéia de como fazer??
Mais uma vez obrigado por sua ajuda. Resolveu o principal problema do tópico.
Sanses
Gostei + 0
15/03/2005
Massuda
(Self.Parent as TTabSheet).Free;
FreeAndNil(SeuForm.T);
Gostei + 0
15/03/2005
Sanses
alias, nem o T nem o pagecontrol....
Sanses
Ps. hoje eu xuto o barde!!!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)