GARANTIR DESCONTO

Fórum Destruir componente com parent #271874

11/03/2005

0

Olá

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

Sanses

Responder

Posts

11/03/2005

Massuda

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).


Responder

Gostei + 0

11/03/2005

E_gama

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...


Responder

Gostei + 0

11/03/2005

Sanses

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


Responder

Gostei + 0

11/03/2005

Massuda

... 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?


Responder

Gostei + 0

11/03/2005

Sanses

Oi

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


Responder

Gostei + 0

11/03/2005

Sanses

up :(


Responder

Gostei + 0

11/03/2005

Massuda

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.
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;
TForm2 é um form contendo alguns componentes e nada mais.

Não tenho idéia do que pode estar acontecendo com você.


Responder

Gostei + 0

12/03/2005

Sanses

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

:( :(


Responder

Gostei + 0

14/03/2005

Sanses

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


Responder

Gostei + 0

15/03/2005

Sanses

UP


Responder

Gostei + 0

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

Aceitar