Top > OOoBasic > Form > FormGeneration

フォーム生成 Edit

Base にはフォームウィザードがあり自動でフォームを作成してくれます。この機能に不満があったり、特定のフォームを自分で色々作成して利用するといった場合にマクロなどからフォームを生成する一連の方法です。

概要 Edit

データベースフォームを作成する場合、次のような順序でフォームを作成します。

  1. 基本となるドキュメントを作成する
  2. ドローページを取得
  3. 新しいフォームを作成、挿入 (com.sun.star.form.component.Form サービスをインスタンス化して利用)
  4. フォームにデータソース、テーブル名や SQL 文などの設定を行う
  5. (データソースからテーブル名などを取得する)
  6. (テーブルなどからカラム名などを取得する)
  7. コントロールを追加、フィールド名に関連付ける
  8. (コントロールにイベントを設定する)

基本となるドキュメントを作成する Edit

フォームとコントロールを配置するドキュメントの種類を選びます。ドキュメントの種類によって構造が異なるる点に注意。ドキュメントの構造など参照。

ドローページを取得 Edit

フォームを管理するフォームコンテナはドローページに所属しているためドキュメントにいくつドローページがあるかどうかで少し操作が異なります。フォームの構造参照。

Writer ドキュメントでは次のようになります。

oDoc = ThisComponent
oDrawPage = oDoc.getDrawPage()

新しいフォームを作成、挿入 Edit

ドキュメントの XMultiServiceFactory インターフェースを利用して com.sun.star.form.component.Form サービスをインスタンス化、新しいフォームとします。その後、名前を付けてフォームコンテナに挿入します。

oForms = oDrawPage.getForms()
 
oForm = oDoc.createInstance( _
     "com.sun.star.form.component.Form" )
 oForms.insertByName( "Standard", oForm )

フォームにデータソース、テーブル名や SQL 文などの設定を行う Edit

必要な項目を設定します。

以下では登録されたデータソース icons にある Images テーブルに接続します。CommandType が TABLE の時には Command プロパティにテーブル名を設定します。

 With oForm
   .DataSourceName = "icons"
   .Command = "Images"
   .CommandType = com.sun.star.sdb.CommandType.TABLE
   '.ActiveCommand = "SELECT * FROM ""Images""" ' ReadOnly
 End With

クエリーや SQL コマンドの時には Command にクエリー名や SQL コマンドを設定します。

これらの設定は後でもかまいませんが、データソースからフィールド名などを取得してフォームを生成する場合には表などにアクセスする必要があるのでとりあえずの設定も必要です。

(データソースからテーブル名などを取得する) Edit

データソースからテーブル名やクエリー名などを取得する場合はデータベースコンテキストを利用して情報を取得します。

oDBCtx = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oSource = oDBCtx.getByName("icons")

テーブル名を調べる。

oTables = oSource.getTables()
sNames = oTables.getElementNames()

For i = 0 To ubound( sNames ) step 1
  msgbox sNames(i)
Next

クエリー名を調べる。

oQueries = oSource.getQueryDefinitions
sNames = oTables.getElementNames()

For i = 0 To ubound( sNames ) step 1
  msgbox sNames(i)
Next

(テーブルなどからカラム名などを取得する) Edit

テーブルなどからカラム名などを取得して作成するコントロールを決定する場合には次のように ResultSet から情報を取得します。また、カラムの型などの情報も取得できます。カラム参照。

oForm.execute()

oColumns = oForm.getColumns()
sNames = oColumns.getElementNames()
For i = 0 To UBound(sNames) step 1
  sName = sNames(i)
  oColumn = oColumns.getByName(sName)
  msgbox sName & chr(10) & "type: " & oColumn.TypeName
Next

まず execute しないとカラムの情報が取得できません。

コントロールを追加 Edit

上記で取得したドローページにコントロールモデルを設定した ControlShape を追加してフォームコントロールを作成します。

 oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")

 aPoint = CreateUnoStruct("com.sun.star.awt.Point")
 aSize = CreateUnoStruct("com.sun.star.awt.Size")
 aPoint.X = 1000
 aPoint.Y = 1000
 aSize.Width = 3000
 aSize.Height = 1000
 oControlShape.setPosition(aPoint)
 oControlShape.setSize(aSize)

 oButtonModel = CreateUnoService("com.sun.star.form.component.CommandButton")
 
 oControlShape.setControl(oButtonModel)

 oDrawPage.add(oControlShape)

コントロールを配置したら必要なプロパティ値を設定します。たとえば、対応するフィールド名などです。詳細はコントロール設定参照。

oButtonModel.DataField = "NAME"

フィールドのタイプごとに作成するフィールドを変えるには上記の (テーブルなどからカラム名などを取得する) で利用しているカラム のプロパティ Type を参照して作成するフィールドの種類を決定します。

(コントロールにイベントを設定する) Edit

独自のマクロなどをコントロールに設定する場合にのみ行います。

aEvent = CreateUnoStruct( _
    "com.sun.star.script.ScriptEventDescriptor")
With aEvent
  .AddListenerParam = ""
  .EventMethod = "actionPerformed"
  .ListenerType = "XActionListener"
  .ScriptCode = "vnd.sun.star.script:Standard.Module1.btn_push?language=Basic&location=document"
  .ScriptType = "Script"
End With

oForm.registerScriptEvent(0, aEvent)

完了 Edit

フォームのモードをデザインモードから切り替えます。 .uno:SwitchControlDesignMode コマンドで切り変わります。

フォームコントロールの削除 Edit

フォームはフォームコンテナから削除できますが、フォームを削除してもそのフォームに所属するフォームコントロールは削除されずに残ります。これらを削除するにはコントロールのシェープを削除する必要があるようです。

以下は一例です。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Const sFormName = "InputForm"
 
 
Sub Extecute
  'CreateForm
  GetDataFromForm
End Sub
 
Sub GetDataFromForm
  oDoc = ThisComponent
  oController = oDoc.getCurrentController()
  oForms = oDoc.getDrawPage().getForms()
  
  If oForms.hasByName(sFormName) Then
    oForm = oForms.getByName(sFormName)
    
    sTitle = oForm.getByName("TitleField").Text
    sAuthor = oForm.getByName("AuthorField").Text
    
    SetDesignMode(oDoc, True)
    RemoveForm(oDoc, oForms, sFormName)
    
    'oDoc.getText().setString("")
    oDoc.getText().setString("Title: " & sTitle & chr(10) & _
        "Author: " & sAuthor
    'msgbox "Title: " & sTitle & chr(10) & "Author: " & sAuthor
  End If
End Sub
 
 
Sub CreateForm
  oDoc = ThisComponent
  oController = oDoc.getCurrentController()
  oForms = oDoc.getDrawPage().getForms()
  
  oDoc.getText().setString("Title: " & chr(10) & "Author: " & chr(10))
  
  SetDesignMode(oDoc, True)
  RemoveForm(oDoc, oForms, sFormName)
  
  ' instantiate new form and add to the form container
  oForm = oDoc.createInstance("com.sun.star.form.component.Form")
  oForms.insertByName(sFormName, oForm)
  
  oTitleField = AddFormControl(oDoc, "TitleField", "TextField", 2000, 0, 8000, 600)
  AddFormControl(oDoc, "AuthorField", "TextField", 2000, 650, 8000, 600)
  SetDesignMode(oDoc, False
  
  SetFocus(oDoc, oTitleField)
End Sub
 
 
Function AddFormControl(oDoc, sControlName, sControlType, nX, nY, nWidth, nHeight)
  oShape = oDoc.createInstance("com.sun.star.drawing.ControlShape")
  aSize = CreateUnoStruct("com.sun.star.awt.Size")
  aSize.Width = nWidth
  aSize.Height = nHeight
  aPos = CreateUnoStruct("com.sun.star.awt.Point")
  aPos.X = nX
  aPos.Y = nY
  
  oShape.setSize(aSize)
  oShape.setPosition(aPos)
  oModel = CreateUnoService("com.sun.star.form.component." & sControlType)
  oModel.Name = sControlName
  
  oShape.setControl(oModel)
  
  oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
  oDoc.getDrawPage().add(oShape)
  'oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
  
  AddFormControl = oModel
End Function
 
 
Function RemoveForm(oDoc, oForms, sFormName)
  If oForms.hasByName(sFormName) Then
    oFound = Null
    oDrawPage = oDoc.getDrawPage()
    oForm = oForms.getByName(sFormName)
    For i = 0 To oForm.getCount() - 1 step 1
      oFound = FindControlShape(oDrawPage, oForm.getByIndex(0))
      If NOT IsNull(oFound) Then oDrawPage.remove(oFound)
    Next
    oForms.removeByName(sFormName)
  End If
End Function
 
 
Function FindControlShape(oShapeContainer, oControl)
  oFound = Null
  For i = 0 To oShapeContainer.getCount() step 1
    oShape = oShapeContainer.getByIndex(0)
    If oShape.ShapeType = "com.sun.star.drawing.ControlShape" Then
      If EqualUnoObjects(oShape.Control, oControl) Then
        oFound = oShape
      End If
    ElseIf oShape.ShapeType = "com.sun.star.drawing.GroupShape" Then
      oFound = FindControlShape(oShape, oControl)
    End If
    If NOT IsNull(oFound) Then Exit For
  Next
  
  FindControlShape = oFound
End Function
 
 
Function SetDesignMode(oDoc, bMode)
  oController = oDoc.getCurrentController()
  If oController.isFormDesignMode() <> bMode Then oController.setFormDesignMode(bMode)
End Function
 
Function SetFocus(oDoc, oFormControl)
  oDoc.getCurrentController().getControl(oFormControl).setFocus()
End Function

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