If you want to show ScrollBar.

スクロールバーを表示したい時は・・・

複数のTImageを切り替えて表示し、あんな処理やこんな処理やそんな処理をそれぞれの場面で実行する場合、「あんな処理」ではGoodだったことが、「こんな処理」ではBadになっちゃうことがある。・・・んで、プログラムをイロイロいじって矛盾をなんとか解消し、さらに、エラー対策をこれでもか!と詰め込み、はたまた新たに要望のあった新機能を追加・・・、もう自分でも全体像がつかめないほど矜羯羅がってスパゲッティ状態になったプログラムに、総仕上げの「そんな処理」を書き足し、その中でTImageに画像を表示したら、自動的に出るはずの『スクロールバーが出ない!』みたいなー (T_T)

これまでにも、何度もこの問題で悩み、苦しんだ末に、とうとう解決方法を見つけたというお話。

1.問題が起きる状況
2.解決方法
3.お願いとお断り

1.問題が起きる状況

Formに、ScrollBoxをのせ、その上に複数のImageを載せた状態で、状況に応じてImageを切り替えながら作業するような場合、『どこか』で・『なにか』を(設定)やってしまっていて、FormCreate時にスクロールバーが自動的に出るよう、

ScrollBox1.AutoScroll:=True;

と、設定してあるにもかかわらず、ScrollBoxよりはるかに大きな画像を表示しても、垂直・水平両方向のスクロールバーが『出ない!』みたいな・・・

2.解決方法

どこで、なにをやったのか、徹底的に調べて問題を解決するのが本当なんだろうけれど(この正しい解決方法にチャレンジした結果)、あっちをイジったら、こっちがオカしくなり、こっちを直したら、あっちがコケた!みたいなことになるのが怖い。

そこで「これまでに書いたコードには一切変更を加えずに問題を解決する方法」を模索。

そもそも、ScrollBoxにScrollBarが表示される仕組み自体がわからない。その仕組みを調べてみると・・・

Vcl.Forms.TControlScrollBar.Range

https://docwiki.embarcadero.com/Libraries/Alexandria/ja/Vcl.Forms.TControlScrollBar.Rangeより引用

『水平スクロールバーの Range がフォームまたはスクロールボックスの幅より小さい場合,水平スクロールバーは表示されません。垂直スクロールバーの Range がフォームまたはスクロールボックスの高さより小さい場合,垂直スクロールバーは表示されません。』

・・・と説明されている。ってコトは、Imageコントロールに画像をセットした状態で、上の『スクロールバーが表示されない状態を明示的に回避(Rangeの値を手動で大きく設定)』してあげれば、スクロールバーが必ず表示されるはず。そう思って書いたのが次のコード。

  //水平スクロールバーの Range がスクロールボックスの幅より小さい場合,
  //水平スクロールバーは表示されない
  if ScrollBox1.HorzScrollBar.Range < ScrollBox1.Width then
  begin
    //表示したい画像の幅をRangeの値に設定
    ScrollBox1.HorzScrollBar.Range := Image1.Picture.Bitmap.Width;
  end;

  //垂直スクロールバーの Range がスクロールボックスの高さより小さい場合,
  //垂直スクロールバーは表示されない
  if ScrollBox1.VertScrollBar.Range < ScrollBox1.Height then
  begin
    //表示したい画像の高さをRangeの値に設定
    ScrollBox1.VertScrollBar.Range := Image1.Picture.Bitmap.Height;
  end;

  //ScrollBarを最も上へ&最も左へ移動
  ScrollBox1.VertScrollBar.Position := 0;
  ScrollBox1.HorzScrollBar.Position := 0;

  //ScrollBarを最も下へ&最も右へ移動
  //ScrollBox1.VertScrollBar.Position := VertPositionMax(ScrollBox1);
  //ScrollBox1.HorzScrollBar.Position := HorzPositionMax(ScrollBox1);

  //画像を表示
  Image1.Visible := True;

このように「これまでに書いたコードには一切変更を加えずに問題を解決する」ことに、
一応成功☆

もしかしたら、もしかしたら、同じ問題で悩んでいる人が、
どこかにいるかもしれないから・・・

3.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。記載した内容を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。