バージョン 6.3.3
 —  プログラミングガイド  —

ダイアログエレメントをダイナミックに作成および削除する方法

このドキュメントでは、次のトピックについて説明します。


はじめに

通常、ダイアログエレメントはダイアログエディタを使用してダイアログに追加されます。 ただし、ダイアログエレメントは、ダイナミックに作成したり削除したりすることもできます。 例えば、ダイアログのレイアウトがコンテキストに強く依存している場合に、ダイアログエレメントをダイナミックに作成および削除します。

PROCESS GUI ステートメントの ADD アクションを使用すると、ダイアログエレメントがダイナミックに作成されます。 このアクションは、新規作成されたダイアログエレメントにハンドルを返します。 このハンドルは、ダイアログエレメントが作成されるとただちに、作成されたダイアログエレメントに指定された一連の属性を指し示します。

注意:
ActiveX コントロールの作成方法は、以下に説明する標準の方法とは少し異なります。 これについては、「ActiveX コントロールの操作」に記載されています。

使用可能なアクション、および渡すことのできるパラメータの詳細については、「標準化されたプロシージャの実行」を参照してください。

Top of page

グローバル属性リスト

"handlename.attributename" 形式のハンドル属性オペランド(例:#PB-1.STRING)を変更することによって、特定のダイアログエレメントの属性値を変更します。 ダイアログエレメントが未作成でハンドル変数が初期値(NULL-HANDLE)の場合、ハンドル属性オペランド handlename.attributename はグローバル属性リストを参照します。

グローバル属性リストとは任意のダイアログエレメントに定義されたすべての属性の集合です。 Natural にはこの集合が 1 つ含まれています。 ダイアログエレメントは、作成されるときに常にグローバル属性リストから属性を "継承" します。 ダイアログエレメントが WITH PARAMETERS オプション付きの PROCESS GUI ACTION ADD ステートメントで作成されるときは、属性は継承されません。

Top of page

ダイアログエレメントのスタティックおよびダイナミック作成

それぞれの属性設定を持つダイアログエレメントを(ダイアログエディタで)スタティックに定義するには、まずグローバル属性リスト内の属性に適切な値を設定し、それからダイアログエレメントを作成する必要があります。 作成後も、グローバル属性リスト内の属性値は変わりません。 次に作成されるダイアログエレメントは、変更された属性以外は、グローバル属性リストから前と同じ属性値を取得します。

"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

Top of page

ダイナミックに作成されたダイアログエレメントのイベントの処理方法

ダイナミックに作成されたダイアログエレメントにイベントを関連付ける場合は、ダイアログエディタは使用できません。 このようなダイアログエレメントのイベントはすべて、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

Top of page