まったく、たまにはプログラムを組まないと勘がにぶっちまうぜ。なので、強引にこじつけてはプログラミングをせざるを得ないように自分を追い込んでいる。今は、Delphiのプロジェクトを作業中だ。そんな中で見つけた激レアなティップスを不定期に紹介だ。
なぜ激レアかというと、自分ではまって、これは何処かに書かずにおれないということで、ほかの誰かに役立つとは限らないからだ。いい意味のレアではないのでご注意。
さて今日は、コンポーネントのAnchorsプロパティについてだ。このプロパティについては以下のとおり。
property Anchors: TAnchors;
type TAnchors = set of TAnchorKind;
type TAnchorKind = (akTop, akLeft, akRight, akBottom);
見てのとおり、Anchorsは集合型であり、値としてはTAnchorKindの4つの値を持つことができる。値はそれぞれ上、左、右、下のそれぞれの位置に対応し、これを集合に含む場合には親コンポーネントの対応する辺に対して位置が相対的に保持される。
たとえば、パネル(TPanel)コンポーネントにボタン(TButton)コンポーネントを置く場合、ボタンをパネルの大きさにかかわらず右端に置いておきたいという場合、akRightをAnchorsに含めればボタンの右位置は常にパネルの右辺から見て同じ位置に保たれる。こういうのが、典型的な使い方だろう。
多くの場合は、サイズ可変のフォーム(TForm)にパネルを上下左右のアラインメントで配置し、そこにボタンを置いて余計なコードを書かずにボタンの位置を自動的に保持したいということがあるだろう。こういう場合には、うってつけだ。今回はまったパターンもこれだ。
フォームをサイズ変更可能なように作成し(bsSizeable)、そこにパネルをアラインメントalBottomで置く。このパネルは、フォームの大きさにかかわらず、常にフォームの下部を占めるようになる。そこに、Anchors := [akRight, akBottom]としてボタンをパネルの右端近くbに置く。理屈では、このフォームのサイズを変更した場合、パネル上に配置したボタンは常に右端に位置するようになるはずだ。
しかし、こううまくいかない場合もある。開いたフォームを見ると、ボタンがデザインしたときの位置と違っている。内側にあったり、外側に移動して欠けていたり。このあと、フォームの大きさを変えても、そのへんな位置関係を保持しようとする。
それは、フォームの位置をpoDefaultなどとした場合だ。この場合、位置はデフォルトとなり、サイズもデフォルトとなる。デフォルトとは、この場合お任せという意味だ。すると何と、フォームが作成されるときに、位置やサイズをWindows側に決められてしまうが、パネルやボタンが作成されるのはサイズなどが決められたあとだから、デザイン時と異なる位置関係を保持しようとしてしまう。
なので、Anchorsプロパティを使ってボタンの位置などを保持したい場合には、フォームはデザイン時のサイズそのままで開くようにpoDefaultPosOnlyとかpoDesignedなどを指定し、サイズ変更が必要ならOnShowメソッドをオーバーライドし、WindowStateプロパティを設定して最大化したり、Width,, Heightプロパティを設定してサイズ変更しよう。これならたぶん、うまくいくはずだ。