子フォームから親フォームの関連付けしたいんですけど、うまくいきません。。。
procedure TMDIChild.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
TMainForm(ActiveMDIChild).StatusBar.Panels[2].text := 'MousePoint(' + IntToStr(X) + ',' + IntToStr(Y) + ')';
end;
こんな感じでやったんですけどダメでした。
Halbow です。
> TMainForm(ActiveMDIChild).StatusBar.Panels[2].text :=
TMainForm というクラスはないですよね。また、ActiveMDIChild は
子フォームなので、キャストしても親フォームにアクセスできません。
uses
Unit1;//親フォームのユニット
procedure TForm2.Button1Click(Sender: TObject);
begin
TForm1(Application.MainForm).Caption := 'Hello!';
end;
のように、Application.MainForm を実際の親フォームの型でキャスト
します。
メインフォームがTForm1だとした場合...
procedure TMDIChild.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
TForm1(ActiveMDIChild.Owner).StatusBar.Panels[2].text := 'MousePoint(' + IntToStr(X) + ',' + IntToStr(Y) + ')';
end;
ってな感じでどうでしょうか?
TFormのOwnerプロパティは、親フォームを示します。親フォームが常に特定のフォーム(メインフォームなど)なのであれば、この方法で大丈夫だと思います。
※.机上コーディングなので間違っていたらごめんなさい。
Halbow です。
> TFormのOwnerプロパティは、親フォームを示します。
そうですか? 普通につくると、Owner は Application だと思いますが。
自動作成された MDIChildForm で
procedure TForm2.Button1Click(Sender: TObject);
begin
Caption := Owner.ClassName;
end;
では、TApplication を表示します。Application.CreateForm() では、
必ずオーナーは Application になります。コンストラクタで特に指定
するとどのフォームも Owner になれます。普通のMDIアプリでは
MainForm が親フォームになるので、
TForm1(Application.MainForm)
の方がいいと思います。
>そうですか? 普通につくると、Owner は Application だと思いますが。
自動生成であれば、Halbowさんの言われる通りです。失礼しました。
MDIということで同じフォームで異なるドキュメントを幾つも表示/編集するタイプかなと思ったもので...
Halbow です。
> MDIということで同じフォームで異なるドキュメントを幾つも表示/編集するタイプかなと思ったもので...
あ、そうですね。前にも書きましたが、コンストラクタで Owner を親フォームに
しておけば、もちろん masayan さんのコードでも大丈夫ですよね。
遅くなりましたが、勉強になりました。
ありがとうございます。
Halbowさんmasayanさんありがとうございました。
ツイート | ![]() |