このドキュメントでは、次のトピックについて説明します。
注意:
ステータスバーコントロールと従来のダイアログステータスバー(ダイアログエディタの[ダイアログ属性]ウィンドウの[ステータスバー]チェックボックスを選択するか、またはランタイム時にダイアログの HAS-STATUS-BAR
属性を選択することによって作成される)を混同しないでください。 ステータスバーコントロールを使用している場合は、[ステータスバー]チェックボックスのチェックを解除し、HAS-STATUS-BAR
属性は設定しないでください。
ステータスバーコントロールは、他の標準コントロール(リストボックスやプッシュボタンなど)と同じようにダイアログエディタで作成します。 つまり、ダイアログエディタの メニューを使用して、あるいは[挿入]ツールバーからのドラッグ & ドロップによってスタティックに作成するか、または TYPE
属性を STATUSBARCTRL
に設定した PROCESS GUI ACTION
ADD
ステートメントを使用してランタイム時にダイナミックに作成します。
ステータスバーコントロールは、他のほとんどのコントロールタイプとは異なり、別のコントロール内にネストすることも MDI 子ダイアログ内に作成することもできません。 MDI アプリケーションでは、ステータスバーコントロールは MDI フレームダイアログに属す必要があります。
ステータスバーコントロールには、関連付けられたウィンドウを含めることもまったく含めないこともできます。 ウィンドウは、ダイアログエディタでステータスバーコントロールの属性ウィンドウから定義するか、またはランタイム時に TYPE
属性を STATUSBARPANE
に設定した PROCESS GUI ACTION
ADD
ステートメントを実行することによって定義できます。
ステータスバーコントロールの拡張機能へのアクセスを提供するほとんどの属性は、ステータスバーウィンドウに対してのみサポートされるため、ウィンドウのないステータスバーコントロールでは、提供される機能が限定的となります。 ステータスバーコントロールでテキスト行の表示以外を実行したいが、ステータスバーコントロールを複数部分に分割する必要がない場合は、ステータスバーコントロールの幅全体を占める 1 つのウィンドウを作成することをお勧めします。
ステータスバーコントロールにウィンドウを定義する場合、ステータスバーコントロールを含むダイアログがサイズ変更されたときに各ウィンドウの幅が伸び縮みするか変わらないようにするかを決める必要があります。 幅が伸び縮みするものは "伸縮性のある" ウィンドウ、幅が変わらないものは "伸縮性のない" ウィンドウと呼ばれます。
[ステータスバーコントロール属性]ウィンドウには、ウィンドウの伸縮性をマークするための明確なフラグはありません。 フラグの代わりに、幅(RECTANGLE-W
属性)に 0 が定義されたウィンドウは伸縮性があり、0 以外が定義されたウィンドウは指定された幅(ピクセル数)で固定だと暗黙的にみなされます。 RECTANGLE-W
属性は 0 にデフォルト設定されるため、ダイアログエディタで定義した初期状態では、すべてのウィンドウに伸縮性があります。
伸縮性のある各ウィンドウの表示幅は、ステータスバーコントロールのウィンドウ表示に使用できる合計幅からすべての伸縮性のないウィンドウの幅を引いたものを、伸縮性のあるウィンドウ数で割って決められます。
注意:
通常、ステータスバーコントロールのウィンドウ表示に使用できる合計幅は、最後のウィンドウを表示する手前で止まっていることを示すサイジンググリッパがある場合は、それを含みません。 ただし、ステータスバーコントロールが伸縮性のある 1 つのウィンドウだけを持つ場合は、ダイアログの幅全体(サイジンググリッパがある場合はそれも含む)が使用されます。
ステータスバーコントロールにテキストを出力するには、以下の 3 つの方法があります。
ウィンドウを含むステータスバーコントロールの場合、テキストを出力するウィンドウの STRING
属性を設定します。
ステータスバーコントロール自体の STRING
属性を設定します。これは、ウィンドウを含むステータスバーコントロールで最初の伸縮性のあるウィンドウ(存在する場合)の STRING
属性を設定することと同等です。
ダイアログの 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
属性を明示的に設定する必要があります。
MDI 子ダイアログにはステータスバーコントロールを作成できないため、MDI フレームダイアログに複数のステータスバーコントロールを定義しなくてもよいというのは好都合です。 代わりの方法として、ステータスバーを 1 つだけ定義して、それを子ダイアログ間で共有します。 この方法は、以下のようにして実現できます。
MDI フレームダイアログで、アプリケーションで使用するすべてのウィンドウを単一のステータスバーコントロールに定義します。
すべてのウィンドウを "共有" としてマークします。
MDI 子ダイアログが直接アクセスできるように、すべてのウィンドウのハンドルを GDA 内の対応するシャドー変数にエクスポートします。
COMMAND-STATUS
イベントハンドラで、ダイアログに表示するすべてのウィンドウの VISIBLE
属性を TRUE
に設定します。 他のすべてのウィンドウは自動的に非表示になります。
注意:
COMMAND-STATUS
イベントでは、ダイアログと関連付けられるコマンド(SAME-AS
属性で他のオブジェクトを参照しないシグナル、メニュー項目、またはツールバー項目)の ENABLED
状態も設定する必要があります。設定しないと、これらは自動的に使用不可になります。 ダイアログと関連付けられるコマンドは、MDI フレームのすべての非共有コマンドであり、アクティブな MDI 子(アクティブな MDI 子ダイアログがない場合は
MDI フレーム)のすべての共有コマンドです。
コンテキストメニューの定義は、ステータスバーコントロールに対して行い、ウィンドウごとには行いません。 ただし、特定のウィンドウを右クリックしたときにのみステータスバーコントロールのコンテキストメニューが表示されるようにする場合、コンテキストメニューをステータスバーコントロールに関連付けると、そのウィンドウ以外でクリックされてもコンテキストメニューの表示を抑制できます。
例:
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
イベントでメニュー項目をダイナミックに作成する必要があります。