この特集のトップページへ
Chapter 7:プレゼンテーション層の構築

7.4.1 顧客管理用のフォーム
●フォームのサイズに部品を揃える
 ところで,Fig.7-16に示したFormCustomerフォームには,さまざまなコンポーネントを載せた。FormCustomerフォームは,ユーザーがウィンドウサイズを変更できる可変ウィンドウとする。そうすれば,ユーザーは画面一杯に広げることで,DGrid_Customerデータグリッドに表示された横に長い列も,スクロールせずに参照できるようになるからである。

 しかしこのままだと,ユーザーがウィンドウサイズを変更しても,そのうえに載せられているコンポーネントのサイズは変更されないので,ウィンドウサイズを変更しても余白ができるだけで無意味である。できることならば,載せられているコンポーネントのサイズをウィンドウサイズに合わせて調整し,ウィンドウ一杯にDGrid_Customerデータグリッドが占めるようにしたい(Fig.7-19)。

Fig.7-19 フォームのサイズに部品を合わせる
fig7_19

 Fig.7-19に示したようにウィンドウサイズに合わせてコンポーネントのサイズを調整するには,ウィンドウサイズが変更されたときにコンポーネントのサイズを変更するような処理を実装すればよい。ウィンドウサイズが変更されるときには,フォームのResizeイベントが発生する。よって,コンポーネントのサイズの変更処理はResizeイベントに実装すればよいということになる。

 フォームのサイズは,次の4つのプロパティに格納されている。

  • Widthプロパティ
     フォーム全体の幅。フォームの境界線なども含む。

  • ScaleWidthプロパティ
     フォーム内の描画領域の幅。フォームの境界線などは含まず,純粋な描画領域のみの幅。

  • Heightプロパティ
     フォーム全体の高さ。フォームの境界線やタイトルバーなどの高さも含む。

  • ScaleHeightプロパティ
     フォーム内の描画領域の高さ。フォームの境界線やタイトルバーなどは含まず,純粋な描画領域のみの幅。

 WidthプロパティとScaleWidthプロパティ,HeightプロパティとScaleHeightプロパティの違いには気を付けたい。WidthプロパティならびにHeightプロパティは,フォーム全体の幅と高さを示すのに対し,ScaleWidthプロパティならびにScaleHeightプロパティは描画領域の幅と高さを示す。ちなみにWindowsの世界では,フォーム内の描画領域のことを「クライアント領域」と呼ぶ。

 さて,Resizeイベント内では,フォームのScaleWidthプロパティとScaleHeightプロパティを参照し,動的にそのフォームの上に載っているコンポーネントの位置や幅,高さを設定すればよい。コンポーネントの位置,幅,高さは,次の6つのプロパティで示される。

  • Leftプロパティ
     コンポーネントの左上のX座標を示す。

  • Topプロパティ
     コンポーネントの左上のY座標を示す。

  • Widthプロパティ
     コンポーネント全体の幅。コンポーネントの境界線なども含む。何を境界線とするのかは,コンポーネントの種類による。コンポーネントの種類によっては,境界線がなく,ScaleWidthプロパティと同じ値を示すこともある。

  • ScaleWidthプロパティ
     コンポーネント内の描画領域の幅。境界線などは含まない。

  • Heightプロパティ
     コンポーネント全体の高さ。コンポーネントの境界線なども含む。何を境界線とするのかは,コンポーネントの種類による。コンポーネントの種類によっては,境界線がなく,ScaleHeightプロパティと同じ値を示すこともある。

  • ScaleHeightプロパティ
     コンポーネント内の描画領域の高さ。境界線などは含まない。

 一般に,Resizeイベント内には,フォームのScaleWidthプロパティとScaleHeightプロパティを参照してフォームの描画領域の幅と高さを取得し,その幅と高さに収まるようにコンポーネントのTopプロパティ,Leftプロパティ,Widthプロパティ,Heightプロパティを調整するような処理を実装する。

 実際に顧客情報を表示するフォームであるFormCustomerフォームのResizeイベントの処理を実装したものが,List 7-5である。

 List 7-5では,まず5行目と6行目においてFRAME_NAVIフレームのX座標とY座標をともに0に設定する。これにより,FRAME_NAVIフレームがフォームの左上にぴったりと合わせられる。Fig.7-16に示したように,FRAME_NAVIフレームはフォームの上部にあり,ボタンやテキストボックスなどをそのうえに配置している。フレームを動かせば,自動的にフレーム上に載せられているボタンやテキストボックスなどのコンポーネントもそれに合わせて移動する。

 次に,7行目でFRAME_NAVIフレームの幅をフォームの幅に合わせる処理をしている。これにより,FRAME_NAVIフレームがフォームの幅一杯に広がるということになる。

 9〜12行目が顧客の一覧を表示するDGrid_Customerデータグリッドの位置ならびに大きさを変更するための処理である。

 まず,9行目でDGrid_CustomerデータグリッドのX座標を0にし,Y座標をFRAME_NAVIフレームの高さに合わせる。これにより,DGrid_Customerデータグリッドがフォームの一番左にぴったり合い,また,FRAME_NAVIフレームの下端とぴったり合うことになる。

 次の11行目では,DGrid_Customerデータグリッドの高さをフォームの高さからFRAME_NAVIフレームの高さを引いたものに設定している。これにより,DGrid_Customerデータグリッドの高さは,フレーム全体に伸びることになる。また,12行目でDGrid_Customerデータグリッドの幅をフォームの幅に合わせているので,幅はフォームの幅まで広がることになる(Fig.7-20)。

Fig.7-20 フォームの大きさに合わせてコンポーネントの大きさを合わせる手順
fig7_20

 なお,2行目にあるOn Error Resume Nextステートメントは,エラーが発生しても,それを無視するためのものである。エラーが発生するのは,ユーザーがウィンドウサイズを小さくしすぎたときで,11行目で設定しているFormCustomer.ScaleHeight - DGrid_Customer.Topの値が負になるときである。つまり,Heightプロパティに負の値を格納することができないためにエラーとなる。このエラー判定は,On Error Resume Nextステートメントを使わずに,11行目においてFormCustomer.ScaleHeight - DGrid_Customer.Topの値が負にならないことを確認してからDGrid_Customer.Heightプロパティにその値を格納するようにしてもよい。いやむしろ,On Error Resume Nextステートメントを使わないほうが可視性に優れているのでよいだろう。

 今回は,フォーム上の2つのコンポーネントの位置と大きさを調整するだけであるため,11行目でIf文などを使い,Heightプロパティに設定しようとしている値が負にならないことを確認するのは面倒な作業ではない。しかし,フォーム内にたくさんのコンポーネントがあり,そのそれぞれの位置や大きさを設定するような状況では,If文をたくさん並べることになり,やや面倒になる(実際そうした事例は「7.4.7 顧客の印刷処理」で登場する)。そういった意味で,設定しようとしている値が負にならないのかをチェックするのではなく,On Error Resume Nextステートメントを使うことにした。

Prev 9/134 Next