MDI子フォームの最大化時サイズの限定

解決


にしの  2003-06-28 01:57:50  No: 3911

3ペインウィンドウのMDIアプリケーションを作成しています。
3ペインは、左、右上、右下の3つに分け、自前のレイアウトコンポーネントで配置しています。
ここで、右下のペインにMDI子フォームを最大化状態で表示したいのですが、うまくいきません。
# MDI子フォームは、元の大きさには戻さず、切り替えはタブで行います

試したのは、
・ClientWidth,ClientHeightを変更。
    当たり前ですが、ウィンドウサイズが変わりました
・子フォームをMaximizedにしてすぐWidth,Heightを指定
    妙な動きをしています。タイトルバーが出てしまいました
の2つ。

FrameやPanelに置き換えようにも、DLLから作成したFrameやPanelではエラーが起きてこれもうまく動きません。
# このバグをとれればよいのですが、根が深そうです

できるだけ簡単に行えればよいのですが、何か方法はありませんか。

Delphi7Pro
Windows2000/XP


kazu  2003-06-28 03:50:18  No: 3912

タイトルバーを表示したくないということであれば、
子フォームのWindowStateをwsMaximizedにし、
同じくBorderStyleをbsNoneにする
と言う方法ではだめですか?

#こういう事では無い?
。。。読み飛ばして頂いて結構です


にしの  2003-06-28 05:04:20  No: 3913

パネルが配置してあるので、MDI子フォームを単純に最大化するだけではパネルの下に隠れてしまいます。
# 上に書いてあるように、3ペインを実現するためAlignは使えません

でも、BorderStyleをbsNoneにするのは盲点でした。
ちょっと試してみます。


kazu  2003-06-28 05:39:53  No: 3914

レイアウトコンポーネントの詳細がわからないので正しくないかも知れませんが。
Form1に
・Panel1(Align=alLeft)
・Panel2(Align=alClient)
・Panel3(Align=alTop)->Panel2に配置
・Panel4(Align=alClient)->Panel2に配置
Form2(自動作成の対象外)
・Align=clClient
・WindowState=wsNomal
・BorderStyle=bsNone
・Visible=False
Panel1にButton1を配置した状態で

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  Form2.Parent := Panel4;
  Form2.WindowState := wsMaximized;
  Form2.Visible := True;
end;

とします。
#色々試した結果、表示も乱れず一番いい状態で表示されました。
Form1を最大化したときもちゃんとサイズが大きくなります。
Win2K + Del6


にしの  2003-06-28 05:58:03  No: 3915

OKでした!
ただ、
Parent := CenterPanel;
ではだめで、
ParentWindow := CenterPanel.Handle;
ならOKでした。

ありがとうございます。


にしの  2003-06-28 06:05:46  No: 3916

それぞれのpaneのAlignはalNoneにしています。
レイアウトコンポーネントとは名ばかりで、
property TopPane: TWinControl;
property LeftPane: TWinControl;
property CenterPane: TWinControl;
property RightPane: TWinControl;
property BottomPane: TWinControl;
property Parent: TWinControl;
property Rule: TBorderRule;
これらを設定して、packメソッドを呼ぶと並べ替えてくれるというだけです。
packの中では、地味にParent.ClientWidth, ClientHeightと、各Pane.Left,Top,Width,Heightを計算しています。
通常のAlignでは、

AAA
BCD
EEE
(同じ文字が1つのペイン)
と並んでしまい、3ペインで
XY
XZ
(同じ文字が1つのペイン)
というような、左側が上から下まで通っているものにしたいのに、
XY
ZZ
となり(下が、左から右まで通っている)になってしまうので自作しました。

あとは、境界のドラッグ部分ができれば完成です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加