スクロールボックスのスクロール領域全体のサイズを得るには?

解決


デル太  2006-04-05 00:53:32  No: 20832

例えばスクロールボックスの場合、widthはコントロールのサイズを示し、スクロール領域全体ではないみたいです。

また、ヘルプでClientRectについて次の説明がされています。

>ClientRect プロパティは,コントロールの物理的なクライアント領域のサイズであり,論理的なクライアント領域のサイズではありません。コントロールがスクロールをサポートしている場合,ClientRect プロパティはスクロール領域全体ではなく,常に利用可能な領域だけを示します。

スクロール領域全体について、サイズを知りたい場合はどのようにするのでしょうか?


どやさ  2006-04-05 02:35:59  No: 20833

それが全てなんです。

>スクロール領域全体について、
>サイズを知りたい場合はどのようにするのでしょうか?
そんなものあらへん


ちゃうやん  2006-04-05 02:48:55  No: 20834

>>サイズを知りたい場合はどのようにするのでしょうか?
>そんなものあらへん

おまっせ
ScrollBox1.HorzScrollBar.Range
ScrollBox1.VertScrollBar.Range


deru  2006-04-05 04:56:51  No: 20835

どやささん、ちゃうやんさん、メッセージありがとうございます。

ちゃうやんさん、やっぱり何か方法があるものですね。
とても奥が深いですね。

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だけを使って整理しました


デル太  2006-04-05 05:01:26  No: 20836

ひとつ前のメッセージは名前がderuになってしまいましたが、私の発言です。

Delphiは奥が深いですね。
ヘルプや書籍、サイトを探しても見つけられないことがたくさん出てきます。
この掲示板のおかげでDelphiでのプログラムのしくみの理解が深まりVCLのソースを読んだりもできるようになりましが、ますます疑問は増えているようです。
この掲示板のおかげで、そのような疑問も解決にたどり着くことができます。
みなさん、ありがとうございます。


…!?  2006-04-05 19:20:57  No: 20837

>※WidthとClientRect.Right - ClientRect.Leftが一致したので、
んなアホな。
ClientRect.Width = ClientRect.Right - ClientRect.Left
ClientRect.Width = Width - 4


デル太  2006-04-06 04:59:57  No: 20838

ご指摘ありがとうございます。確認したコードが誤っていました。
フォームの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;


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

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






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