3

私の Delphi フォームの OnShow メソッドでは、フォームが開いたらダイアログを自動的に開く必要があると判断しました。

ただし、me​​nuitem.Click を呼び出すと、メイン フォームが開く前にダイアログが表示されます。これは私が望んでいるものではありません。

私はそれが私が望むことをするはずだと思っていますが、メニューアイテムにクリックを送るために「wparam」に渡すパラメータが見つかりません。

PostMessage(handle, WM_COMMAND, wparam, 0)

MSDNのWM_COMMAND ドキュメントでは IDM_* 識別子について説明していますが、Delphi ではどのように表示されるのでしょうか?

4

6 に答える 6

5

(私はこれが非常に古い質問であることを知っていますが、何らかの方法で解決されたにもかかわらず、本当の質問は実際には答えられていません.)
--

「TMenuItem」のコマンド項目識別子はCommandプロパティにあります。WM_COMMAND のドキュメントによると、「wParam」の上位ワードは「0」になり、下位ワードはメニュー識別子になります。

PostMessage(Handle, WM_COMMAND, MakeWParam(MyMenuItem.Command, 0), 0);

または単に;

PostMessage(Handle, WM_COMMAND, MyMenuItem.Command, 0);


ポップアップ メニュー項目では、わずかな違いがあります。VCL は、ポップアップ メニューのメッセージを別のユーティリティ ウィンドウで処理します。グローバルなPopupList変数には、そのWindowプロパティのハンドルがあります。

PostMessage(PopupList.Window, WM_COMMAND, MyPopupMenuItem.Command, 0);
于 2010-09-17T00:08:17.353 に答える
2

おそらく、OnActivateイベントでダイアログを開こうとすることができますか?フォームが表示されているとき以外にOnActivateが再度起動されるかどうかはわかりませんが、起動される場合は次を使用できます。

procedure TForm1.FormActivate(Sender: TObject);
begin
  Form2.ShowModal;
  Self.OnActivate := nil;
end;
于 2009-08-11T11:16:52.993 に答える
0

私が使用した 1 つの方法は、MarkF のソリューションに非常によく似ていますが、新しいユーザー定義のメッセージ タイプを作成し、メイン フォームが表示された後にこの他のプロセスを実行する必要があると判断したときに、そのタイプを使用して自分自身にメッセージを送信することです。

const
  wm_SpecialProc = wm_User + 1;

procedure TForm1.WMSpecialProc(var Message:tMessage); message wm_SpecialProc;
begin
  Form2.ShowModal;
end;

procedure TForm1.OnShow(Sender:tObject);
begin
  if true then
    PostMessage(Application.MainForm.Handle,wm_SpecialProc,0,0);
end;

このメソッドの優れた点は、メッセージの生成を制御できることです。そのため、後でハンドラーで使用する任意の lparam または wparam を設定できます。application.mainform を介してメッセージを直接送信しましたが、現在のフォームのハンドルを言うこともできます。

于 2009-08-11T16:16:42.613 に答える
0

フォームを通常の Show/ShowModal に従って表示し、完全に描画 (など) してからすぐに別のことをしたい場合は、1 回限りのタイマーでこれを行う必要はありませか?

tmrKickOff : TTimer、100 ミリ秒間隔、設計時に無効、
「tmrKickOffTimer」イベントを発生させます。


フォーム作成で、
tmrKickOff.Enabled:=false; //IDE で何かが起こった場合に備えて

フォームショーで、他のすべてのものの最後に。
tmrKickOff.Enabled:=true;

tmrKickOffTimer で
始める
  tmrKickOffTimer.Enabled:=false;
  menuItemClick(nil);
終わり;

スタイル、フォーム、およびエラートラップについてお詫び申し上げます:-)

于 2009-08-11T11:59:09.057 に答える
0

または、 Application.OnIdle イベントを次のようなもので処理します ...

if not DialogDone then
begin
    MyDialogForm.ShowModal; // or menuItem.Click ....
    DialogDone := true;
end;

フォームが表示され、メッセージ キューが空になるまで、OnIdle は (初めて) 起動しません。

于 2009-08-11T11:59:30.723 に答える
0

メニュー項目にメッセージを直接送信することはできないと思いますが、メッセージをメイン ウィンドウに投稿して、そこからダイアログを表示することはできます。私はこれを行い、混乱を避けるためにダイアログボックス(私の場合はログインプロンプト)がメインウィンドウの上に表示されるようにうまく機能します.

-マーク

procedure WMPostStartup(var Message: TMessage); message WM_POSTSTARTUP;

procedure TMainForm.WMPostStartup(var Message: TMessage);
begin
  Self.Refresh;
  // Now show the dialog box.
end;
于 2009-08-11T12:01:39.067 に答える