2011年7月30日土曜日

ファイルコントロールを操作する

今回も、操作する、というほどのものではないが、ファイルコントロールの
操作方法ついて。エクセルには、確か、なかったような。。。
  
下図のフォーム「Dialog1」を用意する。ツールバーに「File Control」なるもの
が既に用意されているので、それを貼り付けるだけでOK :
  
マクロは下記の通り :
  
Private mobjDialog1 As Object

Sub Main
  DialogLibraries.LoadLibrary("Standard")
       mobjDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
       mobjDialog1.execute()
End Sub

Sub CommandButton1Click()
       Dim obj
FileControl1 As Object
       
objFileControl1 = mobjDialog1.Model.FileControl1
       Msgbox(
objFileControl1.Text)
End Sub
  
「選択したファイル名を表示する」ボタンに、上記の「CommandButton1Click」
プロシージャを関連付けする。
  
ファイルコントロールの「検索...」ボタンをクリックすると、下のような、ファイル
選択ダイアログが表示される :
  
ここから、例えば、「Calc Basic関数一覧.jpg」を選択し「開く」ボタンをクリック
すると、
  
そして、「選択したファイル名を表示する」ボタンをクリックすれば、下の
メッセージボックスが表示される :
  
貧しい英語力を駆使して参考文献 11) を読むと、どうやらこのファイル
コントロールは、選択するファイルを制限するフィルターを設定できない
らしい。代わりに FilePicker なるものがあるらしいが、色々試してはみた
ものの、エラーになるので断念した。

2011年7月27日水曜日

イメージコントロールを操作する

操作する、というほどでもないが、イメージコントロールに画像を表示する
方法について。
  
先ず、下図のようなフォームを用意 :
  
サンプルコードは下記の通り :
  
Private mobjDialog1 As Object
  
Sub Main
  DialogLibraries.LoadLibrary("Standard")
       mobjDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
       mobjDialog1.execute()
End Sub
  
Sub CommandButton1Click()
       Dim objImageControl1 As Object
       objImageControl1 = mobjDialog1.Model.ImageControl1
       objImageControl1.imageURL = ConvertToUrl("D:\Temp\suika.jpg")
       objImageControl1.ScaleImage = True
End Sub
  
Sub CommandButton2Click()
       Dim objImageControl1 As Object
       objImageControl1 = mobjDialog1.Model.ImageControl1
       objImageControl1.imageURL = ConvertToUrl("D:\Temp\suika.jpg")
       objImageControl1.ScaleImage = False
End Sub
  
「画像を表示 (1)」ボタンには CommandButton1Click プロシージャを、
「画像を表示 (2)」ボタンには CommandButton2Click プロシージャを
それそせれ対応させる。
CommandButton1Click プロシージャと CommandButton2Click プロ
シージャの違いは、最後のステートメントが
  
   objImageControl1.ScaleImage = True
  

  
   objImageControl1.ScaleImage = False
  
の差だけである。
実際、「画像を表示 (1)」ボタンをクリックした結果は下図のようになる :
  
一方、「画像を表示 (2)」ボタンをクリックした結果は下図の通り :
  
二つの結果から推察すると、ScaleImage プロパティを True にした場合は
イメージコントロールの大きさに画像を合わせて調整し、False の場合は
調整せずに、そのままの大きさで表示しているように思える。
  
リストボックスやコンボボックスの場合と、イメージボックスでは、若干コード
の記述に違いがある。例えば、リストボックスの場合、オブジェクトを取得
するのに
  
   ListBox 変数 = Form 変数.getControl(ListBox 名)
  
と記述するのに対して、イメージコントロールの場合は
  
   ImageControl 変数Form 変数.Model.イメージコントロール名
  
と記述するらしい。実際、リストボックス同様に記述すると、エラーになった。
また、イメージコントロールに表示する画像は
  
   ImageControl 変数.imageURL = 画像のURL形式のパス
  
と記述する。

2011年7月20日水曜日

リストボックスを操作する (2)

今回は「リストボックスを操作する (1)」の続編。

前回のフォームを下図の通りに改造した :
  
サンプルコードも、前回のモジュールに対してプロシージャを追加した :
  
Private mobjDialog1 As Object
  
Sub Main
       DialogLibraries.LoadLibrary("Standard")
       mobjDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
       mobjDialog1.execute()
End Sub
  
Sub CommandButton1Click()
       Dim objListBox1 As Object
       Dim lngIndex As Long
       objListBox1 = mobjDialog1.getControl("ListBox1")
       For lngIndex = 0 To 10
              objListBox1.addItem("Item" & Format(lngIndex, "00"), lngIndex)
       Next lngIndex
End Sub
  
Sub CommandButton1xClick()
       Dim objListBox1 As Object
       Dim strValues(10) As String
       Dim lngIndex As Long
       objListBox1 = mobjDialog1.getControl("ListBox1")
       For lngIndex = 0 To 10
              strValues(lngIndex) = "Item" & Format(lngIndex, "00")
       Next lngIndex
       objListBox1.addItems(strValues, 0)
 
End Sub
  
Sub CommandButton2Click()
       Dim objListBox1 As Object
       objListBox1 = mobjDialog1.getControl("ListBox1")
       Msgbox(objListBox1.SelectedItem)
End Sub
  
Sub CommandButton2xClick()
       Dim objListBox1 As Object
       Dim strValues() As String
       Dim strMessage As String
       Dim lngUBound As Long
       Dim lngIndex As Long
       objListBox1 = mobjDialog1.getControl("ListBox1")
       strValues = objListBox1.SelectedItems
       lngUBound = UBound(strValues)
       For lngIndex = 0 To lngUBound
              strMessage = strMessage & strValues(lngIndex) & Chr$(13)
       Next lngIndex
       Msgbox(strMessage)
End Sub
  
Sub CommandButton3Click()
  Dim objListBox1 As Object
  objListBox1 = mobjDialog1.getControl("ListBox1")
  objListBox1.removeItems(0, 11)
End Sub
  
追加したコマンドボタンとそれぞれに対応するプロシージャは下記の通り :
  
   CommandButton1x  ⇔ CommandButton1xClick
   CommandButton2x   ⇔ CommandButton2xClick
   CommandButton3   ⇔ CommandButton3Click 
  
の三つ。他のプロシージャは、前回と全く変えていない。
  
「CommandButton1x」をクリックすると、「CommandButton1」をクリック
した場合と、結果は全く同じになる。但し、「CommandButton1x」ボタン
場合は、addItems メソッドを使用して、文字列の配列を一気に追加する
ことができる、ようだ。書式は下記の通り :
  
   ListBox 変数 = Form 変数.getControl(ListBox 名)
   ListBox 変数.addItems(ValueArrayIndex
)
  
ValueArray は追加したい値 (文字列) の配列、Index は追加したい行
のインデックス番号を指定する。
  
次に、「ListBox1」中の値から複数の行を選択し、それらの値を取得する
方法について述べる。これを可能にする為に、「ListBox1」の「プロパティー」
ウィンドウから「複数選択」プロパティを「はい」に変更する必要がある。
この設定を行うと、下図のように複数行が選択可能となる :
  
この状態で「CommandButton2x」ボタンをクリックすると下図のメッセージ
ボックスが表示される :
  
複数選択した行の値を取得するには、SelectedItems プロパティを用いる。
書式は下記の通り :
  
   ListBox 変数 = Form 変数.getControl(ListBox 名)
   文字列配列 = ListBox 変数.SelectedItems
  
最後に、「ListBox1」内の全ての値を削除する方法について。
リストボックスの値を削除するには、removeItems メソッドを使用する。
書式は下記の通り :
  
   ListBox 変数 = Form 変数.getControl(ListBox 名)
   ListBox 変数.removeItems(IndexCount
)
  
Index には、削除したいデータの開始行のインデックス番号を指定する。
Count には、削除したい件数を指定する。この例では。全データを削除
しているが、例えば、サンプルコードの該当部分を
  
   objListBox1.removeItems(1, 9)
  
とすると、最初の行の「Item00」と最後の「Item10」は消えずに残る。

2011年7月19日火曜日

コンボボックスを操作する (2)

「コンボボックスを操作する (1)」の項の追記。

前回のフォームにボタンを下図の通り追加した :
  
コードも前回のものにプロシージャを追加した。改造後のコードは下記
の通り :
  
Private mobjDialog1 As Object
  
Sub Main
       DialogLibraries.LoadLibrary("Standard")
       mobjDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
       mobjDialog1.execute()
End Sub
  
Sub CommandButton1Click()
       Dim objComboBox1 As Object
       Dim lngIndex As Long
       objComboBox1 = mobjDialog1.getControl("ComboBox1")
       For lngIndex = 0 To 20
              objComboBox1.addItem("Item" & Format(lngIndex, "00"), lngIndex)

       Next lngIndex
End Sub
  
Sub CommandButton1xClick()
       Dim objComboBox1 As Object
  Dim strValues(20) As String
  Dim lngIndex As Long
  objComboBox1 = mobjDialog1.getControl("ComboBox1")
  For lngIndex = 0 To 20
  strValues(lngIndex) = "Item" & Format(lngIndex, "00")
  Next lngIndex
  objComboBox1.addItems(strValues, 0)
End Sub
  
Sub CommandButton2Click()
       Dim objComboBox1 As Object
       objComboBox1 = mobjDialog1.getControl("ComboBox1")
       objComboBox1.setDropDownLineCount(8)
End Sub
  
Sub CommandButton3Click()
      Dim objComboBox1 As Object
      objComboBox1 = mobjDialog1.getControl("ComboBox1")
      Msgbox(objComboBox1.Text)
End Sub
  
Sub CommandButton4Click()
  Dim objComboBox1 As Object
  objComboBox1 = mobjDialog1.getControl("ComboBox1")
  Msgbox(objComboBox1.getItem(4))
End Sub
  
Sub CommandButton5Click()
  Dim objComboBox1 As Object
  objComboBox1 = mobjDialog1.getControl("ComboBox1")
  objComboBox1.removeItems(0, 21)
End Sub
  
追加したコマンドボタンと対応する、それらにプロシージャは下記の通り :
  
   CommandButton1x  ⇔ CommandButton1xClick
   CommandButton4   ⇔ CommandButton4Click
   CommandButton5   ⇔ CommandButton5Click 
  
の三つ。他のボタンとプロシージャについては、前回と全く変えていない。
  
「CommandButton1x」をクリックすると、「CommandButton1」をクリック
した場合と、結果は全く同じになる。但し、「CommandButton1x」ボタンの
場合は、addItems メソッドを使用している。addItem メソッドが値を一つ
ずつ追加していくのに対して、addItems メソッドは文字列の配列を一気
に追加できる、ようだ。書式は下記の通り :
  
   ComboBox 変数 = Form 変数.getControl(ComboBox 名)
   ComboBox 変数.addItems(ValueArrayIndex
)

  
ValueArray は追加したい値 (文字列) の配列、Index は追加したい行
のインデックス番号を指定する。
  
次に、「CommandButton4」ボタンはコンボボックスに追加された値の
うち、インデックス番号が 4 の行の値を取得するマクロである。これを
実現する為に、getItem メソッドを使用している。書式は下記の通り :
  
   ComboBox 変数 = Form 変数.getControl(ComboBox 名)
   文字列変数ComboBox 変数.getItem(Index
)

  
Index には、取得したい行のインデックス番号を指定する。getItem
メソッドは戻り値として取得した値の文字列を返す。
{CommandButton4」ボタンをクリックした結果は下図の通り :
    
最後に「CommandButton5」ボタンについて。このボタンをクリックすると、
コンボボックス内の値全てが削除される。ここでは、removeItems メソッド
を使用している。書式は下記の通り :
  
   ComboBox 変数 = Form 変数.getControl(ComboBox 名)
   ComboBox 変数.removeItems(Index, Count
)

  
Index には、削除したいデータの開始行のインデックス番号を指定する。
Count には、削除したい件数を指定する。この例では。全データを削除
しているが、例えば、サンプルコードの該当部分を
  
   objComboBox1.removeItems(1, 19)
  
とすると、最初の行の「Item00」と最後の「Item20」は消えずに残ることに
なる。

2011年7月16日土曜日

コンボボックスを操作する (1)

今回はコンボボックス編。今回は前回にも増して情報がなく、ようやく参考
文献 10) を見つけることができ、これを頼りに色々と試した結果を記す。

  
先ず、下図の「Dialog1」を用意する :
  
今回のサンプルコードは下記の通り :
  
Private mobjDialog1 As Object
  
Sub Main
       DialogLibraries.LoadLibrary("Standard")
       mobjDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
       mobjDialog1.execute()
End Sub
  
Sub CommandButton1Click()
       Dim objComboBox1 As Object
       Dim lngIndex As Long
       objComboBox1 = mobjDialog1.getControl("ComboBox1")
       For lngIndex = 0 To 20
              objComboBox1.addItem("Item" & Format(lngIndex, "00"), lngIndex)
       Next lngIndex
End Sub
  
Sub CommandButton2Click()
       Dim objComboBox1 As Object
       objComboBox1 = mobjDialog1.getControl("ComboBox1")
       objComboBox1.setDropDownLineCount(8)
End Sub
  
Sub CommandButton3Click()
      Dim objComboBox1 As Object
      objComboBox1 = mobjDialog1.getControl("ComboBox1")
      Msgbox(objComboBox1.Text)
End Sub
  
それぞれのコマンドボタンに対応するプロシージャは下記の通り :
  
   CommandButton1 ⇔ CommandButton1Click
   CommandButton2 ⇔ CommandButton2Click
   CommandButton3 ⇔ CommandButton3Click
  
まず、フォームを開いて、「CommandButton1」をクリックすると、コンボ
ボックスに値が追加される。下図は、その値を表示しているところ :
  
コンボボックスに値を追加する方法は、リストボックスの場合と似ていて、
書式は下記の通り :
  
   ComboBox 変数 = Form 変数.getControl(ComboBox 名)
   ComboBox 変数.addItem(ValueIndex
)
  
addItem メソッドの Index 引数には、値を追加したい行のインデックス番号
を指定すれば良い。行のインデックス番号は、リストボックス同様、ゼロから
始まる整数。
  
上の図からもわかるように、ドリルダウンした時に表示される行数は 5 行
がデフォルトらしい。そこで、表示行数を 8 行にする為、「CommandButton2」
をクリックして、ドリルダウンしてみると、下図のように 8 行表示されるように
なる :
  
コンボボックスの表示する行数を指定するには、setDropDownLineCount
メソッドを使用する。書式は下記の通り :
  
   ComboBox 変数 = Form 変数.getControl(ComboBox 名)
   ComboBox 変数.
setDropDownLineCount(Line)
  
setDropDownLineCount の 引数 Line に、表示したい行数を指定する。
  
最後に、コンボボックスの中から選択した値を取得する方法を記す。
下図のように値を選択する :
  
この状態で「CommandButton3」をクリックすると、以下のメッセージ
ボックスが表示される :
  
選択した値を取得するには Text プロパティを用いる。書式は下記の通り :
  
   ComboBox 変数 = Form 変数.getControl(ComboBox 名)
   変数ComboBox 変数
.Text
  
コンボボックスにデフォルトで表示する方法についても試してみたかったが、
それらしきメソッドやプロパティがなく、断念した。ドキュメントが整っていない
のもあるが、やはりオブジェクトの構成がゴチャゴチャで、すっきりしない気
がする。LibreOffice はこのまま OpenOffice のオブジェクト構成を踏襲し
続けるのだろうか... 

2011年7月12日火曜日

オプションボタンを操作する

今回はオプションボタン編。但し、情報がなかった為、ほぼ 100% 勘で
やり、それらしく動いたので、多分合っているだろう!、という極めて
いい加減な姿勢で投稿してしまう。
  
先ず、下図のようなダイアログ「Dialog1」を用意する。
  
次に、二つのオプションボタンをグループ化する。Excel の場合は、
グループの枠の中にオプションボタンを配置すればそれでよかったが、
Calc はそれらしきものが見当たらない。色々と探し回った結果、多分
下記のようなやり方なのではないかと思われる。
  
「OptionButton1」のプロパティウィンドウを開き、「グループ名」の欄に
「Group1」と入力する。
  
同様に「OptionButton2」についても「グループ名」
に「Group1」と入力する。
  
肝心なのは、二つのオプションボタンのクループ名を同じにすること。
グループ名を同一にすることによって、二つのオプションボタンが連動
して動くことになるようである。
  
普通オプションボタンが複数ある場合は、いずれか一つをデフォルトで
「True」にする。そこで今回は、「OptionButton1」をデフォルトで「True」
に設定する。設定方法は、下図の通り、「OptionButton1」のプロパティ
ウィンドウの「状態」欄を「選択されています」に設定すればよい :
  
あとはコード。
今回は、「CommandButton」をクリックすると「OptionButton1」が True
になると同時に、「OptionButton2」が False になり、「CommandButton2」
をクリックすると、逆に「OptionButton2」が True になるようなコードに
した。サンプルコードは以下の通り :
  
Private mobjDialog1 As Object
  
Sub Main
       DialogLibraries.LoadLibrary("Standard")
       mobjDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
       mobjDialog1.execute()
End Sub
  
Sub CommandButton1Click()
       Dim objOptionButton1 As Object
       objOptionButton1 = mobjDialog1.getControl("OptionButton1")
       objOptionButton1.State = True
End Sub
  
Sub CommandButton2Click()
       Dim objOptionButton2 As Object
       objOptionButton2 = mobjDialog1.getControl("OptionButton2")
       objOptionButton2.State = True
End Sub
  
「CommandButton1」をクリックした場合は下図の通り :
  
因みに、最初にフォームを開いた時も上のように、「OptionButton1」が
True になる。
  
「CommandButton2」をクリックした場合は、下図の通り :
  
以上のように、複数のオプションボタンを同一のグループにしておくと、オプションボタンの一つを True にすると、残りは自動的に False に
なるマクロを、簡単に書くことが可能となる。

2011年7月10日日曜日

リストボックスを操作する (1)

今回はリストボックスについて。但し、リストボックスは奥が深そうで、未だ
全容を理解していないので、ごく基礎的なことだけ書き留める。
  
まず、下図の画面を用意する。赤字で記してあるのは、コントロール名 :
  
サンプルコードは下記の通り。いつものように、モジュール単位で掲載
する。
  
Private mobjDialog1 As Object
  
Sub Main
       DialogLibraries.LoadLibrary("Standard")
       mobjDialog1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
       mobjDialog1.execute()
End Sub
  
Sub CommandButton1Click()
       Dim objListBox1 As Object
       Dim lngIndex As Long
       objListBox1 = mobjDialog1.getControl("ListBox1")
       For lngIndex = 0 To 10
              objListBox1.addItem("Item" & Format(lngIndex, "00"), lngIndex)
       Next lngIndex
End Sub
  
Sub CommandButton2Click()
       Dim objListBox1 As Object
       objListBox1 = mobjDialog1.getControl("ListBox1")
       Msgbox(objListBox1.SelectedItem)
End Sub
  
フォームの「CommandButton1」、及び、「CommandButton2」コントロールの
クリックイベントには、それぞれ、
  
   CommandButton1Click プロシージャ
   CommandButton2Click プロシージャ
  
を対応させる。
  
リストボックスに値を追加する為のコードは下記の通り :
  
   ListBox 変数 = Form 変数.getControl(ListBox 名)
   ListBox 変数.
addItem(ValueIndex)
  
addItem メソッドの Index 引数には、値を追加したい行のインデックス番号
を指定すれば良い。因みに、行のインデックス番号はゼロから始まる整数。
  
リストボックスの選択した値を取得するには
  
   変数ListBox 変数.SelectedItem
  
とすれば良いようである。
  
尚、上記コード実行結果は下記の通りである。
  
「CommandButton1」ボタンをクリックした結果は下図の通り :
  
  
上記のように、値「Item07」を選択し、「CommandButton2」をクリックすると、
下図のメッセージボックスが表示される :