InomHitta mer dokumentationSupportresurser som ingår | Ladda ner denna bok i PDF (1383 KB)
第 11 章 ダイアログStarSuite のドキュメントでは、ユーザー定義によるカスタムダイアログやフォームを表示することができます。 これらは StarSuite Basic マクロとのリンクが可能という点で、StarSuite Basic の利用範囲を大いに広げています。 ダイアログの用途としては、データベースの登録情報の表示をはじめ、オートパイロットによる新規ドキュメント作成時の手順表示などにも利用できます。 ダイアログの操作StarSuite Basic のダイアログは、1 個のダイアログウィンドウ上にテキストフィールド、リストボックス、ラジオボタンなどの各種コントロールが配置されます。 ダイアログの作成法ダイアログの作成は StarSuite ダイアログエディタを使って行いますが、その操作方法は StarSuite Draw の場合と同様です。 ![]() コントロール要素の基本的な配置法は、使用するコントロール要素をデザインパレット (画面右) で選択して、ダイアログウィンドウ上の表示領域で必要なサイズにドラッグするだけです。 ここでのサンプルダイアログでは、ラベルとリストボックスを配置しています。 ![]() ダイアログを表示するには、以下のサンプルコードのような手順で処理します。 Dim Dlg As Object
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.DlgDef)
Dlg.Execute()
Dlg.dispose()
上記のサンプルコードでは、CreateUnoDialog により Dlg という名前のオブジェクトを作成していますが、該当するダイアログに対してはこのオブジェクトを介して参照することになります。 また実際にダイアログを作成するには、必要なライブラリ (上記のサンプルコードでは Standard ライブラリ) を事前に読み込む必要があります。 読み込んでいない場合は、LoadLibrary メソッドで読み込みます。 ダイアログオブジェクト (上記のサンプルコードでは Dlg) に対して必要な初期化を行った後、Execute メソッドを実行することで、該当するダイアログが表示されます。 ここでサンプルとしたタイプのダイアログは、表示中に他のプログラムによる処理が何もできなくなるため、モーダルダイアログと呼ばれます。 ダイアログが表示されている間のプログラムは、Execute メソッドを実行し続けている状態になります。 プログラム最終行の dispose メソッドは、ダイアログの使用するリソースをプログラム終了時に解放させるためのものです。 ダイアログのクローズ処理OK またはキャンセルのボタンによるクローズダイアログに OK または キャンセル のボタンが表示されている場合、いずれかのボタンがクリックされた段階で、ダイアログは自動的に閉じられます。 これらのボタンの詳細情報については、本章の「ダイアログコントロールの詳細」の節で説明しています。 OK のボタンをクリックしてダイアログを閉じた場合は Execute メソッドの戻り値として 1 が返され、それ以外の場合は 0 が返されます。 Dim Dlg As Object
DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.MyDialog)
Select Case Dlg.Execute()
Case 1
MsgBox "Ok pressed"
Case 0
MsgBox "Cancel pressed"
End Select
タイトルバーの閉じるボタンによるクローズ処理必要であれば、タイトルバーの閉じるボタンをクリックすることでも、ダイアログウィンドウをクローズできます。 そのような操作を行った場合、ダイアログの Execute メソッドによる戻り値には 0 が返されますが、これはキャンセルのボタンを押した場合と同様です。 プログラムによる明示的なクローズ処理プログラム内に以下のような endExecute メソッドを記述することでも、ダイアログウィンドウをクローズできます。 Dlg.endExecute() コントロール要素へのアクセス各ダイアログには、必要な数のコントロール要素を配置することができます。 コントロール要素へアクセスするには、getControl メソッドを実行して、戻り値として返される該当コントロール要素の名前を利用します。 Dim Ctl As Object
Ctl = Dlg.getControl("MyButton")
Ctl.Label = "New Label"
上記のサンプルコードでは、MyButton というコントロール要素に対する参照用オブジェクトを用意して、この Ctl というオブジェクト変数を介することで、コントロール要素の初期化を行っています。 そしてここでは最後に、コントロール要素の Label 属性に New Label という値を設定しています。 注 – StarSuite Basic では、コントロール要素の名前に使われる大文字と小文字が区別されるので注意が必要です。 コントロール要素およびダイアログでのモデルの使用法StarSuite API を利用する際には、実際に表示されるプログラム要素 (View: ビュー) と、その背後に存在するデータやドキュメント (Model: モデル) とを使い分けなければならない場合があります。 ダイアログとコントロール要素のオブジェクトの下層には、コントロール要素のメソッドや属性以外に、Model というオブジェクトが存在します。 このオブジェクトを利用することで、ダイアログやコントロール要素の内容に直接アクセスすることができます。 StarSuite に用意された API の中でも、ダイアログに関しては、データとその表示内容の境界が非常にあいまいです。 API の要素には、View と Model のどちらからでもアクセスできます。 Model 属性は、ダイアログおよびコントロール要素オブジェクトのモデルに対して、プログラム制御によるアクセスする際に利用します。 Dim cmdNext As Object
cmdNext = Dlg.getControl("cmdNext")
cmdNext.Model.Enabled = False
上記のサンプルコードでは、Dlg というダイアログにある cmdNtext というボタンを、モデルオブジェクトを用いて非アクティブにしています。 属性名前とタイトル各コントロール要素には名前が付けられており、これらの名前に対しては、以下のモデル属性を用いて参照することができます。
ダイアログのタイトルバーに表示されるタイトルに対しては、以下のモデル属性を用いて参照することができます。
位置とサイズコントロール要素の表示位置とサイズに対しては、以下のモデル属性を用いて参照することができます。
StarSuite では、プラットフォームへの非依存性を確保する観点から、ダイアログ内での位置とサイズを示す際に、Map AppFont (ma) という内部単位を使用しています。 ma 単位では、オペレーティングシステムに設定されたシステムフォントの平均サイズを基準に、その高さの 8 分の 1 および幅の 4 分の 1 を、各方向の 1 単位と定めています。 StarSuite はこのような ma 単位を利用することで、システム設定の異なる環境下においても、ダイアログの表示が同じになるようにしています。 実行時に表示されるコントロール要素の位置とサイズを変更する場合は、ダイアログのサイズを確認してから、コントロール要素の表示指定を調整します。 注 – Map AppFont (ma) 単位は、プラットフォームへの非依存性を確保する観点から、従来の Twip (トゥウィップ) 単位に替わって導入されたものです。 フォーカスおよびタブ順ダイアログ上に配置されたコントロール要素に対しては、Tab キーによるフォーカス移動が行えます。 こうした操作に関係するコントロール要素モデルでは、以下の属性が利用できます。
最後に紹介する getFocus メソッドは、ダイアログ上のコントロール要素にフォーカス移動を行うよう設定するものです。
マルチページダイアログStarSuite のダイアログには、複数のページを配置できます。 ダイアログにある Step 属性はダイアログの現在のタブページを指定するものですが、コントロール要素にも同様の Step 属性が存在し、こちらは該当コントロールを表示するタブページを指定します。 Step に指定する値のうち、0 は特別な意味を持ちます。 ダイアログ側で Step 属性値に 0 を指定すると、コントロール要素側の指定値とは無関係に、すべてのコントロール要素が表示されるようになります。 これとは逆に、Step 属性値を 0 に設定したコントロール要素は、ダイアログのすべてのタブページ上に表示されるようになります。 ![]() たとえば上記のダイアログの場合、分割線および「キャンセル」、「戻る」、「次へ」、「完了」の各ボタンは、すべてのタブページ上に表示させる性質のコントロールなので、これらの Step 値は 0 に設定しておきます。 ただし必要であれば、各コントロール要素を特定のタブページだけに表示させることもできます (たとえばページ 1)。 以下のサンプルコードでは、イベントハンドラに応じて、「次へ」と「戻る」ボタンの Step 値を増減させて、ボタンの表示用ステータスを変更しています。 Sub cmdNext_Initiated
Dim cmdNext As Object
Dim cmdPrev As Object
cmdPrev = Dlg.getControl("cmdPrev")
cmdNext = Dlg.getControl("cmdNext")
cmdPrev.Model.Enabled = Not cmdPrev.Model.Enabled
cmdNext.Model.Enabled = False
Dlg.Model.Step = Dlg.Model.Step + 1
End Sub
Sub cmdPrev_Initiated
Dim cmdNext As Object
Dim cmdPrev As Object
cmdPrev = Dlg.getControl("cmdPrev")
cmdNext = Dlg.getControl("cmdNext")
cmdPrev.Model.Enabled = False
cmdNext.Model.Enabled = True
Dlg.Model.Step = Dlg.Model.Step - 1
End Sub
このサンプルコードを使用する場合は、ダイアログの参照に用いる Dlg という変数を、広域変数として用意しておく必要があります。 そしてこのサンプルコードの実行により、ダイアログ上のボタンは、以下の図のように表示ステータスが切り換えられます。 ページ 1: ![]() ページ 2:
イベントStarSuite のダイアログとフォームは、イベント指向型のプログラミングモデルを基に構築されているため、各コントロール要素に対しては イベントハンドラを指定できます。 イベントハンドラとは、特定のアクションの実行に応じて、事前に定めておいた手続きを起動するための機構で、このようなトリガーとなるアクションは、他のイベント中で発生した場合も有効です。 イベントハンドラを利用することで、ドキュメントの編集やデータベースのオープンをはじめ、他のコントロール要素へのアクセスといった、各種の処理を制御できます。 StarSuite のコントロール要素は、様々な状況で発生する各種のイベントに対応しています。 これらのイベントは、4 つのグループに分かれます。
イベントを利用した処理を行う場合は、StarSuite の開発環境でダイアログを構築して、必要なコントロール要素やドキュメント (フォームを使用する場合) を用意しておく必要があります。 ![]() 上記の図は StarSuite Basic の開発環境を示したもので、このダイアログウィンドウには 2 つのリストボックスが配置されています。 この場合、2 つのリストボックスの間に配置されたボタンを使って、リスト内の各項目を相互に移動できるものとします。 このようなレイアウトを画面に表示させる場合は、イベントハンドラからの呼び出し用の手続きを StarSuite Basic のコード内に作成するようにしてください。 このような手続きは、任意のモジュール内に記述できますが、使用するモジュールは 2 つまでにすることが推奨されます。 またプログラムコードの可読性を高める観点からも、これらの手続き名には、その機能を簡潔に示す名前をつけておくべきです。 マクロから汎用プログラムの手続きに直接ジャンプさせると、プログラムコードが不明瞭になる危険性があります バグ修正も含めたプログラムコード全体の管理性を高めておくには、たとえそれがターゲットとなる手続きを呼び出すだけの処理であっても、イベントハンドル用のエントリポイントとして利用する手続きを 1 つ別途作成しておくべきです。 以下のサンプルコードは、ダイアログ上に配置された左側のリストボックス内の項目の 1 つを、右側のリストボックスへ移動します。 Sub cmdSelect_Initiated
Dim objList As Object
lstEntries = Dlg.getControl("lstEntries")
lstSelection = Dlg.getControl("lstSelection")
If lstEntries.SelectedItem > 0 Then
lstSelection.AddItem(lstEntries.SelectedItem, 0)
lstEntries.removeItems(lstEntries.SelectItemPos, 1)
Else
Beep
End If
End Sub
この手続きを StarSuite Basic で記述したら、ダイアログエディタの属性ウィンドウを表示して、該当するイベントへの割り当てを行います。 ![]() このダイアログには、StarSuite Basic に記述したすべての手続きが表示されます。 該当するイベントに手続きを割り当てるには、手続きを選択して、割り当て ボタンをクリックします。 パラメータ特定のイベントの発生だけでは、どのような処理を行うかの判定ができない場合もあります。 そのようなケースでは、何らかの追加情報が必要となります。 たとえばマウスクリックに関する処理では、どの位置でマウスボタンが押されたかの情報が利用できます。 StarSuite Basic では以下のような方法で、イベントから手続きに対してオブジェクトパラメータを渡すことができます。 Sub ProcessEvent(Event As Object) End Sub Event オブジェクトの構成および付随する属性は、手続き呼び出しのトリガーとなるイベントの種類に依存します。 以降の節では、イベントタイプの詳細について説明します。 いずれのイベントタイプにせよ、すべてのオブジェクトは、割り当てられたコントロール要素およびモデルへのアクセスします。 コントロール要素へのアクセスは、以下の形式で行います。 Event.Source 同様に、モデルへのアクセスは以下の形式で行います。 Event.Source.Model これらの属性は、イベントハンドラ内で特定のイベントをトリガーする際に使用します。 マウスイベントStarSuite Basic では以下のマウスイベントを利用できます。
これらのイベントを扱うためのイベントオブジェクトは com.sun.star.awt.MouseEvent 構造体として定義されており、以下の情報を取り扱うことができます。
com.sun.star.awt.MouseButton に定義されているマウスボタン関連の定数は、以下のものです。
以下のサンプルコードでは、マウスボタンのクリック位置と押されたボタンを表示します。 Sub MouseUp(Event As Object)
Dim Msg As String
Msg = "Keys: "
If Event.Buttons AND com.sun.star.awt.MouseButton.LEFT Then
Msg = Msg & "LEFT "
End If
If Event.Buttons AND com.sun.star.awt.MouseButton.RIGHT Then
Msg = Msg & "RIGHT "
End If
If Event.Buttons AND com.sun.star.awt.MouseButton.MIDDLE Then
Msg = Msg & "MIDDLE "
End If
Msg = Msg & Chr(13) & "Position: "
Msg = Msg & Event.X & "/" & Event.Y
MsgBox Msg
End Sub
注 – VBA に用意されている Click および Doubleclick イベントは StarSuite Basic では利用できません。 StarSuite Basic では Click イベントの代わりに MouseUp イベントを使用し、Doubleclick イベントについてはアプリケーションロジックの変更で対処します。 キーボードイベントStarSuite Basic では以下のキーボードイベントを利用できます。
どちらのイベントも、論理的 なキーアクションに対するもので、物理的 なキーアクションに直接対応するものではありません。 つまり、1 つの文字の入力に複数キーのコンビネーションが必要な場合 (たとえば欧文のアクセント記号など)、これに対して StarSuite Basic が発生するイベントは 1 つだけです。 また Shift キー や Alt キーなどの修飾キーを単独で押し下げても、それだけでは独立したイベントは発生しません。 StarSuite Basic は、押し下げられたキーに関する情報を、イベントオブジェクトによりイベントハンドル用手続きに渡します。 この場合は、以下の属性を利用できます。
以下のサンプルコードでは、KeyCode 属性を利用して、Enter キーや Tab キーなどの制御用キーのうち何が押されたかを判定します。 これらの制御用キーが押されていた場合は、該当するキーの名前を表示し、それ以外の場合は、入力された文字を表示します。 Sub KeyPressed(Event As Object)
Dim Msg As String
Select Case Event.KeyCode
Case com.sun.star.awt.Key.RETURN
Msg = "Return pressed"
Case com.sun.star.awt.Key.TAB
Msg = "Tab pressed"
Case com.sun.star.awt.Key.DELETE
Msg = "Delete pressed"
Case com.sun.star.awt.Key.ESCAPE
Msg = "Escape pressed"
Case com.sun.star.awt.Key.DOWN
Msg = "Down pressed"
Case com.sun.star.awt.Key.UP
Msg = "Up pressed"
Case com.sun.star.awt.Key.LEFT
Msg = "Left pressed"
Case com.sun.star.awt.Key.RIGHT
Msg = "Right pressed"
Case Else
Msg = "Character " & Event.KeyChar & " entered"
End Select
MsgBox Msg
End Sub
キーボード処理に使用するその他の定数については、『API Reference』の com.sun.star.awt.Key グループの定数値を参照してください。 フォーカスイベントフォーカスイベントは、コントロール要素へのフォーカス移動を判定するためのものです。 たとえばユーザーが特定のコントロール要素での処理を終えたかを判定してから、ダイアログ上にある他のコントロール要素を更新するような場合、このイベントが利用できます。 以下に、利用できるフォーカスイベントを示します。
フォーカスイベント関係の Event オブジェクトは、以下のように構成されています。
コントロール要素の固有イベントこれまで説明したイベントは、すべてのコントロール要素でサポートされていますが、その他にも特定のコントロール要素についてのみ定義された固有なイベントが存在します。 これらのうち特に重要なものは以下のイベントです。
イベントを処理する場合、作動時のイベントなどは、単にコントロール要素をクリックするだけで発生することがあるため、その扱いには注意が必要です (たとえばラジオボタンのクリック)。 このような場合、コントロール要素のステータスが実際に変更されたかについてはチェックされません。 このような「ブラインドイベント」による混乱を避けるには、変更前のコントロール要素の値を広域変数に保存しておき、イベント実行時にそうした値に変化があったかを確認するという手法が使えます。 ステータスを変更した時のイベントに関係する属性には以下のものがあります。
ダイアログコントロールの詳細StarSuite Basic には各種のコントロール要素が用意されていますが、これらは以下の 4 つのグループに分類できます。 入力フィールド:
ボタン:
選択用リスト:
その他のコントロール要素:
次に、これらのコントロール要素のうち、特に重要なものについて説明します。 ボタンボタンは、ユーザーによるクリックに応じて、特定のアクションを実行させる際に使用します。 最も単純な使用法は、ユーザーのクリックで発生する「作動時」イベントをトリガーとして、ボタンのアクションを実行させるという使い方です。 またボタンに他のアクションを割り当てて PushButtonType 属性を利用し、別のダイアログを開くという処理も可能です。 この属性値を 0 としたボタンをクリックしても、ダイアログはそのまま残されます。 この属性値を 1 としたボタンをクリックした場合、ダイアログは閉じられ、ダイアログを表示していた Execute メソッドは戻り値として 1 を返します (ダイアログの処理は正常終了)。 この属性値を 2 としたボタンをクリックした場合、ダイアログは閉じられ、ダイアログを表示していた Execute メソッドは戻り値として 0 を返します。 以下に、ボタンモデルで利用可能なすべての属性を示します。
ラジオボタン通常これらは複数のボタンをグループ化して、そのうち 1 つのオプションを選択することにより使用します。 その際にオプションの 1 つが選択されると、残りのオプションは非選択状態になります。 このように処理することで、選択状態にあるオプションは常に 1 つだけになります。 ラジオボタンのコントロール要素には、以下の 2 つの属性があります。
ラジオボタンのモデルからは、以下の属性も使用できます。
複数のラジオボタンをグループ化する場合は、これらをアクティブ化する順序の設定値 (Model.TabIndex 属性の指定値で、ダイアログエディタ上では順序の指定に該当) に連続した値を指定しておく必要があります。 アクティブ化する順序の途中に他のコントロール要素が入っていると、StarSuite は新規のコントロール要素グループが始まるものと判断するため、本来のグループ内部での切り替えが想定通りに行えなくなります。 注 – VBA とは異なり StarSuite Basic では、グループ枠の中にラジオボタンを挿入するということはできません。 StarSuite Basic に用意されているグループ枠というコントロール要素は、グループ化するコントロール要素を目で見て区別できるように、これらを囲む枠線を引くだけのものです。 チェックボックスチェックボックスは基本的に Yes または No の形式の情報を入力するために使用しますが、モード設定によっては、このような 2 つのステータス間だけでなく、3 つのステータス間で選択することもできます。 通常使用するのは Yes か No かの選択肢ですが、どちらともつかない中間状態が選択肢としてあり得る場合は、それを示すステータスも表示できます。 チェックボックスには、以下の属性を指定できます。
チェックボックスのモデルオブジェクトでは、以下の属性を使用できます。
テキストボックステキストボックスは、ユーザーによる数値およびテキストの入力に使用できます。 テキストボックスの機能は、主として com.sun.star.awt.UnoControlEdit サービスにより提供されています。 テキストボックスの表示は 1 行に制限することもできれば、複数行表示を許可することも可能で、またユーザーからの入力内容を編集することも、読み取り専用とすることもできます。 またテキストボックスは、通常の通貨フィールドや番号フィールドまたはパターンフィールドでは処理しきれない場合の代用フィールドとしても利用できます。 そもそも、これらのコントロール要素はどれも Uno サービスの UnoControlEdit をベースとしているので、基本的に共通した手法でプログラム制御をすることができます。 テキストボックスには、以下の属性が用意されています。
モデルオブジェクトからは、以下の属性を利用できます。
リストボックスリストボックス (com.sun.star.awt.UnoControlListBox サービス) は、以下の属性をサポートしています。
リストボックスには、以下のメソッドが用意されています。
リストボックスのモデルオブジェクトには、以下の属性が用意されています。
注 – VBA に用意されているリスト項目への数値付加オプション (ItemData) は、StarSuite Basic では利用できません。 リストボックスの項目に数値 (データベース ID など) を割り当てるのであれば、追加のデータフィールドを用意して、両者のデータを格納するようにします。 |