MS Access Tips/Sample and VBA and Blog customize etc...

フォーム上のコントロールのサイズを拡大/縮小する関数

モニターの解像度によってフォームと、その全てのコントロールのサイズを指定した倍率で拡大/縮小したい

このような質問をたまに見かけます。

単純に全てのコントロールの 左位置, 上位置, 幅, 高さ に指定倍率をかければよさそうに思えます。

当ブログでも同じロジックでレポートを拡大/縮小する関数を下記で紹介しました。

レポートのサイズを拡大縮小する関数 - hatena chips

フォームでも同じように出来るのですが、オプショングループやタブコントロールのような子コントロールを持つコントロールがあると、なぜか、レイアウトか崩れてしまうという現象が生じます。

moug モーグ|Access (VBA)|全てのコントロールのサイズを大きくするとオプショングループが変になる

拡大/縮小アニメーション

難易度:

レイアウトが崩れる原因

オプショングループ/タブコントロール内の子コントロールを移動/サイズチェンジするとき、親コントロールの境界を超えると、親コントロールの境界もそれに合わせて移動する。逆に、親コントロールを移動させるとき子コントロールが範囲外に出そうになるとそこで止まってしまう。

というように移動やサイズに関しては完全な親子関係になっていないために親コントロールが想定より大きくなってしまうという現象になります。

また、フォームの幅はコントロールの移動/拡大で合わせて拡張されるのですが、セクションの高さは合わせて拡張されずに(デザインビューの時は拡張される)、
2100:コントロールまたはサブフォーム コントロールが大きすぎるため、配置できません
という実行時エラーが発生します。

対策方針

拡大の場合、先に親コントロールのサイズを広げておいて、子の移動/サイズ変更、 というように順番を考慮すればなんとかなると単純に考えてみたのですが、上記の仕様のおかげで親コントロールの位置/サイズが変動してしまうのでうまく行きません。

いろいろ考えて、下記のようなロジックにたどり着きました。

事前にすべてのコントロールの変更後の位置、サイズを計算しておいて配列等に格納しておく。
子コントロールの方から先に、事前に計算しておいた値で移動/サイズ変更を行います。 この際、移動→サイズ変更の順で設定します。でないと、子コントロールに引っかかってサイズ変更に失敗する場合があります。

拡大の場合のみ、事前にセクションの高さをできるかぎり広げておく。(上記の実行時エラー対策)

改ページコントロールには、サイズ(width, height)プロパティがないので別扱いにする。

(以上の分析、方針に関しては、YU-TANG さんに提供いただいたサンプルのコメントに多大なサジェスチョンをいただきました。)

手抜きコード

上記の方針で作成したコードです。ただし、On Error Resume Next ですべてのエラーを無視するという手抜きのコードです。

フォームモジュールに記述します。

このコードで Access2003, Access2007 では問題なく動作しました。が、なぜか、Access2010 だと、タブコントロール内にオプショングループを配置したときに、うまく行かない場合がありました。

エラー処理等を追加したコード

Access2010 でうまく行かない原因をつかみきれなかったので、目標値にならないコントロールがあるかどうかチェックしてあれば修正するというリトライコードを追加しました。

さらに、フォントサイズの最小値(1)と最大値(127)を越えないようにする処理と、フォームの幅の上限値、セクションの高さの上限値を越えないようにする処理も追加しました。

また、想定外のエラーが出たときはメッセージを表示するようにしました。

標準モジュール

サンプルファイルが下記からダウンロードできます。
FrmSizeChange_07.zip (Access 2007 形式 - 32kb)
FrmSizeChange.zip (Access 2002-2003 形式 - 25kb)
FrmSizeChange_2k.zip (Access 2000 形式 - 24kb)

拍手する

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/346-cf60e3fc
該当の記事は見つかりませんでした。