Align=alClientのパネルの高さを規定値以下にしない方法は?

解決


ともとも  2006-09-08 00:35:44  No: 23138

こんにちは。ともともと申します。

現在、フォームの上にパネルを3つ貼り、その間をスプリッターで区切っています。
それぞれ、P1,2,3、S1,2とした場合に、
P1,2はAlign=alTop/S1,2もAlign=alTopにして、一番下のP3をalClientにしています。
それぞれのパネルで高さの最小値が決まっているので、それ以下にならないようにPanel.OnCanResizeで値が小さくなったらその最小値に戻す記述を入れています。
ただ、一番下のP3については、最小値よりも小さくなっても元に戻りません。

これは、alClientである以上、仕方がないのでしょうか?

Align=alClientであるパネルの
・高さを一定以下にしない方法
・または、高さを戻す(ある値にする)方法
などをご存知の方、おられませんでしょうか?
よろしくお願いいたします。


deldel  2006-09-08 01:04:24  No: 23139

TSplitterのAutoSnapはどうですか?


ともとも  2006-09-08 01:35:00  No: 23140

deldelさん、早速にありがとうございます。

TSplitter・AutoSnapは、TRUEをFALSEにしてみましたが、やはりMinSizeにならないと縮小がとまりません。

このMinSizeなのですが、
例えば、
alClientのパネルのすぐ上のスプリッター(私の例で言うとS2)にMinSize=100とした場合に、私の要望であるalClientのパネル(P3)のサイズはその値以下になりませんが、P2(S2の直上のパネル)サイズも100以下にはならないのですよね?

それなので、MinSizeは30にしていまして、P3に設定しようとしている値は100なのです。(P2はもう少し小さくなってもかまわないのです)

やはり、難しいのでしょうか・・・

重ね重ねの質問で申し訳ありません。
よろしくお願いいたします。


deldel  2006-09-08 01:50:41  No: 23141

いまいち良く分かってないのですが・・・

P0:alTop
S1:alTop
P3:alClient
P0の中に、
  P1:alTop
  S2:alTop
  P2:alClient

としたらだめですか?


ともとも  2006-09-08 02:24:07  No: 23142

説明がうまくまとまらず、申し訳ありません。

deldelさんの場合、P1、S2、P2を新しいP0の子供とすると、
P3の高さが一定以下になったとき、それ以上スプリッター(S1)を下げてもP3の高さが小さくならないのでしょうか?

alClientになっていると、実現しないのではないかと考えているのですが。
(いただいたレスですと、P3のAlignはalClientのままでしたので・・)

実は、例に挙げた全てのパネルとスプリッターは、別のパネルの子供になっています。また、本当はパネルとスプリッターの数ももう少し多くて、また表示したりしなかったりさせる必要があるのです。そうすると、どこまでをP0に含ませるか・・・など、別の問題が出てきそうです。


deldel  2006-09-08 02:53:30  No: 23143

なんだか難しそうですねぇ・・・
TSplitter.OnMoved で大きさなどを制御するのはどうでしょうか?


Fusa  2006-09-08 09:27:34  No: 23144

各PanelのConstraints.MinHeightを指定してはいかがでしょうか?


HOta  2006-09-08 16:05:08  No: 23145

Fusa さんの書いてある通りですね。Constraintsで指定しましょう。


deldel  2006-09-08 18:16:42  No: 23146

Constraintsというのがあったんですねぇ・・・
使ったこと無かったから気づきませんでした^^;
でも、フォームのサイズ変更では予想もしなかった動きをするため、
これはこれで制御が難しそうですねぇ・・・


ともとも  2006-09-08 18:20:07  No: 23147

deldelさん、Fusaさん、HOtaさんありがとうございます。

deldelさん
>TSplitter.OnMoved で大きさなどを制御するのはどうでしょうか?

TSplitter.OnMoved、OnCanResizeも試してみたのですが、やはりMinSizeに達するまで小さくなるのは止められませんでした。

Fusaさん、HOtaさん
>各PanelのConstraints.MinHeightを指定してはいかがでしょうか?
>Fusa さんの書いてある通りですね。Constraintsで指定しましょう。

やってみました。
例であげたP1,2,3とS1,2は別のパネルの子供なのですが、その親パネルのAlignがClientの場合、
P1,2をalTop、P3をalClientとし、P3にConstraints.MinHeightをしていしたら、P3はConstraints.MinHeightに指定した高さ以下にはならず、P2の高さが増え、私の意図していたことが実現しました。
ただし・・・。仕様的に、その親パネルは、alNoneでないと他と会わなくなってしまうため、alNoneで試したところ、P3は下へもぐったようになり、最後はフォームから隠れてしまいました。

私は、alClientに指定するとだめなのかと思っていましたが、かつ親のパネルのAlignがalNoneであるということも影響しているんですね。
親パネルのAnchorを全てTrueにしてみたりしましたが、だめでした。

この仕様自体で変更できることはないか、相談してみることにします。
ありがとうございました。


Fusa  2006-09-08 21:01:22  No: 23148

>でも、フォームのサイズ変更では予想もしなかった動きをするため、

Formに対してのサイズ抑制は
Constraintsはバグすぎて使い物になりません。
GetMinMaxInfoでやるのがいいですね。

普通のコントロールに対しては使えますよ。


ともとも  2006-09-12 23:09:18  No: 23149

時間が空いてしまい、申し訳ありませんでした。

再度、自分のコーディングを見直してみたのですが、
TPanelのOnResizeイベントにサイズを調節する記述を入れていまして、そのイベントをコメントにしたところ、
Constraints.MinHeightとTSplitter.MinSizeで例のP3が下へもぐっていってしまう件は解決しました。

コーディングはこうしました。
TPanel.Align=alClientの場合(例でのP3)に、TPanel.Constraints.MinHeight=0/TSplitter.MinSizeに固定したい高さ
TPanel.Align=alTopの場合(例でのP1,2)に、TPanel.Constraints.MinHeight=固定したい高さ/TSplitter.MinSizeに30(デフォルト)
これで、私のところでは、Align=alTopの場合でも、Align= alClientの場合でも固定したい値以下の高さにはならなくなりました。

>でも、フォームのサイズ変更では予想もしなかった動きをするため、
ですが、特におかしく感じなかったのですが、私のフォームが別フォームの子供になるためでしょうか?
deldelさん、Fusaさん、もしよろしければどのようなところが"予想もしなかった動き"なのか教えていただけないでしょうか?

よろしくお願いいたします。


Fusa  2006-09-12 23:52:45  No: 23150

Formに対して
ConstraintsのMinHeightを設定して
Formのサイズを変更してください。

Formの下をつまんでサイズ変更するのは問題ありませんが
Formの上をつまんでサイズ変更すると、サイズは100以下にはなりませんが
なぜか全体が下に移動します。


ともとも  2006-09-13 03:13:36  No: 23151

Fusaさん  ありがとうございます。

FormのConstraints.MinHeightを指定した場合  ということですね。
なるほど、下に下がって行きますね。(ある一定のところで止まるようですが)
私は勘違いをしていて、Formの子供のTPanel.Constraints.MinHeightを指定した状態でそのフォームのサイズを変更すると、TPanelのサイズが"予想もしなかった動き"になるのかと思ってしまいました。

私の今回のコーディングではForm.Constraints.MinHeightは指定しないので大丈夫と判断したいと思います。

みなさま、ありがとうございました。


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

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






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