MDIアプリケーションで子ウィンドウを最大化するには?

解決


しし丸  2004-11-18 07:12:32  No: 11805  IP: [192.*.*.*]

MDIを使用して、新規で子ウィンドウを表示できているのですが、
親ウィンドウ表示時に、はじめから子ウィンドウを最大化で開いておきたいのですが、下記のソースをどこのイベントに表示して良いか分かりません。

  Child := Window.Create(Application);
  Child.WindowState := wsMaximized;
  Child.WebBrowser1.GoHome;

子ウィンドウが表示されるのですが、ノーマルウィンドウが表示された後に
最大化されます。はじめから、子ウィンドウの最大化表示はできないのですか?

編集    削除
とと丸  2004-11-18 09:43:42  No: 11806  IP: [192.*.*.*]

新規で Form1 を fsMDIForm (MDI親フォーム)、Form2 を fsMDIChild 
(MDI子フォーム)にし、Form2 を自動生成の対象からはずしておき

uses
  Unit2;

procedure TForm1.FormShow(Sender: TObject);
begin
  with TForm2.Create(Application) do Show;
  OnShow := nil;
end;

として Form1 の OnShow イベントハンドラで Form2 を1つ作成し表示します。
一方、

procedure TForm2.FormShow(Sender: TObject);
begin
  WindowState := wsMaximized;
  WebBrowser1.GoHome;
  OnShow := nil;
end;

とし、Form2 は自分が表示されるとき一度だけ最大化し、WebBrowser1 にホームを
表示します。D5 ではうまくいっています。

編集    削除
しし丸  2004-11-18 21:30:17  No: 11807  IP: [192.*.*.*]

はじめの子ウィンドウは、きれいに開きました。
ですが、二つめ以降の子ウィンドウの表示がうまくいきません。

> Form2 を自動生成の対象からはずしておき

この設定が良く分かりません。
申し訳ありませんが、もう少しアドバイスをいただけますか。

編集    削除
にしの  2004-11-18 21:43:40  No: 11808  IP: [192.*.*.*]

設計時に、ChildFormのWindowStateをwsMaxmizedにしておけばよいのでは?

編集    削除
しし丸  2004-11-18 23:07:58  No: 11809  IP: [192.*.*.*]

はじめからwsMaxmizedに設定しておいても、
ノーマル表示 → 最大化表示   になってしまいます。

デバックして確認したのですが、OnShow イベントハンドラで
WindowState := wsMaximized
と設定しても子ウィンドウの最大化になる動作が見えてしまいます。

MDIChildCountが0のときに子ウィンドウを開く場合は、最大化表示したいのですが、どう設定を変えてもウィンドウが最大化になる動作が見えてしまいます。

他の方法はないでしょうか。

お願いします。

編集    削除
とおりすがりん  2004-11-19 05:26:42  No: 11810  IP: [192.*.*.*]

http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=043597
こんなのがありますけど、私はできませんでした。
もし成功したらソース書いてくれると嬉しいです。

編集    削除
にしの  2004-11-19 05:29:01  No: 11811  IP: [192.*.*.*]

確かに1つ目はアニメーションしてしまいますね。
パネルで隠すのはどうでしょう。
必要に応じて、パネルの枠や色を変更してください。

設計時
1.パネル(name=Panel1)を親フォームに貼り付ける
2.Panel1のAlignをalClientに変更
3.Panel1のAlignをalNoneに変更(これで子フォームと同じ大きさのパネルができる)
4.Panel1のAnchorを全てtrueにする(これで親フォームの大きさを変えられても追従する)

子フォームを作成するイベントにて以下の定義。
var
  isZero: Boolean;
begin
  isZero := MDIChildCount = 0; // 子フォームの数が0ならtrue

  if isZero then Panel1.Visible := True; // 子フォームの数が0だったらパネルを表示
  with TForm2.Create(Application) do
  begin
{ 子フォームに対していろいろ設定)
  end;
  if isZero then Panel1.Visible := False; // 子フォームの数が0だったらパネルを非表示
end;

編集    削除
にしの  2004-11-19 05:36:41  No: 11812  IP: [192.*.*.*]

とおりすがりんへ。
リンクの通りで動きましたよ。
# Delphi7Pro+WinXPSP2

もしかして、子フォームの作成でApplicationを指定していませんか?親フォームを指定すれば動くと思います。

編集    削除
とおりすがりん  2004-11-19 08:10:55  No: 11813  IP: [192.*.*.*]

をを!!本当だ。動きました。

Applicationじゃいけなかったんですか、、、
いや〜、作るの面倒だからって新規作成からMDIアプリ作ってたら、Application指定してるんですね。そんなこととは気づかずに、、、虚しさ爆発です。
にしのさん。どうもですぅ〜。

編集    削除
しし丸  2004-11-19 11:03:10  No: 11814  IP: [192.*.*.*]

「とと丸」さん、「にしの」さん、助かりました。
ありがとうございます。

「とおりすがり」さんの情報も助かりました。
アニメーションが消せるとは思いもしませんでした。

ありがとうございます。

編集    削除