1

メインフォームがメインフォームのFormShowイベントでサブフォームを呼び出すアプリケーションを1つ作成しました。サブフォームが表示され、2つのオプションを選択できます。サブフォームの最初のオプションを選択すると、メッセージが表示され、その後メインフォームが表示されます。これで、アプリケーションを初めて実行すると、サブフォームMeassageで選択したオプションが表示されます。しかし、メインフォームを背景としてメッセージを表示したい。だからこれに対する解決策。以下はFormShowコードです。

Procedure TMainForm.FormShow(Sender:TObject);
begin
  if (SubForm.ShowModal = mrOK) and bOption1 then
  begin
    ShowMessage('Enter the value');
  end;
end;
4

5 に答える 5

2

私が正しく理解していれば、あなたの問題は、メッセージボックスが表示されてもメインフォームがまだ見えないということです。

この場合、2つのオプションがあります。

  1. SubFormメインフォームのイベントからあなたを見せないでくださいOnShow、しかし後で
  2. ShowModal返品直後にメッセージを表示しないでください。後で表示してください。

ポイント番号2については、ここで提案したのと同様のアプローチを使用できますPostMessage。したがって、コードは次のようになります。

procedure TMainForm.FormShow(Sender:TObject);
begin
  if (SubForm.ShowModal = mrOK) and bOption1 then
  begin
    PostMessage(Self.Handle, WM_SHOWMYDIALOG, 0, 0);
  end;
end;

次に、のハンドラーはWM_SHOWMYDIALOG実際のメッセージを表示します。このアプローチは、ポイント1でも機能します。ainの回答を参照してください。

PostMessageメインフォームが表示され終わった後に処理されるアプリケーションのメッセージキューにメッセージを投稿します。

于 2011-08-17T15:09:10.873 に答える
2

別のオプションは、onShowの代わりにメインフォームのOnActivateを使用することです。

于 2011-08-17T15:40:00.903 に答える
1

私があなたを正しく理解しているならあなたはあなたが望む

const
    UM_AFTERSHOW   = WM_APP + 1;

type
  TForm1 = class(TForm)
  protected
    procedure UMAfterShow(var Msg: TMessage); message UM_AFTERSHOW;
    procedure DoShow; override;
  end;


procedure TForm1.DoShow;
begin
  inherited;
  PostMessage(Self.Handle, UM_AFTERSHOW, 0, 0);
end;

procedure TForm1.UMAfterShow(var Msg: TMessage);
begin
  ShowMessage('Enter the value');
end;

UMAfterShowハ​​ンドラーにメッセージを表示することにより、メインフォームが表示され、バックグラウンドになる機会が与えられます。

于 2011-08-17T15:08:19.007 に答える
0

あなたが見ている問題(私が正しく理解している場合)は、メインフォームが実際に表示される前にFormShowが呼び出されることです。したがって、メッセージダイアログはメインフォームの前に表示されます。

あなたがする必要があるのは、PostMessageを使用してメッセージをメインフォームに投稿し、それを処理することです。これにより、FormShowコードが終了し、フォームが表示された後にコードがトリガーされます。

例については、こちらをご覧ください。

于 2011-08-17T15:10:20.450 に答える
0

さらに別のオプションは、メインフォームにTTimerコンポーネントをドロップして、メッセージダイアログをトリガーすることです。

メインフォームにTTimerコンポーネントをドロップし、enabledプロパティをFalseに設定し、時間を1000から100に変更します。メッセージダイアログをコーディングし、タイマーイベントでTimer.EnabledプロパティをFalseに設定して、繰り返し発生しないようにします。

これで、メインフォームのOnShowイベントでメッセージダイアログを表示した時点でタイマーを有効にできます。

于 2011-08-18T01:53:19.240 に答える