このドキュメントでは、次のトピックについて説明します。
ダイアログの直下の子である "最上位" コントロール以外にも、他のコントロールの子としてコントロールを作成できます。 このようなコントロールはネスト構造コントロールと呼ばれ、 親コントロールはコンテナと呼ばれます。 同一の親を持つ子コントロール集合を表すのに兄弟という用語を使います。 明らかに、コントロール階層内には多くの異なる兄弟コントロール集合が存在し得ます。
コントロール階層を作成することによって、Natural プログラマはコントロールをグループ化でき、Natural プログラム内で簡単かつ効率的に操作できるようになります。 以下に、ネスト構造コントロールの特徴について説明します。
ネスト構造コントロールの位置は、ダイアログではなくコンテナコントロールのクライアントエリアに対する相対位置です。
ネスト構造コントロールの表示は、祖先のウィンドウの大きさで切り取られます。 つまり、コンテナの境界線の外にあるネスト構造コントロールのエリアは表示されません。 ダイアログエディタでは、ネスト構造コントロールをコンテナの外にドラッグできません。
ネスト構造コントロールは、コントロールシーケンス内での位置に関係なく、常にコンテナコントロールの前面に表示されます。
ネスト構造コントロールは、コンテナコントロールとともに移動されます。 これは、ダイアログエディタにおける編集時(コンテナをドラッグするとき)とランタイム時(コンテナの RECTANGLE-X
属性および/または RECTANGLE-Y
属性を変更するとき)の両方に当てはまります。
コンテナコントロールが非表示になると、ネスト構造コントロールは、VISIBLE
属性が変更されていなくても非表示になります。
コンテナコントロールが使用不可になると、ネスト構造コントロールは、ENABLED
属性が変更されておらずコントロールがグレー表示されていなくても、ランタイム時に使用不可になります。
コンテナコントロールが削除されると、ネスト構造コントロールも削除されます。
注意:
Natural はコントロール階層に含まれるレベル数を制限しません。 ダイアログエディタステータスバーのコンボボックスに、コントロール名とともにコントロールのレベルが表示されます。
すべてのコントロールタイプがコンテナになれるわけではありません。 例えば、コントロールを入力フィールドの子として作成することはできません。 Natural によってサポートされるコンテナコントロールには、現時点では以下の 3 つのタイプがあります。
新しい "コンテナ" スタイルが設定されるグループフレーム。 このスタイルは、グループフレームの作成後にダイアログエディタの属性ウィンドウで変更できます。 グループフレームがコンテナに変換されると、コンテナに含まれるすべてのコントロールは、グループフレームの子孫になるようにコントロール階層で移動されます。 グループフレームがコンテナ以外に変換されると、グループフレームの直下の子はグループフレームの兄弟になるように 1 つ上の階層レベルに移動されます。
レジストリに "OLEMISC_SIMPLEFRAME" としてマークされる ActiveX コントロール。 このフラグは、設計によって特定の ActiveX コントロールクラスに固定されます。
コントロールボックス。 このコントロールタイプは常にコントロールコンテナです。 実際、これがこのコントロールの目的のすべてです。 詳細については、「コントロールボックスの操作」を参照してください。
ネスト構造コントロールは、ネストしないコントロールと同じ方法でダイアログエディタで作成します。 コントロール挿入時に最初にマウスの左ボタンをコンテナコントロール上でクリックすると、Natural によって新しいコントロールがコンテナの子として自動的に作成されます。 マウスボタンを挿入モードでクリックする前でも、マウスカーソルがダイアログ上を移動するのに合わせて、ダイアログエディタのステータスバーがコンテナに対する相対的なマウス座標で絶えず更新されます。
また、前述のようにグループフレームをコンテナに変換するときに、ネスト構造コントロールがダイアログエディタ内で間接的に作成されます。
ダイアログのハンドルではなく必要なコンテナコントロールのハンドルとして PARENT
属性を指定することによって、PROCESS GUI ACTION
ADD
ステートメントを使用してランタイム時にネスト構造コントロールをダイナミックに作成できます。 ネスト構造コントロールの位置(RECTANGLE-X
属性および RECTANGLE-Y
属性)は、コンテナのクライアントエリアに対して相対的に指定する必要があります。 コントロールのクライアントエリアは、3-D ボーダー、"フレーム" スタイルによって生じる 1 ピクセルフレーム、コントロールのスクロールバーなどのフレームコントロールを除いた、コントロールの内部エリアです。
ダイアログエディタは、親が同じではない(つまり、兄弟でない)コントロールの複数選択を禁止します。 これは、複数のコントロールが "rubber banding"(マウスの左ボタンを押したままドラッグして範囲を選択する)と拡張選択(Shift キーを押したままコントロールを選択する)のどちらで選択されたかに関係なく適用されます。 ただし、選択したコンテナコントロールを削除すると、その直接的および間接的な子(子孫)はすべて、明示的に選択していなくても削除されます。 そのため、クリップボードへの切り取り操作は、選択したコントロールおよびすべての子孫コントロールをクリップボードにコピーします。 クリップボードへのコピー操作はコンテナだけをコピーするかコンテナに加えてすべての子孫をコピーするか決まっていません。 この場合は、メッセージボックスが表示され、ユーザーはこれらの 2 つのオプションから選択できます。
クリップボードからのコントロールの貼り付けでは、新規作成されるコントロールと同じコントロールシーケンス(タブオーダー)挿入位置ロジックが使用されます。 どちらの場合も、新しいコントロールが、選択された兄弟およびその子孫のすぐ後のコントロールシーケンス位置に作成されます。 兄弟以外のコントロールが選択された場合は、選択された(アクティブな)コントロールのコントロールシーケンス内の位置に基づいて、"事実上の兄弟" が代わりに使用されます。 選択された "アクティブ" であるコントロールとは、黒(グレーではない)の選択ハンドルを使用して強調表示された選択済みコントロールを指します。 選択がアクティブでない場合、コントロールはコントロールシーケンス内で最初の兄弟コントロールの直前か、あるいはコンテナが空であればコンテナの直後(または最上位コントロールのコントロールシーケンスの前)に挿入されます。 ただし、コントロールシーケンスは階層に関係なくメンテナンスされることに注意してください。 コントロールが作成されたら、
メニューの オプションを使用して、どのコントロールもコントロールシーケンス内の任意の位置に明示的に移動できます。新規作成されるコントロールの階層内での位置の決定方法は、これら 2 つの場合で少し異なります。 コントロールを新しく作成する場合は、マウスの左ボタンを押した位置で最上位コンテナを探すとコンテナを特定できます。 ただし、コントロールをクリップボードから貼り付ける場合は、使用できる "(X, Y)" 位置がないため、 コントロールが選択されていればそのコンテナ、選択されていなければダイアログ自体がコンテナであるとみなされます。 つまり、例えばコントロールをあるコンテナから別のコンテナにコピーおよび貼り付けする場合、貼り付ける前に、コンテナ自体ではなく 2 つ目のコンテナ内のコントロールを選択する必要があります。 2 つ目のコンテナが空であれば、まずダミーの子コントロールを暫定的に作成する必要があります。ダミーの子コントロールは、貼り付け操作の完了後に削除できます。
コントロールを削除すると、その子孫コントロールも削除されます。
ネスト構造コントロールの導入によって、
コマンドの動作が以下のように変わりました。コントロールが現在選択されていない場合、コマンドはすべての最上位コントロールを選択します。
コントロールが現在選択されている場合、その兄弟である他のすべてのコントロールも追加選択されます。
したがって、階層の 1 レベルだけを使用する一般的な場合では、
コマンドは以前と同様にすべてのダイアログコントロールを選択します。