技術的な質問よりも哲学的であるべきかどうか。 TForm.OnShow
イベントは、ManualDock
機能によっても使用される制御メッセージCM_DOCKCLIENT
を実行することによって起動されます。内部的には、このメッセージはCM_SHOWINGCHANGED
にイベント自体を起動させます。
次の例では、Form1(ページコントロールとボタン付き)とForm2(空とドッキング可能)の2つのフォームを使用します。私は両方が自動作成されていると推測します。
次のコードは、CM_DOCKCLIENT
制御メッセージによってOnShow
イベントが発生したことの証明です。ボタンをクリックすると、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;
簡単な回避策は、(OnShow
イベントで)自身のことで、手動でのForm2をドッキングすることはありませんが、ドックを持っているため、コードそれを作成者が表示するか、それを表示する形式で言うことにします。前の例では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;
FormShowは、マニュアルForm.Hideの後にも呼び出されます。 Form.Show;あまりにも。あなたがそれを記述する方法では、コードを一度しか実行したくないので、FormCreateはもっと良い場所になります。フォームを隠すことがない場合でも、他のプログラムもフォームを隠すことができます。 – hvd