フォームの使用

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo


Book.png


OpenOffice.org のフォームは、文章ドキュメントまたは表計算ドキュメントの上に、テキストボックス、リストボックス、ラジオボタンをはじめとする各種のコントロール要素を直接配置することにより構成されます。フォームの編集には、フォームの機能ツールバー を利用します。

OpenOffice.org フォームには、デザインモードとディスプレイモードの 2 種類のモードが存在します。デザインモードでは、コントロール要素の表示位置を調整したり、属性ウィンドウにより属性 (プロパティー) を変更したりすることができます。

モードの切り替えは、フォームの機能ツールバー から行えます。

オブジェクトフォームの指定

OpenOffice.org のフォームで用いるコントロール要素は、図形描画オブジェクトと同じレベルに配置されます。実際のオブジェクトフォームには、図形描画レベルの Forms リストを利用してアクセスできます。文書ドキュメント上のオブジェクトへは、次のサンプルコードのようにしてアクセスします。

Dim Doc As Object
Dim DrawPage As Object
Dim Form As Object
 
Doc = StarDesktop.CurrentComponent
DrawPage = Doc.DrawPage
Form = DrawPage.Forms.GetByIndex(0)

ここで GetByIndex メソッドの戻り値としては、インデックス値 0 のフォームが返されます。

表計算ドキュメントの場合は、図形描画レベルが表計算ドキュメントの直下ではなく個々のシート (表) に置かれているため、Sheets リストを経由してアクセスする必要があります。

Dim Doc As Object
Dim Sheet As Object
Dim DrawPage As Object
Dim Form As Object
 
Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets.GetByIndex(0)
DrawPage = Sheet.DrawPage
Form = DrawPage.Forms.GetByIndex(0)

GetByIndex というメソッド名からも分かるように、1 つのドキュメントで複数のフォームを利用することができます。こうした機能は、複数のデータベースの内容を 1 つのドキュメント上に表示させたり、1 対 n のリレーション関係にあるデータベース情報を 1 つのフォームで表示させる場合に便利です。またこの種の処理に関しては、サブフォームの作成機能も用意されています。

フォーム用コントロール要素の構成

フォーム用のコントロール要素は、次のような 3 段階構成になっています。

  • コントロール要素のモデルは、フォーム用コントロール要素を操作する場合、OpenOffice.org Basic のプログラマにとって重要なオブジェクトです。
  • これに対して各コントロール要素の View (ビュー) オブジェクトは、実際に表示する情報を扱います。
  • そして、ドキュメントに配置するフォーム用のコントロール要素は、一種の特殊な図形描画要素として扱われるため、図形描画要素に固有のコントロール要素属性を、Shape (シェイプ) オブジェクトというものを用いて処理しています (主として位置とサイズ)。

フォーム用コントロール要素のモデルへのアクセス

フォーム用コントロール要素のモデルへのアクセスには、フォームオブジェクトの GetByName メソッドを利用します。

Dim Doc As Object
Dim Form As Object
Dim Ctl As Object
 
Doc = StarDesktop.CurrentComponent
Form = Doc.DrawPage.Forms.GetByIndex(0)
Ctl = Form.getByName("MyListBox")

上記のサンプルコードでは、現在開いている文書ドキュメントの最初のフォームにある MyListBox というコントロール要素のモデルへアクセスするものとしています。

コントロール要素の配置されたフォームがどれであるか不明な場合は、すべてのフォームを対象として該当するコントロール要素を検索することもできます。

Dim Doc As Object
Dim Forms As Object
Dim Form As Object
Dim Ctl As Object
Dim I as Integer
 
Doc = StarDesktop.CurrentComponent
Forms = Doc.Drawpage.Forms
 
For I = 0 To Forms.Count - 1
  Form = Forms.GetbyIndex(I)
  If Form.HasByName("MyListBox") Then
    Ctl = Form.GetbyName("MyListBox")
    Exit Function
  End If
Next I

上記のサンプルコードでは、HasByName メソッドを用いて、MyListBox というコントロール要素モデルがあるかを、文書ドキュメント上のすべてのフォームを対象にチェックしています。そして該当するモデルを検出した段階で、変数 Ctl にその参照情報を格納して、検索処理を終了しています。

フォーム用コントロール要素のビューへのアクセス

フォーム用コントロール要素のビューにアクセスするには、関連付けられたモデルが必要です。そしてこのモデルをドキュメントコントローラに指定することにより、コントロール要素のビューを取得します。

Dim Doc As Object
Dim DocCrl As Object
Dim Forms As Object
Dim Form As Object
Dim Ctl As Object
Dim CtlView As Object
Dim I as Integer
 
Doc = StarDesktop.CurrentComponent
DocCrl = Doc.getCurrentControler()
Forms = Doc.Drawpage.Forms
 
For I = 0 To Forms.Count - 1
  Form = Forms.GetbyIndex(I)
  If Form.HasByName("MyListBox") Then
    Ctl = Form.GetbyName("MyListBox")
    CtlView = DocCrl.GetControl(Ctl)
    Exit Function
  End If
Next I

上記のサンプルコードは、1 つ前に見たコントロール要素のモデル検索用サンプルコードと非常によく似ています。ただしこのサンプルコードでは Doc というドキュメントオブジェクトに加えて、現在のドキュメントウィンドウの参照用に DocCrl というドキュメントコントローラオブジェクトを用意しています。そして、このコントローラオブジェクトに対して、先に用意したコントロール要素のモデルを渡すことにより、GetControl メソッドを使用して、フォーム用コントロール要素のビュー (ここでは変数 CtlView) を特定しています。

フォーム用コントロール要素のシェイプオブジェクトへのアクセス

コントロール要素のシェイプオブジェクトへアクセスする場合も、ドキュメントの図形描画レベルを使用します。特定のコントロール要素を特定するには、図形描画レベルにあるすべての図形描画要素を検索する必要があります。

Dim Doc As Object
Dim Shape as Object
Dim I as integer
 
Doc = StarDesktop.CurrentComponent
 
For i = 0 to Doc.DrawPage.Count - 1
  Shape = Doc.DrawPage(i)
  If HasUnoInterfaces(Shape, "com.sun.star.drawing.XControlShape") Then
    If Shape.Control.Name = "MyListBox" Then
      Exit Function
    End If
  End If
Next

上記のサンプルコードでは、すべての図形描画要素をチェックして、フォーム用コントロール要素に必要な com.sun.star.drawing.XControlShape インターフェースをサポートしているものがあるかを確認しています。該当するものがある場合は、Control.Name 属性を用いて、MyListBox という名前のコントロール要素があるかをチェックします。そしてこの条件も満たされたならば、検索処理を終了します。

コントロール要素のサイズと位置

先に述べたように、コントロール要素のサイズと位置の処理には、shape オブジェクトを利用します。このような処理を行うため、コントロール要素のシェイプには、他のすべての shape オブジェクトと同じように、Size および Position という属性が用意されています。

Size (struct)
コントロール要素のサイズ (com.sun.star.awt.Size データ構造)。
Position (struct)
コントロール要素の位置 (com.sun.star.awt.Point データ構造)。

次のサンプルコードでは、シェイプオブジェクトを用いた、コントロール要素のサイズと位置の指定方法を示します。

Dim Shape As Object
 
Point.x = 1000
Point.y = 1000
Size.Width = 10000
Size.Height = 10000
 
Shape.Size = Size
Shape.Position = Point

このサンプルコードは、コントロール要素の shape オブジェクトは既知であることを前提としています。既知でない場合は、先のコードを利用して必要な判定処理を行う必要があります。


Content on this page is licensed under the Public Documentation License (PDL).
Personal tools