31 de jan. de 2005

É possível executar TForm.Close no evento TForm.OnShow?

Ao longo de uma discussão no fórum ClubeDelphi sobre como cancelar a exibição de um form no evento OnShow do próprio form, surgiu uma dúvida sobre se era ou não possível executar TForm.Close no evento TForm.OnShow. Para algumas pessoas, ocorre o erro...

Cannot change Visible in OnShow or OnHide

Fiz alguns testes... na verdade, chamar TForm.Close dentro do evento TForm.OnShow dá problema a não ser que você trate o evento TForm.OnClose e defina um valor para Action diferente de caHide (que é o default). Portanto, este código...

1 type 2 TForm1 = class(TForm) 3 procedure FormShow(Sender: TObject); 4 procedure FormClose(Sender: TObject; var Action: TCloseAction); 5 ... 6 end; 7 8 ... 9 10 procedure TForm1.FormShow(Sender: TObject); 11 begin 12 Close; 13 end; 14 15 procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 16 begin 17 Action := caFree; 18 end;

...funciona sem problemas enquanto este código...

1 type 2 TForm1 = class(TForm) 3 procedure FormShow(Sender: TObject); 4 // ... 5 end; 6 7 ... 8 9 procedure TForm1.FormShow(Sender: TObject); 10 begin 11 Close; 12 end;

... dá problema se o form não for o form principal do programa. Moral da estória: é possível para chamar TForm.Close no evento TForm.OnShow se...

  • no evento TForm.OnClose você atribuir a Action qualquer valor diferente de caHide OU
  • o form for o form principal do programa.

Nenhum comentário: