例えばスクロールボックスの場合、widthはコントロールのサイズを示し、スクロール領域全体ではないみたいです。
また、ヘルプでClientRectについて次の説明がされています。
>ClientRect プロパティは,コントロールの物理的なクライアント領域のサイズであり,論理的なクライアント領域のサイズではありません。コントロールがスクロールをサポートしている場合,ClientRect プロパティはスクロール領域全体ではなく,常に利用可能な領域だけを示します。
スクロール領域全体について、サイズを知りたい場合はどのようにするのでしょうか?
それが全てなんです。
>スクロール領域全体について、
>サイズを知りたい場合はどのようにするのでしょうか?
そんなものあらへん
>>サイズを知りたい場合はどのようにするのでしょうか?
>そんなものあらへん
おまっせ
ScrollBox1.HorzScrollBar.Range
ScrollBox1.VertScrollBar.Range
どやささん、ちゃうやんさん、メッセージありがとうございます。
ちゃうやんさん、やっぱり何か方法があるものですね。
とても奥が深いですね。
ScrollBox1の上に、Width=1000のPanelを置き実験しました。
ScrollBox1はAlign=Clientにして、フォームのサイズに合わせて大きさが変わるようにしました。
ScrollBoxの幅がPanelより小さい場合、
Panelの幅に合わせた領域がスクロール領域になり、Rangeで取得できます。
次のコードで確認しました。
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('X=' + IntToStr(ScrollBox1.HorzScrollBar.Range));
ShowMessage('Width='+ IntToStr(ScrollBox1.Width));
end;
ScrollBoxの幅がPanelより大きい場合は、
スクロールの必要がなくなるため、スクロールバーが表示されません。
その場合、Rangeは1000のままになりました。
スクロールバーが出る/出ないの境界は微妙で、次のようになりました。
No|Width|Range|スクロールバーの有無|
1| 800| 1000|有 |
2| 1000| 1000|有 |
3| 1001| 1000|有 |
4| 1003| 1000|有 |
5| 1004| 1000|無 |
No.4の状態でもスクロールできました。スクロール領域は1004になりそうです。
いずれにしても、WidthかRangeの大きいほうをスクロールボックスの「スクロール領域」と考えられると思います。
厳密にはスクロールバーがないとクライアント領域なんですけど、感覚的にはこの感じで把握できました。
ありがとうございます。
※WidthとClientRect.Right - ClientRect.Leftが一致したので、上記ではWidthだけを使って整理しました
ひとつ前のメッセージは名前がderuになってしまいましたが、私の発言です。
Delphiは奥が深いですね。
ヘルプや書籍、サイトを探しても見つけられないことがたくさん出てきます。
この掲示板のおかげでDelphiでのプログラムのしくみの理解が深まりVCLのソースを読んだりもできるようになりましが、ますます疑問は増えているようです。
この掲示板のおかげで、そのような疑問も解決にたどり着くことができます。
みなさん、ありがとうございます。
>※WidthとClientRect.Right - ClientRect.Leftが一致したので、
んなアホな。
ClientRect.Width = ClientRect.Right - ClientRect.Left
ClientRect.Width = Width - 4
ご指摘ありがとうございます。確認したコードが誤っていました。
フォームのClientRectになっていて、ScrollBox1.Widthと一致していたようです。
間違った情報を載せてしまい、申し訳ありません。
修正して確認し、次のようになりました。
訂正いたします。
No|Width|CR-CL|Range|スクロールバーの有無|
1| 800| 796| 1000|有 |
2| 1000| 996| 1000|有 |
3| 1001| 997| 1000|有 |
4| 1003| 999| 1000|有 |
5| 1004| 1000| 1000|無 |
※WidthはScrollBox1.Width、CR-CLはScrollBox1.ClientRect.Right-ScrollBox1.ClientRect.Left
次のコードで確認しました。
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('X=' + IntToStr(ScrollBox1.HorzScrollBar.Range));
ShowMessage('Width='+ IntToStr(ScrollBox1.Width));
ShowMessage('ClientRect.Right - ClientRect.Left='+ IntToStr(ClientRect.Right - ClientRect.Left));
ShowMessage('ScrollBox1.ClientRect.Right - ScrollBox1.ClientRect.Left='+ IntToStr(ScrollBox1.ClientRect.Right - ScrollBox1.ClientRect.Left));
end;
ツイート | ![]() |