12

アプリケーションの最初のロード時にモーダルフォームを表示する前に、メインフォームが完全に最大化され、すべてのコントロールが再描画されるようにするための推奨される方法は何ですか?

アプリケーションの起動時にモーダルダイアログを表示する必要があります(ログイン画面ではありません)がwsMaximized、画面が最大化されている間にフォームを設定すると、コントロールが再描画される機会がなく、醜い混乱が残ります。

現在、以下を使用してモーダル画面を表示しています。

procedure TForm1.FormActivate(Sender: TObject);
var
  frmOrderLookup:TfrmOrderLookup;
begin
  onactivate := nil;
  frmOrderLookup:=TfrmOrderLookup.Create(nil);
  try
    frmOrderLookup.showmodal;
  finally
    frmOrderLookup.Free;
  end;
end;
4

1 に答える 1

14

私が通常行うことは、カスタムメッセージをフォームに投稿することです。そうすれば、フォームの他のメッセージがすでに処理されるまで処理されません。このメッセージが処理されるまでに、フォームはすでに再描画を完了しているはずです。

type
  TMyForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure HandleLookupMessage(var Message: TMessage); message WM_USER + 1;
  end;

procedure TMyForm.HandleLookupMessage(var Message: TMessage);
var
  frmOrderLookup: TfrmOrderLookup;
begin
  frmOrderLookup := TfrmOrderLookup.Create(Application);
  try
    frmOrderLookup.ShowModal;
  finally
    frmOrderLookup.Release;
  end;
end;

procedure TMyForm.FormCreate(Sender: TObject);
begin
  // Maximise form here if needed
  PostMessage(Handle, WM_USER + 1, 0, 0);
end;

何らかの理由でメッセージがアプリケーションに再び届くのが心配な場合は、いつでもプライベートブール変数を追加して、一度処理されたことを示すことができます。

于 2012-06-08T12:24:09.323 に答える