こんにちは。ともともと申します。
現在、フォームの上にパネルを3つ貼り、その間をスプリッターで区切っています。
それぞれ、P1,2,3、S1,2とした場合に、
P1,2はAlign=alTop/S1,2もAlign=alTopにして、一番下のP3をalClientにしています。
それぞれのパネルで高さの最小値が決まっているので、それ以下にならないようにPanel.OnCanResizeで値が小さくなったらその最小値に戻す記述を入れています。
ただ、一番下のP3については、最小値よりも小さくなっても元に戻りません。
これは、alClientである以上、仕方がないのでしょうか?
Align=alClientであるパネルの
・高さを一定以下にしない方法
・または、高さを戻す(ある値にする)方法
などをご存知の方、おられませんでしょうか?
よろしくお願いいたします。
TSplitterのAutoSnapはどうですか?
deldelさん、早速にありがとうございます。
TSplitter・AutoSnapは、TRUEをFALSEにしてみましたが、やはりMinSizeにならないと縮小がとまりません。
このMinSizeなのですが、
例えば、
alClientのパネルのすぐ上のスプリッター(私の例で言うとS2)にMinSize=100とした場合に、私の要望であるalClientのパネル(P3)のサイズはその値以下になりませんが、P2(S2の直上のパネル)サイズも100以下にはならないのですよね?
それなので、MinSizeは30にしていまして、P3に設定しようとしている値は100なのです。(P2はもう少し小さくなってもかまわないのです)
やはり、難しいのでしょうか・・・
重ね重ねの質問で申し訳ありません。
よろしくお願いいたします。
いまいち良く分かってないのですが・・・
P0:alTop
S1:alTop
P3:alClient
P0の中に、
P1:alTop
S2:alTop
P2:alClient
としたらだめですか?
説明がうまくまとまらず、申し訳ありません。
deldelさんの場合、P1、S2、P2を新しいP0の子供とすると、
P3の高さが一定以下になったとき、それ以上スプリッター(S1)を下げてもP3の高さが小さくならないのでしょうか?
alClientになっていると、実現しないのではないかと考えているのですが。
(いただいたレスですと、P3のAlignはalClientのままでしたので・・)
実は、例に挙げた全てのパネルとスプリッターは、別のパネルの子供になっています。また、本当はパネルとスプリッターの数ももう少し多くて、また表示したりしなかったりさせる必要があるのです。そうすると、どこまでをP0に含ませるか・・・など、別の問題が出てきそうです。
なんだか難しそうですねぇ・・・
TSplitter.OnMoved で大きさなどを制御するのはどうでしょうか?
各PanelのConstraints.MinHeightを指定してはいかがでしょうか?
Fusa さんの書いてある通りですね。Constraintsで指定しましょう。
Constraintsというのがあったんですねぇ・・・
使ったこと無かったから気づきませんでした^^;
でも、フォームのサイズ変更では予想もしなかった動きをするため、
これはこれで制御が難しそうですねぇ・・・
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にしてみたりしましたが、だめでした。
この仕様自体で変更できることはないか、相談してみることにします。
ありがとうございました。
>でも、フォームのサイズ変更では予想もしなかった動きをするため、
Formに対してのサイズ抑制は
Constraintsはバグすぎて使い物になりません。
GetMinMaxInfoでやるのがいいですね。
普通のコントロールに対しては使えますよ。
時間が空いてしまい、申し訳ありませんでした。
再度、自分のコーディングを見直してみたのですが、
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さん、もしよろしければどのようなところが"予想もしなかった動き"なのか教えていただけないでしょうか?
よろしくお願いいたします。
Formに対して
ConstraintsのMinHeightを設定して
Formのサイズを変更してください。
Formの下をつまんでサイズ変更するのは問題ありませんが
Formの上をつまんでサイズ変更すると、サイズは100以下にはなりませんが
なぜか全体が下に移動します。
Fusaさん ありがとうございます。
FormのConstraints.MinHeightを指定した場合 ということですね。
なるほど、下に下がって行きますね。(ある一定のところで止まるようですが)
私は勘違いをしていて、Formの子供のTPanel.Constraints.MinHeightを指定した状態でそのフォームのサイズを変更すると、TPanelのサイズが"予想もしなかった動き"になるのかと思ってしまいました。
私の今回のコーディングではForm.Constraints.MinHeightは指定しないので大丈夫と判断したいと思います。
みなさま、ありがとうございました。
ツイート | ![]() |