すべきかどうかは、技術的な質問よりも哲学的な質問です。イベントは、関数でも使用されるTForm.OnShow
制御メッセージを実行することによって発生します。内部的に、このメッセージはイベント自体を起動するものを呼び出します。CM_DOCKCLIENT
ManualDock
CM_SHOWINGCHANGED
次の例では、Form1 (ページ コントロールとボタンを含む) と Form2 (空でドッキング可能) の 2 つのフォームを使用します。どちらも自動作成されていると思います。
次のコードは、OnShow
イベントがCM_DOCKCLIENT
コントロール メッセージによって発生したことの証明です。ボタンをクリックすると、CM_DOCKCLIENT
メッセージが実行され、Form2 のOnShow
イベントが発生します。
Form1 のコード
procedure TForm1.FormShow(Sender: TObject);
begin
Form2.Show;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
DockObject: TDragDockObject;
begin
DockObject := TDragDockObject.Create(Form2);
try
// sending the CM_DOCKCLIENT message internally performs also the
// CM_SHOWINGCHANGED message which triggers the TForm.OnShow event
PageControl1.Perform(CM_DOCKCLIENT, WPARAM(DockObject), LPARAM(SmallPoint(0, 0)));
finally
DockObject.Free;
end;
end;
そしてForm2にはOnShow
イベントハンドラしかありません
procedure TForm2.FormShow(Sender: TObject);
begin
ShowMessage('FormShow');
end;
簡単な回避策は、Form2 をそれ自体 (OnShow
イベント内) で手動でドッキングするのではなく、作成者によって、またはそれを表示するフォームによってドッキングすることです。前の例では、Form1.OnShow イベントで Form2 を表示したので、そこに手動で簡単にドッキングできます。
procedure TForm1.FormShow(Sender: TObject);
begin
Form2.Show;
Form2.ManualDock(PageControl1);
end;
procedure TForm2.FormShow(Sender: TObject);
begin
// no manual docking of this form by itself
end;