Evento OnShow (Cencelar aparecimento do form)

Delphi

17/12/2004

Descobrir apenas no evento Onshow que nao posso mostrar o formulario o que faço para que ele não apareca?


Joananjr

Joananjr

Curtidas 0

Melhor post

Tinorj

Tinorj

17/12/2004

Para cancelar a exibição de um form

PostMessage(Form.Handle, WM_Close, 0, 0);


Onde:
[b:555a619a37]Form[/b:555a619a37] é o nome do seu formulário atual[/b]


GOSTEI 1

Mais Respostas

Gandalf.nho

Gandalf.nho

17/12/2004

Tente fechar o form nesse evento.


GOSTEI 0
Rafs

Rafs

17/12/2004

Infelizmente não é possível chamar o método Close de dentro do evento OnShow, nem também chamar algum procedimento que feche o formulário.
Mas você podería colocar um Timer no formulário, coloque sua propriedade Interval para 1 e no evento OnTimer chame o método Close.
Daí você verifica se o formulário deve ou não ser apresentado e seta a propriedade Enabled do Timer para True ou False, conforme a necessidade


GOSTEI 0
Massuda

Massuda

17/12/2004

Infelizmente não é possível chamar o método Close de dentro do evento OnShow, nem também chamar algum procedimento que feche o formulário.[...]
Isso não está correto... na verdade dentro do evento TForm.OnShow você não pode chamar TForm.Hide nem fazer TForm.Visible := False (dá runtime error... ´Cannot change Visible in OnShow or OnHide´), mas você pode chamar TForm.Close.


GOSTEI 0
Rafs

Rafs

17/12/2004

[quote:ddd4b21b44=´Rafs´]Infelizmente não é possível chamar o método Close de dentro do evento OnShow, nem também chamar algum procedimento que feche o formulário.[...]
Isso não está correto... na verdade dentro do evento TForm.OnShow você não pode chamar TForm.Hide nem fazer TForm.Visible := False (dá runtime error... ´Cannot change Visible in OnShow or OnHide´), mas você pode chamar TForm.Close.[/quote:ddd4b21b44]
Estranho.... Testei aqui, antes de postar, e no momento em que executava o método Close me retornava o erro de que não é possível chamar Hide ou mudar a propriedade Visible. Mas veja que eu chamei o método Close.
Vou fazer o teste novamente e volto a postar....


GOSTEI 0
Rafs

Rafs

17/12/2004

Refiz o teste aqui e o que acontece é que depende de como se chama o form (Show ou ShowModal).
Chamando-o com Show ocorre o erro descrito acima, mas se chamá-lo com ShowModal o erro não ocorre, mas também o comando Close não é executado.


GOSTEI 0
Massuda

Massuda

17/12/2004

[quote:529be22614=´Massuda´][quote:529be22614=´Rafs´]Infelizmente não é possível chamar o método Close de dentro do evento OnShow, nem também chamar algum procedimento que feche o formulário.[...]
Isso não está correto... na verdade dentro do evento TForm.OnShow você não pode chamar TForm.Hide nem fazer TForm.Visible := False (dá runtime error... ´Cannot change Visible in OnShow or OnHide´), mas você pode chamar TForm.Close.[/quote:529be22614]
Estranho.... Testei aqui, antes de postar, e no momento em que executava o método Close me retornava o erro de que não é possível chamar Hide ou mudar a propriedade Visible. Mas veja que eu chamei o método Close.[/quote:529be22614]
Fiz alguns testes... na verdade, chamar TForm.Close dentro do evento TForm.OnShow dá problema [b:529be22614]a não ser que[/b:529be22614] você trate o evento TForm.OnClose e defina um valor para Action diferente de caHide (que é o default). Portanto, o código...
type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    // ...
  end;

// ...

procedure TForm1.FormShow(Sender: TObject);
begin
    Close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    Action := caFree;
end;
...funciona sem problemas enquanto este código...
type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
    // ...
  end;

// ...

procedure TForm1.FormShow(Sender: TObject);
begin
    Close;
end;
... dá problema se o form não for o form principal do programa.

Moral da estória: dá para chamar Close no OnShow se...[list:529be22614][*:529be22614]no OnClose você fizer Action caHide OU[*:529be22614]o form for o form principal do programa.[/list:u:529be22614]


GOSTEI 0
Rafs

Rafs

17/12/2004

Mais um adicional ao conhecimento... :D


GOSTEI 0
Tinorj

Tinorj

17/12/2004

Que tal vocês tentarem usar [b:00f78c7bf8]PostMessage(Form1.Handle, WM_Close, 0, 0);[/b:00f78c7bf8] no evento OnShow do Form1?


GOSTEI 0
Paulo_amorim

Paulo_amorim

17/12/2004

Olá

Que tal vocês tentarem usar [b:b7768d18d5]PostMessage(Form1.Handle, WM_Close, 0, 0);[/b:b7768d18d5] no evento OnShow do Form1?

Se essa função funciona a contento então o problema foi resolvido. A discussão foi em torno de ser ou não possível fazer Close em um evento Form.OnShow, e não qual rotina é melhor.

Até+


GOSTEI 0
Dopi

Dopi

17/12/2004

Pondo mais lenha no fogo ;-)

Eu tb tive alguns problemas usando o Close.... as vezes não fechava, ou dava erro...

Estou usando:
Application.Terminate


GOSTEI 0
POSTAR