23
 配置の詳しい解説 




配置の基礎 および 並べ配置について と合わせてお読みください

 配置の基礎 において、「配置IDの取得」とその「配置」というように2段に分けると説明しました。その理由は、配置IDに対して各種属性を設定できるようにするためです。以下はそれらを解説します。
 なお、この章で解説する配置は「並べ配置」という種類です。そのほかに、「座標配置」、「格子配置」という配置手段もあります。後者2つについては その他の配置手段 をお読みください。


 
 
パディング
 
 

 たとえば、2つのボタンを縦方向に配置すると以下のようになります。
 ・−−−−−−・ ←ウィンドウの外枠
 |・−−−−・|
 ||ボタン1|| ←ボタン
 |・−−−−・|
 |・−−−−・|
 ||ボタン2|| ←ボタン
 |・−−−−・|
 ・−−−−−−・
 ウィンドウサイズはこの二つのボタンをぴったり包み込むよう自動調整されるため窮屈に感じるかも知れません。
 ウィジェット配置に余裕を持たせるのに以下の方法があります。
  1. ウィンドウサイズを明に指定
  2. 一見すると良い方法のように思えますが、その後のプログラム修正でウィジェットが大きくなったり、ウィジェットの数が増えたりすると、その都度、適切なウィンドウサイズを考える必要があり煩雑です。
  3. パディングを使う
  4. 「パディング」とは詰め物です。このケースでは配置に対してパディングを指定することで空きを作ることができます。その後のプログラム修正でウィジェットが大きくなったり、ウィジェットの数が増えた場合であっても、GUIライブラリが適切に調整してくれます。
 二つのウィジェットを収容する”配置”にパディングを指定することで以下のように余裕が生まれます。(サンプル:"padding-for-pack.exe" を実行してみてください)
 ・−−−−−−−−・ ←ウィンドウの外枠(=配置)
 |        |
 | ・−−−−・ |
 | |ボタン1| | ←ボタン
 | ・−−−−・ |
 |        |
 | ・−−−−・ |
 | |ボタン2| | ←ボタン
 | ・−−−−・ |
 |        |
 ・−−−−−−−−・
■配置へのパディング

構文=
<Xサイズ>と <Yサイズ>を <配置ID>に パディングを設定 → ・ <Xサイズ>を <配置ID>に パディングの幅を設定  → ・ <Yサイズ>を <配置ID>に パディングの高さを設定 → ・           注:サイズの単位はピクセル
 配置内に収容するウィジェット群周辺に隙間を作ります。
 「パディングを設定」は幅と高さ両方に作用します。「パディングの幅を設定」と「パディングの高さを設定」は個別に作用します。
       プログラム例:
20と 10を 配置1に パディングを設定

    サンプルプログラム "padding-for-widget.src" にも例があります

■ウィジェットへのパディング

構文=
<Xサイズ>と <Yサイズ>を <ウィジェットID>に パディングを設定 → ・ <Xサイズ>を <ウィジェットID>に パディングの幅を設定  → ・ <Yサイズ>を <ウィジェットID>に パディングの高さを設定 → ・           注:サイズの単位はピクセル

 ウィジェットに対してパディングを指定した場合は、ウィジェット内部、つまり、ウィジェット内に描画した文字周辺に空白を作ります(ウィジェットの外側ではありません)。
 文字周辺の空白を大きくする目的のほか、小さくする目的でも利用できます。もしデフォルトのままでボタンの文字周辺の空白がフォントサイズのわりには大きいと感じた場合は、あえて小さな値でパディングを指定してみてください。(本ライブラリ装備のダイアログのボタンはそのようにしています)

■パディング関係のサンプルを走らせて確認
 3つのプログラムを用意しています。実際に走らせてパディングの効果を確認してください。
       サンプルプログラム:
padding-nopadding.exe
パディング無し

padding-for-pack.exe
配置にパディングを設定
ウィジェット周辺に空きが出来ています

padding-for-widget.exe
ウィジェットにパディングを設定
文字周辺に空きが出来ています


 
 
複雑な配置
 
 

【上向き三角形の配置】
 次の図のような三角形の配置を考えてみます。
 ・−−−−−−−−−−−−・
 |   ・−−−−・   |
 |   |ラベル1|   | ←配置1
 |   ・−−−−・   |
 |・−−−−・・−−−−・|
 ||ラベル2||ラベル3|| ←配置23
 |・−−−−・・−−−−・|
 ・−−−−−−−−−−−−・
 上のような配置を実現するのが次のサンプルです。
      side-top-3labels.src
〜略〜     (配置のID)       ラベル1を 並べ配置のIDを取得し 配置1に 入れ  ←ラベル1用       ラベル2と ラベル3を 2個で        これらの並べ配置のIDを取得し 配置23に 入れ  ←ラベル2と3用     (並べ方向)       左から右を 配置23に 並べ方向を設定し     (配置)       配置1を  配置し       配置23を 配置し
 まず三角形の頂点である「ラベル1」を配置します。並べ方向はデフォルトの”上から下”なので、ラベル1の下方向には余裕があります。そこへ配置23を置く感じになります。配置23の並べ方向として”左から右”を指定しているので、ラベル2とラベル3は横に並ぶことになります。

【下向き三角形の配置】(失敗版)
 では今度は下向き三角形です。
 ・−−−−−−−−−−−−・
 |・−−−−・・−−−−・|
 ||ラベル1||ラベル2|| ←配置12
 |・−−−−・・−−−−・|
 |   ・−−−−・   |
 |   |ラベル3|   | ←配置3
 |   ・−−−−・   |
 ・−−−−−−−−−−−−・
 普通に書くなら次のような記述になります。
      side-top-3labels-bad.src
〜略〜     (配置のID)       ラベル1と ラベル2を 2個で         これらの並べ配置のIDを取得し 配置12に 入れ       左から右を 配置12に 並べ方向を設定し       ラベル3を 並べ配置のIDを取得し 配置3に 入れ     (配置)       配置12を 配置し       配置3を  配置し
 実行結果は次のようになります。
 ・−−−−−−−−−−−−−−−−−−・
 |・−−−−・・−−−−・・−−−−・|
 ||ラベル1||ラベル2||ラベル3||
 |・−−−−・・−−−−・・−−−−・|
 ・−−−−−−−−−−−−−−−−−−・
 予想に反してすべて横並びになってしまいました。理由は以下のようなものです。
 まずラベル1とラベル2を横方向に配置しました。この直後、横方向には配置の余裕がありますが、縦方向には有りません。そのため余裕のある”もっと右”の場所にラベル3が配置されてしまいました。
 整理します。
 縦方向の配置では縦に配置余裕がありますが横には有りません(たとえ見た目が空いていたとしても)。
 逆に、横方向の配置では横方向に配置余裕がありますが縦には有りません。
 先のプログラムでラベル1と2を横に配置した直後の以下の状態では、
      → 並べ方向 →
 ・−−−−−−−−−−−−−−−−−・
 |・−−−−・・−−−−・     |
 ||ラベル1||ラベル2| ←  → |
 |・−−−−・・−−−−・余裕あり |
 |   ↑     ↑        |
 | 1が占有し 2が占有し     |
 | 余裕無し  余裕無し      |
 |   ↓     ↓        |
 ・−−−−−−−−−−−−−−−−−・
 上記のように、横並びをしたウィジェットの下方は見えない占有領域があると考えてください。この占有領域には(簡単な配置では)他のウィジェットを置けません。

【下向き三角形の問題解決】
 上の問題は、「ラベル3」(三角形の頂点)の並べ方向を”下から上”にすることで解決します。
      side-bottom-3labels.src
〜略〜     (配置のID)       ラベル1と ラベル2を 2個で        これらの並べ配置のIDを取得し 配置12に 入れ       左から右を 配置12に 並べ方向を設定し       ラベル3を 並べ配置のIDを取得し 配置3に 入れ       下から上を 配置3に 並べ方向を設定し     ←★注目     (配置)       配置3を  配置し     ←★三角形の頂点を先に       配置12を 配置し
 上記では下向き三角の頂点である「ラベル3」の並べ方向を下から上にしています。



縦・横混在ではウィジェット3つまでは比較的簡単。特に上向き三角配置は容易。
下向き三角は下段の頂点の並べ方向を”下から上”かつ先に配置すると良い。
それ以上複雑な配置(田の字など)は ”フレーム”または ”格子配置”を使う。
 →フレームの解説は フレーム
 →格子配置の解説は 格子配置


 
 
その他、配置関係の設定
 
 

■並べ方向を設定

構文=
<並べ方向>を <配置ID>に 並べ方向を設定し   ↑文字列      並べ方向は以下のシンボル(文字列定数)をお使いください         上から下   ←デフォルト         下から上         左から右         右から左
       プログラム例:
    ラベル1と ラベル2と ボタン1を 3個で
             これらの配置IDを取得し 配置1に 入れ

    左から右を 配置1に 並べ方向を設定し
 ウィジェットをどの方向に並べるかは、ウィジェットへの設定ではなく、それを担当する配置への属性設定となります。
 上の例で”配置1”は ラベル1, ラベル2、 ボタン1 を担当しますが、それらの並び順は配置1の属性として指定します。
 「上から下」がデフォルトのため、それで良いなら指定する必要はありません。

■横に伸ばす、縦に伸ばす、縦横に伸ばす

構文=
    <配置ID>を 横に伸ばす     <配置ID>を 縦に伸ばす     <配置ID>を 縦横に伸ばす

       サンプルプログラム:
label-fill-x.exe , label-fill-y.exe を起動して解説をお読みください。ソースも参考にしてください。
いずれのソースも「メイン」は副ソースである label-common-main.src
の中で定義されています

 配置に含まれるウィジェットを横や縦に伸ばした状態で配置します。
 デフォルトの並べ方向は”上から下”で、ウィジェットは横方向を占有領域とするため横方向へは伸ばすことができます。しかし縦方向の占有領域は保有していないため「縦に伸ばす」ことはできないことに注意してください。
 並べ方向を「左から右」(あるいは右から左)にした場合にはこれが逆になり、縦には伸ばせますが横へは伸ばせません。

■占有領域を拡張

構文=
<配置ID>の 占有領域を拡張
       プログラム例:
label-fill-x-expand.exe
label-fill-y-expand.exe
label-fill-both-expand.exe
を起動して解説をお読みください。ソースも参考にしてください。

     注:いずれのソースも、「メイン」は副ソースである
       label-common-main.src の中で定義されています
 配置に含まれるウィジェットが保有する占有領域を拡張します。これにより、上から下の並べ方向のときのウィジェットの上下方向に拡張余地ができます。
 「縦に伸ばす」を併用すれば縦方向にウィジェットを、あるいはウィジェットの周りの空き領域を伸ばすことができます。
 逆に、左から右の並び方向のときのウィジェットでは左右方向に拡張の余地ができ、「横に伸ばす」を併用すれば横方向にウィジェットを伸ばすことができます。
 ただ、上から下に並べたウィジェットを上下に伸びるようにすること、あるいは左から右に並べたウィジェットを左右に伸びるようにすることは、デザイン上かえって変な感じなるかも知れません。たとえば電卓の数字ボタンがウィンドウサイズに従って伸び縮みすると違和感があるのと同じです。

■配置に収容するウィジェットの寄せ
 (ウィジェットの「寄せを設定」と同じものですが解説を分けました)
 配置あるいはフレームに収容するウィジェットの寄せを指定するものです。デフォルトは中央寄せです。

構文=
<寄せ指定>を <配置ID>に 寄せを設定 → ・      寄せ指定:以下のいずれかの単語名を指定してください。         西寄せ         北西寄せ         北寄せ         北東寄せ         東寄せ         南東寄せ         南寄せ         南西寄せ         中央寄せ (デフォルトなので指定する必要はありません)
       プログラム例:
東寄せを 配置1に 寄せを設定する
       サンプルプログラム:
"anchor-pack.src" をご覧ください
 サンプルプログラムの anchor-pack.src について補足します。
 全体としては次のようなレイアウトになっています。
 ・−−−−−−−−−−−−−−−−−−・
 |      ・−−−−・      |
 |      |ラベル1|      | ←配置1
 |      ・−−−−・      |
 |                  |
 |・−−−−・・−−−−・      |
 ||ラベル2||ラベル3|      | ←フレーム中段
 |・−−−配置23−−−・      |
 |                  |
 |・−−−−・      ・−−−−・|
 ||ラベル4|      |ラベル5|| ←フレーム下段
 |・−配置4・      ・−配置5・|
 |                  |
 ・−−−−−−−−−−−−−−−−−−・
 フレーム中段にはラベル2とラベル3を収容しています。フレーム中段に対して「西寄せ」を指定しています。(配置23に対して寄せを指定しても無視されます)
 フレーム下段にはラベル4とラベル5を収容しています。それぞれのラベルが位置的に分離しているため別々に配置IDを割り当て、それぺれ「左から右」「右から左」の並べ方向を指定しています。この並べ方向のみで左右に配置されるため、フレームでは寄せを指定していません。


 
 
フレーム
 
 

 フレームはウィジェットを収容するための(入れ物としての)ウィジェットです。デフォルトでは透明で見えないため存在を主張することはありません。
 概念としては配置と少し似ていますが、配置は文字通り配置するための仕組みなのに比べ、フレームはウィジェットとしての実体があります。たとえば意図的に背景色を塗ったり、枠が見えるようにすることもできます。
 「フレームに複数のウィジェットを収容し、それを配置する」という使い方になります。この仕組みを使うことでかなり複雑なウィジェット配置も可能になります。フレームをさらに上位フレームに収容することもできます。

■フレームのIDを取得

構文=
(構文1)     <親ウィジェット>で フレームのIDを取得して有効化 → ID (構文2)     <親ウィジェット>で フレームのIDを取得      → ID
 フレームのIDを取得します。フレームはウィジェットの一種であるため、扱いはウィジェットIDとほとんど同じになります。
 前者はID取得と同時にそれを有効化してしまいます。通常は引き続いてそのフレームに収容するウィジェットの定義に入るため、フレームIDの取得直後に有効化することが多く、その便宜のため「フレームのIDを取得して有効化」という単語を設けています。
 後者はID取得のあと、そのフレームに対して属性設定をしたい場合に使ってください。

■サンプルソースの解説
 サンプルプログラムをご覧ください。(要所だけ示します。実際に起動してみてください)
       side-frame-4labels.src:

←フレーム上段

←フレーム下段
    〜略〜

 (フレーム)
    メインウィンドウで フレームのIDを取得して有効化し フレーム上段に 入れ
    メインウィンドウで フレームのIDを取得して有効化し フレーム下段に 入れ

 (4個のラベル)
    フレーム上段と 2個で ラベルのIDを複数取得し
                     ラベル1と ラベル2に 入れ
    フレーム下段と 2個で ラベルのIDを複数取得し
                     ラベル3と ラベル4に 入れ

 (フレーム上段内ラベルを修飾)
    「 ラベル1 」を ラベル1に テキストを設定し
    〜略〜
    ラベル1を 有効化し
    ラベル2を 有効化し

 (フレーム内配置)
    ラベル1と ラベル2と 2個で  これらの並べ配置のIDを取得し
                     配置上段に 入れ
    左から右を 配置上段に 並べ方向を設定し
    配置上段を 配置し

    ラベル3と ラベル4と 2個で  これらの並べ配置のIDを取得し
                     配置下段に 入れ
    左から右を 配置下段に 並べ方向を設定し
    配置下段を 配置し

 (2つのフレームを配置)
    フレーム上段と フレーム下段と 2個で
           これらの並べ配置のIDを取得し 配置全体に 入れ
    配置全体を 配置し
 上のソースコードを解説します。
 まず「フレーム上段」と「フレーム下段」という2つのフレームを用意しています。フレームのIDを取得すると同時に有効化しています。
 続いてラベルを定義します。
 次に、ラベル1と2を収容する「配置上段」を作って配置し、次いでラベル3と4を収容する「配置下段」を作って配置します。
 最後に2つのフレームを「配置全体」というIDに統合して配置しています。
 このようにすることで、多少手間はかかりますが田の字型のウィジェット配列を確実におこなうことができます。
 ポイントの一つは以下の部分です。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
 ↓親としてこれを指定
フレーム上段と 2個で ラベルのIDを複数取得し
                ラベル1と ラベル2に 入れ
\___________________________/
 上のように、ウィジェットのIDを取得する際、親ウィジェットとしてフレームを指定します。これによりラベル1と2がフレームに所属することが示されます。
 次のポイントは以下の部分です。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
 ↓ウィジェットのように扱う
フレーム上段と フレーム下段と 2個で
    これらの並べ配置のIDを取得し 配置全体に 入れ
\___________________________/
 このように、フレームを通常ウィジェットのように扱い、配置をおこないます。