このドキュメントでは、次のトピックについて説明します。
通常、ダイアログエレメントはダイアログエディタを使用してダイアログに追加されます。 ただし、ダイアログエレメントは、ダイナミックに作成したり削除したりすることもできます。 例えば、ダイアログのレイアウトがコンテキストに強く依存している場合に、ダイアログエレメントをダイナミックに作成および削除します。
PROCESS GUI
ステートメントの ADD
アクションを使用すると、ダイアログエレメントがダイナミックに作成されます。 このアクションは、新規作成されたダイアログエレメントにハンドルを返します。 このハンドルは、ダイアログエレメントが作成されるとただちに、作成されたダイアログエレメントに指定された一連の属性を指し示します。
注意:
ActiveX コントロールの作成方法は、以下に説明する標準の方法とは少し異なります。 これについては、「ActiveX コントロールの操作」に記載されています。
使用可能なアクション、および渡すことのできるパラメータの詳細については、「標準化されたプロシージャの実行」を参照してください。
"handlename.attributename" 形式のハンドル属性オペランド(例:#PB-1.STRING
)を変更することによって、特定のダイアログエレメントの属性値を変更します。 ダイアログエレメントが未作成でハンドル変数が初期値(NULL-HANDLE
)の場合、ハンドル属性オペランド handlename.attributename はグローバル属性リストを参照します。
グローバル属性リストとは任意のダイアログエレメントに定義されたすべての属性の集合です。 Natural にはこの集合が 1 つ含まれています。 ダイアログエレメントは、作成されるときに常にグローバル属性リストから属性を "継承" します。 ダイアログエレメントが WITH PARAMETERS
オプション付きの PROCESS GUI
ACTION ADD
ステートメントで作成されるときは、属性は継承されません。
それぞれの属性設定を持つダイアログエレメントを(ダイアログエディタで)スタティックに定義するには、まずグローバル属性リスト内の属性に適切な値を設定し、それからダイアログエレメントを作成する必要があります。 作成後も、グローバル属性リスト内の属性値は変わりません。 次に作成されるダイアログエレメントは、変更された属性以外は、グローバル属性リストから前と同じ属性値を取得します。
"AFTER OPEN" イベントハンドラで検出される、グローバル属性リストのステータスは、スタティックに定義されるダイアログエレメントの影響を受けます。 したがって、"AFTER OPEN" イベントハンドラでダイアログエレメントのダイナミックな作成を始める前に、PROCESS GUI
ステートメントの RESET-ATTRIBUTES
アクションを使用して属性をリセットする必要があります。これにより、ダイアログエレメントがグローバル属性リストから予期しない値を継承するのを防ぐことができます。 この継承問題を避けるには、WITH PARAMETERS
オプション付きの PROCESS GUI
ステートメントの ADD
アクションを使用します。
異なるタイプのダイアログエレメントで使用すると異なる意味を持つ属性値を指定すると、予期しない結果になることがあります。 例えば、STYLE
属性値 "s" は、ビットマップコントロールタイプのダイアログエレメントに対しては "伸縮" を意味しますが、線コントロールタイプに対しては "固定" を意味します。
ダイアログエレメントをダイナミックに定義するには、PROCESS GUI
ステートメントの ADD
アクションを使用します。 PROCESS GUI
ステートメントの ADD アクションを使用すると、ステートメント内で属性値を指定できます。 PROCESS GUI
ステートメントの ADD
アクションは、グローバル属性リストからの属性の継承に影響されません。 ADD
アクションが実行される前に、ステートメントで指定された属性がグローバル属性リストに転送されます。
注意:
PARAMETERS 節 2 オプション付きの PROCESS GUI
ステートメントの ADD
アクションを使用すると、グローバル属性リストは使用されないか、または影響を受けません。 ダイアログエレメントの作成に必要なパラメータのうち、PROCESS GUI
ステートメントの ADD
アクションの WITH PARAMETERS
セクションで指定されなかったものには、デフォルト値が使用されます。 パラメータリストで明示的に渡されるパラメータだけがダイアログエレメントの作成に使用されます。
リストボックス項目および選択ボックス項目をダイナミックに作成するには、PROCESS GUI
ステートメントの ADD-ITEMS
アクションを使用する方が便利です。 この方法を使用すると、複数の項目を同時に作成できます。
例:
/* #PB-A inherits the current settings of the global attribute list #PB-A.STRING := 'TEST1' PROCESS GUI ACTION ADD WITH #DLG$WINDOW PUSHBUTTON #PB-A #PB-B.STRING := 'TEST2' /* #PB-B has the same attributes as #PB-A except STRING. This leads to #PB-B /* covering #PB-A. PROCESS GUI ACTION ADD WITH #DLG$WINDOW PUSHBUTTON #PB-B COMPUTE #PB-C.RECTANGLE-Y = #PB-B.RECTANGLE-Y + #PB-C.RECTANGLE-H + 20 /* #PB-B has the same attributes as #PB-A except RECTANGLE-Y /* #PB-C will be located 20 pixels below #PB-B PROCESS GUI ACTION ADD WITH #DLG$WINDOW PUSHBUTTON #PB-C
ダイアログエレメントをダイナミックに削除するには、PROCESS GUI
ステートメントの DELETE
アクションを使用します。 この方法は、設計時にダイアログエディタで作成したダイアログエレメントを削除する場合にも使用できます。 削除したダイアログエレメントのハンドルの使用は無効であるため、使用しないでください。
ダイアログエレメントをダイナミックに作成する必要のない場合もあります。 場合によっては、コンテキストに応じてダイアログエレメントを VISIBLE = TRUE
または VISIBLE = FALSE
にするだけで十分です。 この手法の方が効果的で操作が簡単です。 また、ナビゲーションシーケンスの任意の箇所にダイアログエレメントを "挿入" することもできます。
例:
DEFINE DATA LOCAL ... 1 #PB-1 HANDLE OF PUSHBUTTON ... END-DEFINE ... #PB-1.VISIBLE := FALSE ... IF... /* Logical condition #PB-1.VISIBLE := TRUE END-IF
ダイナミックに作成されたダイアログエレメントにイベントを関連付ける場合は、ダイアログエディタは使用できません。 このようなダイアログエレメントのイベントはすべて、DEFAULT
イベントで処理する必要があります。 このイベントでは、どのダイアログエレメントに対してどのイベントが発生したかを取り出す必要があります。 このコードは、ダイアログエディタによって生成されるコードに似ています。 一般的な構造は下記の例のようになります。
例:
DECIDE ON FIRST *CONTROL VALUE #PB-A DECIDE ON FIRST *EVENT VALUE 'CLICK' /* Click event-handler code NONE IGNORE END-DECIDE VALUE #PB-B ... VALUE #PB-C ... END-DECIDE
ダイナミックに作成した ActiveX コントロールのイベントコードでイベントパラメータが使用されている場合、イベントの名前を含む OPTIONS 2
ステートメントをイベントコードの前に記述する必要があります。そうしない場合、コンパイラはパラメータ参照(例:#OCX-1.<<PARAMETER-...>>
)を正常に処理できません。 ただし、スタティックに作成したコントロールのイベントに対する、ダイアログエディタによる OPTIONS
ステートメントの暗黙的な生成とは対照的に、この場合は OPTIONS 3
ステートメントをコーディングしないでください。 コーディングすると、ダイアログエディタは OPTIONS 3
ステートメントを DEFAULT
イベントのエンドマーカーとして誤って解釈するため、ダイアログをロードしようとするとスキャンエラーが発生します。
例:
DECIDE ON FIRST *CONTROL VALUE #OCX-1 /* MS Calendar control DECIDE ON FIRST *EVENT VALUE '-602' /* DispID for KeyDown event OPTIONS 2 KeyDown /* KeyDown event-handler code containing parameter /* access (e.g. #OCX-1.<<parameter-shift>>) NONE IGNORE END-DECIDE ... END-DECIDE