Destruir componente com parent
Olá
Estou usando uma rotina para colocar dentro de um pagecontrol um tabshet com um formulário:
A criação do form é feita corretamente e a nova aba é criada e apresenta o form em questão. Minha dúvida é para fechar o form e destruir essa nova aba criada. Coloquei um botão no form, mas não consegui fecha-lo se um Access violation...
Obrigado pela ajuda
Sanses
Estou usando uma rotina para colocar dentro de um pagecontrol um tabshet com um formulário:
public
{ Public declarations }
t : ttabsheet;
...
begin
if t = nil then
begin
t := ttabsheet.Create(PageControl1);
t.Caption:= ´Usuários´;
t.PageControl := pagecontrol1;
with tform1.create(t) do
begin
borderstyle := bsnone;
align := alclient;
parent := t;
show;
pagecontrol1.ActivePage := t;
end;
end
else
begin
pagecontrol1.ActivePage := t;
end;
end;
A criação do form é feita corretamente e a nova aba é criada e apresenta o form em questão. Minha dúvida é para fechar o form e destruir essa nova aba criada. Coloquei um botão no form, mas não consegui fecha-lo se um Access violation...
Obrigado pela ajuda
Sanses
Sanses
Curtidas 0
Respostas
Massuda
11/03/2005
A criação do form é feita corretamente e a nova aba é criada e apresenta o form em questão. Minha dúvida é para fechar o form e destruir essa nova aba criada. Coloquei um botão no form, mas não consegui fecha-lo se um Access violation...
A princípio, como a TabSheet e o form que você está embutindo nessa TabSheet tem Owner (o parâmetro do Create), você não precisaria destruir esses objetos; eles são destruídos automaticamente quando o PageControl é destruído. Experimente deixar o form que contem o PageControl destruir todo o conteúdo.A questão do Parent não deve influir nesse problema, já que o Parent está relacionado com a ordem de exibição dos objetos (quem é exibido em cima de quem).
GOSTEI 0
E_gama
11/03/2005
Como vc está fechando o Form?
no clique do botão pode simplesmente colocar:
Parent.Free;
Pois, quando vc destroy um objeto, todos os objetos ´child´ também são destruídos...
no clique do botão pode simplesmente colocar:
Parent.Free;
Pois, quando vc destroy um objeto, todos os objetos ´child´ também são destruídos...
GOSTEI 0
Sanses
11/03/2005
Olá
Nas duas dicas acima, continua dando erro de aceess violation, porém na dica do e_game, o tabshet em questão é realmente destruído ficando só o que é criado na criação do form principal. Já na dica do Massuda, ele me fecha todo o page control, e preciso que ele feche apenas o tabshet criado com o formulário em questão.
Obrigado pela ajuda
Sanses
Nas duas dicas acima, continua dando erro de aceess violation, porém na dica do e_game, o tabshet em questão é realmente destruído ficando só o que é criado na criação do form principal. Já na dica do Massuda, ele me fecha todo o page control, e preciso que ele feche apenas o tabshet criado com o formulário em questão.
Obrigado pela ajuda
Sanses
GOSTEI 0
Massuda
11/03/2005
... preciso que ele feche apenas o tabshet criado com o formulário em questão ...
Pelo que entendi você está criando e destruindo as tabsheets, mantendo o pagecontrol (e o resto do form).Nesse caso, antes de destruir a tabsheet, você está ajustando pagecontrol.activepage para um outra página que não seja a que vai ser destruída?
GOSTEI 0
Sanses
11/03/2005
Oi
Tentei assim agora, mas tb não consegui:
dá erro de access violation, mesmo jogando o foco para a aba principal que não está sendo destruida e é criada junto com a aplicação.
Obrigado pelo empenho
Sanses
Tentei assim agora, mas tb não consegui:
frmprincipal.PageControl1.ActivePageindex:= 0; frmprincipal.t.Free; frmprincipal.t:=nil;
dá erro de access violation, mesmo jogando o foco para a aba principal que não está sendo destruida e é criada junto com a aplicação.
Obrigado pelo empenho
Sanses
GOSTEI 0
Sanses
11/03/2005
up :(
GOSTEI 0
Massuda
11/03/2005
Experimentei criar um projeto usando seu código, mas comigo não ocorre AV; consigo inserir e remover a tabsheet com um form embutido sem problemas.TForm2 é um form contendo alguns componentes e nada mais.
Não tenho idéia do que pode estar acontecendo com você.
type TForm1 = class(TForm) ... private Tab: TTabSheet; ... // botão para criar a tabsheet procedure TForm1.Novo1Click(Sender: TObject); begin if Tab = nil then begin Tab := TTabSheet.Create(PageControl1); Tab.Caption := ´Teste´; Tab.PageControl := PageControl1; with TForm2.Create(Tab) do begin Parent := Tab; BorderStyle := bsNone; Align := alClient; Show; end; end; PageControl1.ActivePage := Tab; end; // botão para destruir a tabsheet procedure TForm1.Destruir1Click(Sender: TObject); begin if Tab <> nil then begin PageControl1.ActivePageIndex := 0; FreeAndNil(Tab); end; end;
Não tenho idéia do que pode estar acontecendo com você.
GOSTEI 0
Sanses
11/03/2005
Correto!! Mas o que eu esqueci de dizer talvez, foi que este button que fecha o form está no form 2 no caso e não no form 1 que o chamou. Ele teria que fechar o formulário e o tabsheet criado. É claro que é por isso que dá erro, access violation, mas estou passando o controle para outro tabsheet que continuará aberto.....a meu ver tinha que funcionar
:( :(
:( :(
GOSTEI 0
Sanses
11/03/2005
OK, vou mudar algumas coisas aqui, mais tenho mais uma duvida: tem como eu criar um procedimento ou função que receba apenas o form a ser criado. Neste caso eu teria a declaração de criação apenas uma vez e nos botões eu apenas passaria o form a ser criado, evitando digitar o mesmo código várias vezes. Tentei fazer mais não consegui...
no button1
novoform( [b:b6b43f43e9]form[/b:b6b43f43e9])
button2
novoform( [b:b6b43f43e9]form1[/b:b6b43f43e9])
e a função seria assim
function Novoform(form : tform);
begin
if Tab = nil then begin
Tab := TTabSheet.Create(PageControl1);
Tab.Caption := ´Teste´;
Tab.PageControl := PageControl1;
with [b:b6b43f43e9]Form[/b:b6b43f43e9].Create(Tab) do begin
Parent := Tab;
BorderStyle := bsNone;
Align := alClient;
Show;
end;
end;
PageControl1.ActivePage := Tab;
end;
Sanses
no button1
novoform( [b:b6b43f43e9]form[/b:b6b43f43e9])
button2
novoform( [b:b6b43f43e9]form1[/b:b6b43f43e9])
e a função seria assim
function Novoform(form : tform);
begin
if Tab = nil then begin
Tab := TTabSheet.Create(PageControl1);
Tab.Caption := ´Teste´;
Tab.PageControl := PageControl1;
with [b:b6b43f43e9]Form[/b:b6b43f43e9].Create(Tab) do begin
Parent := Tab;
BorderStyle := bsNone;
Align := alClient;
Show;
end;
end;
PageControl1.ActivePage := Tab;
end;
Sanses
GOSTEI 0
Sanses
11/03/2005
UP
GOSTEI 0