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

ステータスバーコントロールの操作

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


はじめに

注意:
ステータスバーコントロールと従来のダイアログステータスバー(ダイアログエディタ[ダイアログ属性]ウィンドウの[ステータスバー]チェックボックスを選択するか、またはランタイム時にダイアログの HAS-STATUS-BAR 属性を選択することによって作成される)を混同しないでください。 ステータスバーコントロールを使用している場合は、[ステータスバー]チェックボックスのチェックを解除し、HAS-STATUS-BAR 属性は設定しないでください。

Top of page

ステータスバーコントロールの作成

ステータスバーコントロールは、他の標準コントロール(リストボックスやプッシュボタンなど)と同じようにダイアログエディタで作成します。 つまり、ダイアログエディタ[挿入]メニューを使用して、あるいは[挿入]ツールバーからのドラッグ & ドロップによってスタティックに作成するか、または TYPE 属性を STATUSBARCTRL に設定した PROCESS GUI ACTION ADD ステートメントを使用してランタイム時にダイナミックに作成します。

ステータスバーコントロールは、他のほとんどのコントロールタイプとは異なり、別のコントロール内にネストすることも MDI 子ダイアログ内に作成することもできません。 MDI アプリケーションでは、ステータスバーコントロールは MDI フレームダイアログに属す必要があります。

ステータスバーコントロールには、関連付けられたウィンドウを含めることもまったく含めないこともできます。 ウィンドウは、ダイアログエディタでステータスバーコントロールの属性ウィンドウから定義するか、またはランタイム時に TYPE 属性を STATUSBARPANE に設定した PROCESS GUI ACTION ADD ステートメントを実行することによって定義できます。

Top of page

ウィンドウのないステータスバーコントロールの使用

ステータスバーコントロールの拡張機能へのアクセスを提供するほとんどの属性は、ステータスバーウィンドウに対してのみサポートされるため、ウィンドウのないステータスバーコントロールでは、提供される機能が限定的となります。 ステータスバーコントロールでテキスト行の表示以外を実行したいが、ステータスバーコントロールを複数部分に分割する必要がない場合は、ステータスバーコントロールの幅全体を占める 1 つのウィンドウを作成することをお勧めします。

伸縮性のあるウィンドウと伸縮性のないウィンドウ

ステータスバーコントロールにウィンドウを定義する場合、ステータスバーコントロールを含むダイアログがサイズ変更されたときに各ウィンドウの幅が伸び縮みするか変わらないようにするかを決める必要があります。 幅が伸び縮みするものは "伸縮性のある" ウィンドウ、幅が変わらないものは "伸縮性のない" ウィンドウと呼ばれます。

[ステータスバーコントロール属性]ウィンドウには、ウィンドウの伸縮性をマークするための明確なフラグはありません。 フラグの代わりに、幅(RECTANGLE-W 属性)に 0 が定義されたウィンドウは伸縮性があり、0 以外が定義されたウィンドウは指定された幅(ピクセル数)で固定だと暗黙的にみなされます。 RECTANGLE-W 属性は 0 にデフォルト設定されるため、ダイアログエディタで定義した初期状態では、すべてのウィンドウに伸縮性があります。

伸縮性のある各ウィンドウの表示幅は、ステータスバーコントロールのウィンドウ表示に使用できる合計幅からすべての伸縮性のないウィンドウの幅を引いたものを、伸縮性のあるウィンドウ数で割って決められます。

注意:
通常、ステータスバーコントロールのウィンドウ表示に使用できる合計幅は、最後のウィンドウを表示する手前で止まっていることを示すサイジンググリッパがある場合は、それを含みません。 ただし、ステータスバーコントロールが伸縮性のある 1 つのウィンドウだけを持つ場合は、ダイアログの幅全体(サイジンググリッパがある場合はそれも含む)が使用されます。

Top of page

ステータスバーコントロールへのテキスト出力

ステータスバーコントロールにテキストを出力するには、以下の 3 つの方法があります。

  1. ウィンドウを含むステータスバーコントロールの場合、テキストを出力するウィンドウの STRING 属性を設定します。

  2. ステータスバーコントロール自体の STRING 属性を設定します。これは、ウィンドウを含むステータスバーコントロールで最初の伸縮性のあるウィンドウ(存在する場合)の STRING 属性を設定することと同等です。

  3. ダイアログの STATUS-TEXT 属性を設定します。 これは、ダイアログの STATUS-HANDLE 属性によって識別されるステータスバーコントロール(存在する場合)の STRING 属性を設定することと同等です。

多くの場合、ステータスバーコントロールやウィンドウのハンドルを知る必要がないため、最後の方法がメッセージテキストを設定するための一番便利な方法です。

例:

DEFINE DATA LOCAL
01 #DLG$WINDOW  HANDLE OF WINDOW
01 #STAT-1      HANDLE OF STATUSBARCTRL
01 #PANE-1      HANDLE OF STATUSBARPANE
END-DEFINE
...
#DLG$WINDOW.STATUS-HANDLE := #STAT-1
...
#PANE-1.STRING := 'Method 1'
...
#STAT-1.STRING := 'Method 2'
...
#DLG$WINDOW.STATUS-TEXT := 'Method 3'

注意:
ダイアログエディタは、STATUS-HANDLE 属性に最初のステータスバーコントロール(存在する場合)を設定するコードを自動的に生成します。 したがって、ステータスバーコントロールをダイナミックに作成している場合、またはダイアログに複数のステータスバーコントロールを定義済みでそれらを切り替える場合は、STATUS-HANDLE 属性を明示的に設定する必要があります。

Top of page

MDI アプリケーションでのステータスバーの共有

MDI 子ダイアログにはステータスバーコントロールを作成できないため、MDI フレームダイアログに複数のステータスバーコントロールを定義しなくてもよいというのは好都合です。 代わりの方法として、ステータスバーを 1 つだけ定義して、それを子ダイアログ間で共有します。 この方法は、以下のようにして実現できます。

  1. MDI フレームダイアログで、アプリケーションで使用するすべてのウィンドウを単一のステータスバーコントロールに定義します。

  2. すべてのウィンドウを "共有" としてマークします。

  3. MDI 子ダイアログが直接アクセスできるように、すべてのウィンドウのハンドルを GDA 内の対応するシャドー変数にエクスポートします。

  4. COMMAND-STATUS イベントハンドラで、ダイアログに表示するすべてのウィンドウの VISIBLE 属性を TRUE に設定します。 他のすべてのウィンドウは自動的に非表示になります。

注意:
COMMAND-STATUS イベントでは、ダイアログと関連付けられるコマンド(SAME-AS 属性で他のオブジェクトを参照しないシグナル、メニュー項目、またはツールバー項目)の ENABLED 状態も設定する必要があります。設定しないと、これらは自動的に使用不可になります。 ダイアログと関連付けられるコマンドは、MDI フレームのすべての非共有コマンドであり、アクティブな MDI 子(アクティブな MDI 子ダイアログがない場合は MDI フレーム)のすべての共有コマンドです。

Top of page

ウィンドウ固有のコンテキストメニュー

コンテキストメニューの定義は、ステータスバーコントロールに対して行い、ウィンドウごとには行いません。 ただし、特定のウィンドウを右クリックしたときにのみステータスバーコントロールのコンテキストメニューが表示されるようにする場合、コンテキストメニューをステータスバーコントロールに関連付けると、そのウィンドウ以外でクリックされてもコンテキストメニューの表示を抑制できます。

例:

DEFINE DATA LOCAL
01 #CTXMENU-1   HANDLE OF CONTEXTMENU
01 #STAT-1      HANDLE OF STATUSBARCTRL
01 #PANE-1      HANDLE OF STATUSBARPANE
01 #PANE-2      HANDLE OF STATUSBARPANE
01 #PANE-3      HANDLE OF STATUSBARPANE
01 #PANE        HANDLE OF STATUSBARPANE
01 #X (I4)
01 #Y (I4)
END-DEFINE
...
#STAT-1.CONTEXT-MENU := #CTXMENU-1
...
DECIDE ON FIRST *CONTROL  
   ...  
   VALUE #CTXMENU-1
       DECIDE ON FIRST *EVENT
           ...      
             VALUE 'BEFORE-OPEN'
             /* Get click position relative to status bar control
             PROCESS GUI ACTION INQ-CLICKPOSITION WITH
               #STAT-1 #X #Y GIVING *ERROR        
             /* Get pane (if any) at specified position
             PROCESS GUI ACTION INQ-ITEM-BY-POSITION WITH
               #STAT-1 #X #Y #PANE
             /* Only show context menu if user clicked in second pane
             IF #PANE = #PANE-2          
                #CTXMENU-1.ENABLED := TRUE        
             ELSE          
                #CTXMENU-1.ENABLED := FALSE        
             END-IF      
        ...    
    END-DECIDE  
 ...
END-DECIDE
...
END

注意:
ステータスバーのウィンドウに応じて異なるコンテキストメニューを表示する場合は、コンテキストメニューの BEFORE-OPEN イベントでメニュー項目をダイナミックに作成する必要があります。

Top of page