Quando você precisa realizar um longo processo automaticamente (sem necessidade do usuário disparar) ao abrir um form, e deseja mostrar o progresso no próprio form, como você faz?

Os eventos OnCreate, OnShow, OnActivate do TForm são processados antes do form estar completamente mostrado, o que não serve para essa função. Eu quero que ao finalizar a “pintura” do form, incluindo todos seus controles, um método meu seja iniciado.

Pedindo ajuda no news da Borland, eu consegui solucionar da seguinte forma:

No OnShow do form, eu incluo uma mensagem customizada na fila de mensagens do meu form usando o PostMessage:

PostMessage(Handle, (WM_USER + 100), 0, 0);

Depois preciso implementar minha versão da procedure WndProc, responsável por processar as mensagens do form. Para isso adiciono ela a seção protected do form e dou um override:

<code>type
  TForm1 = class(TForm)
  private
    { Private declarations }
  protected
    procedure WndProc(var Message: TMessage); override;
  public
    { Public declarations }
  end;</code>

Na implementação da procedure, eu verifico se recebi a minha mensagem customizada e então disparo o código desejado:

<code>procedure TForm1.WndProc(var Message: TMessage);
begin
  if Message.Msg = (WM_USER + 100) then
    MinhaProcedureDemorada;

  inherited;
end;</code>

O resultado final foi ótimo. Ficou exatamente como eu queria.

Imagino até que não seria difícil criar um novo evento no TForm que fosse disparado apenas quando ele terminasse de ser mostrado. Tá algo que poderia ser sugerido para o pessoal da Borland.