Top > OOobbs > 49
** [[OOobbs/49]] [#kbf22194]
-''サマリ'': コンボボックスのコントロールソースについて
-''環境'': Calc
-''状態'': 解決
-''投稿者'': [[素人]]
-''投稿日'': 2005-02-21 (月) 17:34:56

*** 質問 [#ie9b90e5]
どうやってコンボ内に展開させる項目を指定すればいいのでしょうか。
Excelのようにはいかなくて。。。

お願い致します。
*** 回答 [#l969ebcc]
-コンボボックスコントロールに,表示項目を挿入したいとのことですが,OOoBasic のダイアログ上のコンボボックスに項目を設定したいという質問ですよね?(ドキュメント中の「フォーム」にあるコンボボックスではなくて) -- [[はにゃ?]] &new{2005-02-21 (月) 17:46:20};

コンボボックスコントロールに表示項目を設定する方法は,大きく分けると二つあります。
+ダイアログエディタ上で行う
+OOoBasic マクロのコード中で項目を設定する

一つ目はただダイアログエディタ上でプロパティーの変更を行うことで設定する方法です。

コンボボックスの "List Entries" プロパティーに項目を入力していきます。

一つ目の項目を入力して,次の項目を入力するには "Shift+Enter" で改行して次の項目を入力します。

&ref(combobox.png);

二つ目の方法は,マクロコード中の処理でコンボボックスのリストを設定する方法です。

この方法は,ダイアログをダイアログエディタで作成するのではなくて動的にダイアログを生成するときなどに使用します。また,動的にコンボボックスのリストを変更することができるので便利な方法です。上記のダイアログエディタで入力したリストも変更が可能ですので,非常に有用です。

次のコードでは,"Standard" ライブラリの "Dialog1" にある "ComboBox1" について項目を追加します。次のファイルを作成しました。&ref(combobox1.sxc);

 Sub Main
 Dim oDialog As Object
 Dim oComboBox As Object
 Dim aItems() As String
   oDialog = createUnoDialog(DialogLibraries.Standard.Dialog1)
   oComboBox = oDialog.getControl("ComboBox1")
   
   aItems() = Array("first", "second", "third")
   If oComboBox.getItemCount() <> 0 Then
     oComboBox.removeItems(0,oComboBox.getItemCount())
   End If
     oComboBox.addItems(aItems(), 0)
   oDialog.execute()
 End Sub

項目を配列 aItems() に準備しておき,コンボボックスオブジェクトのメソッド ''addItems'' で一度に複数の項目を追加します。

 addItems( aItems, nPos )
-複数の項目を一度に追加する
-aItems: 追加する項目を配列で
-nPos: 項目を追加する位置

コンボボックスオブジェクトのプロパティーとメソッドについては,[[OOoBasic/Generic/obj/ComboBox]] にある程度まとめてあります。

 getItemCount()
-コンボボックスが持つ項目数を戻す

 removeItems( nPos, nCount )
-項目を削除する
-nPos: 削除を始める位置
-nCount: 削除する項目数

分からないことや,より詳しい部分は続いて質問を書き込んでもらえればいいのですが。
-とても丁寧なご教示ありがとうございます。 -- [[素人]] &new{2005-02-22 (火) 10:30:56};
-「フォームアイコン」から選択したコンボボックスのことです。書き込む場所を間違ったのでしょうか。。 -- [[素人]] &new{2005-02-22 (火) 10:32:50};
-すいません。フォームのコンボボックスでしたか。じゃあ,ここからはフォームのコンボボックスに説明を変更します。基本的には同じです。 -- [[はにゃ?]] &new{2005-02-22 (火) 11:41:09};

フォームを作成するボタンをクリックして,プロパティーのボタンをクリックしてプロパティー編集のダイアログを表示します。項目の設定は上記と同じで,二つ目の項目を入力するには,"Shift+Enter" を入力して改行します。これで次の項目を入力します。

&ref(form_combobox.png);


動的なコンボボックスへの項目の挿入については,ダイアログのときとメソッド自体は同じなのですが,フォームへのアクセスについての部分が異なります。

まずは,フォームへのアクセスについてです。

フォームは,フォームオブジェクトを形成しています。そのフォームオブジェクトは各ページのドローページオブジェクトに所属しています。そして,ドローページオブジェクトはドキュメントの各ページごとに存在します。

 ドキュメントオブジェクト-ページなど-ドローページオブジェクト-フォーム

ドキュメント中に存在するページは,ドキュメントの種類によって異なります。Writer ではページは一つです。また,そのほかのドキュメントについてはページやシートごとに一ページになるので,ドキュメントに存在するシートやページ数分だけドローページが別々に存在します。Writer でページごとに分かれているように見えますがあのようなページ分割はドローページを分割しません。

上記のページごとのドローページについてのことがあるので,Writer とそれ以外のドキュメントの場合にはドローページオブジェクトの取得の仕方が多少異なります。(フォームオブジェクトはドローページオブジェクトから取得する必要があるので仕方ありません)
-でっ、出来ました!ありがとうございましたっ!せっかくたくさん教えて頂いたので、難しそうな方のやり方のほうも研究してみます!ありがとうございました! -- [[素人]] &new{2005-02-22 (火) 15:08:49};
-うまくいきましたか,よかったです。一応,難しい方のやり方も書いておきます。一からやると本当に大変なんですけど。 -- [[はにゃ?]] &new{2005-02-22 (火) 18:10:03};

Writer ではドキュメントオブジェクトから ''DrawPage'' プロパティーを使ってドローページオブジェクトを取得します。

 Dim oDoc As Object
 Dim oDrawPage As Object
   oDoc = ThisComponent
   oDrawPage = oDoc.DrawPage

Calc や Draw ドキュメントの場合には,いくつか方法があるのですがそれぞれのページからドローページオブジェクトを取得する方法について書きます。

Calc ではシートオブジェクトをインデックスまたはシート名でドキュメントオブジェクトから取得します。

 Dim oDoc As Object
 Dim oSheet As Object
 Dim oDrawPage As Object
  oDoc = ThisComponent
  oSheet = oDoc.getSheets().getByIndex(0)
  oDrawPage = oSheet.DrawPage

ここでは,シートインデックス 0 のシート,つまりシートタブの一番左に表示されているシートオブジェクトを取得しました。そして,そのシートに対応するドローページオブジェクトを ''DrawPage'' プロパティーを使用して取得しました。

そして,Draw と Impress ではドローページコンテナオブジェクトから各ページを取得します。そのときの各ページはそのままドローページオブジェクトに相当します。また,各ページのオブジェクト,ドローページオブジェクトはドローページコンテナオブジェクトからページのインデックスまたはページ名で取得します。

 Dim oDoc As Object
 Dim oDrawPages As Object
 Dim oDrawPage As Object
   oDoc = ThisComponent
   oDrawPages = oDoc.DrawPages
   oDrawPage = oDrawPages.getByIndex(0)

Writer, Calc, Draw, Impress で取得した oDrawPage 変数に保持されているドローページオブジェクトはこれ以降は同じように扱うことができます。

ドローページオブジェクトから ''Forms'' プロパティーを使用してフォームコンテナオブジェクトを取得します。そして,そこから該当するフォームオブジェクトをさらに取得します。

 Dim oForms As Object
 Dim oForm As Object
  oForms = oDrawPage.Forms
  oForm = oForms.getByName("Standard")

最後の行は


#comment

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes