1

アプリケーションで埋め込みフォームを使用していますが、次のようなことを試みていました。

設計時には、フォームは埋め込み/ドッキングについて何も知らない通常のフォームです。ButtonClick を使用すると、フォームの Show() メソッドを呼び出してフォームを表示できます。実行時に、フォームが別のフォームにドッキングされ、埋め込みフォームになることがあります。フォームを再度表示するためにボタンを押しても (現在は埋め込まれています)、埋め込みフォームを含むフォームに対して Show() を呼び出す必要があるため、何も起こりません。

埋め込みフォームの Show() メソッドが呼び出されたときに親フォームを強制的に表示するメソッドを探しています。Show() を呼び出す前に親フォームの存在を確認することでこれを処理できますが、この特定の処理を含めたくありません。

フォームがドッキングされたときに通知される親フォームでこの処理を行うことをお勧めします。

Show() メソッドは、Visible プロパティを true に設定するだけなので (RAD Studio ヘルプ)、メッセージが発生するとは思いません ...?

このようなことを実現する方法を知っていますか?

編集

プログラミングの問題というよりも設計上の問題だと思うので、アプリケーションに関する情報を掲載したいと思います。

アプリケーションは、接続されたハードウェアに適応するためにいくつかのプラグインを使用します。exe はドラッグ アンド ドック環境を提供し、ドッキング可能なフォームの基本クラスを含みます。プラグインには、ドッキングの実装に関する知識がありません。ドッキング可能なフォームを作成し、プラグインからフォームを埋め込むことで、プラグイン フォームはドッキング可能になります。これが、埋め込みフォームのメソッド Show() がどこかで呼び出されたときに表示される親フォームを取得したい理由です。

4

2 に答える 2

4

埋め込みフォームまたはアプリケーション内のすべてのフォームに対して共通の祖先を作成し、そこからフォームを派生させることができます。

type
  TEmbeddedForm = class(TForm)
  public
    procedure Show;
  end;

procedure TEmbeddedForm.Show;
var
  ParentForm: TCustomForm;
begin
  inherited Show;
  ParentForm := GetParentForm(Self);
  if ParentForm <> Self then
  begin
    // Form is Embedded
    Update;        
    ParentForm.Show;
    // You might alternatively consider to send custom 
    // message to the Parent form, and let it decide what to do e.g.
    // SendMessage(ParentForm.Handle, CM_MY_EMBEDED_FORM_SHOW, 0, 0);
  end;
end;

次に、電話すると:

procedure TForm1.Button1Click(Sender: TObject);
begin
  // MyEmbeddedForm is derived from TEmbeddedForm 
  MyEmbeddedForm.Align := alClient;
  MyEmbeddedForm.BorderStyle := bsNone;

  MyEmbeddedForm.Parent := Form3.Panel1;
  MyEmbeddedForm.Show;
end;

Form3示しています。


別のオプション (私は Spy++ でのみ確認しました) は、インターセプトWM_CHILDACTIVATEまたは. 子フォームが呼び出しているときに送信され、それに応じて動作します。WM_WINDOWPOSCHANGINGTEmbeddedFormTEmbeddedForm.ShowGetParentForm(Self).Show

于 2014-11-18T08:21:49.433 に答える
0

埋め込みフォームのSetFocus代わりに使用します。Show

これにより、親フォームの表示も強制されます。

于 2014-11-18T07:16:30.613 に答える