Top > OOoBasic > Dialog > Example7

コントロールコンテナ1 Edit

コントロールコンテナを配置した例です。

ControlContainer-1.png

fileControlContainer-1.odt

ちょっと分かりにくいので説明。(表示に時間がかかるのは画像を取得している zip ファイルから抽出に時間がかかっているため)

一部です。

Sub Main
  ' load library and make dialog
  sLibName = "Standard"
  sDialogName = "Dialog1"
  DialogLibraries.LoadLibrary(sLibName)
  oDialog = CreateUnoDialog(_
    DialogLibraries.getByName(sLibName).getByName(sDialogName))
  

ダイアログには基本となるラベルコントロール "Label1" を配置してあります。このコントロールをベースとしてコントロールコンテナを作成します。(ベースとなるコントロールを利用するといくつか利点があります。)

  ' base control of the control container base
  oLabel = oDialog.getControl("Label1")
  oPeer = oLabel.Peer
  oToolkit = oPeer.getToolkit()
  aPosSize = oLabel.PosSize
  nScrollWidth = 20 ' width of the scrollbar, need to keep its width
  

"Label1" の上にかぶさるように配置するコントロールコンテナです。これは固定枠として利用し、移動しません。createPeer メソッドで child window を作成しておきます。

  ' base controlcontainer works like a frame.
  oBaseModel = CreateUnoService("com.sun.star.awt.UnoControlContainerModel")
  oBase = CreateUnoService("com.sun.star.awt.UnoControlContainer")
  oBaseModel.Border = 0
  oBaseModel.BackgroundColor = -1
  oBase.setModel(oBaseModel)
  oBase.createPeer(oToolkit,oPeer) ' needs to create its peer
  oBase.setPosSize(0,0,aPosSize.Width, aPosSize.Height, _
    com.sun.star.awt.PosSize.POSSIZE)
  

oBase コントロールコンテナ内で移動するコントロールコンテナオブジェクトです。このコンテナに他のコントロールを追加します。今回はチェックボックスです。

  ' container moves inside the base. do not need to create its peer
  oContainerModel = CreateUnoService("com.sun.star.awt.UnoControlContainerModel")
  oContainer = CreateUnoService("com.sun.star.awt.UnoControlContainer")
  oContainerModel.Border = 1
  'oContainerModel.BackgroundColor = -1 ' do not use -1 as transparent
  oContainer.setModel(oContainerModel)
  oContainer.setPosSize(0,0,aPosSize.Width - nScrollWidth, aPosSize.Height, _
    com.sun.star.awt.PosSize.POSSIZE) ' keep the position of the scrollbar
  'oContainer.setPosSize(0,0,aPosSize.Width, aPosSize.Height, _
  '  com.sun.star.awt.PosSize.POSSIZE) ' keep the position of the scrollbar
  

oContainer を移動させるスクロールバーです。oBase に追加するとコントロールの配置を変更するときに楽になりますが、すこし弊害があります。

  ' scrollbar to move the container vertically
  oVScrollModel = CreateUnoService("com.sun.star.awt.UnoControlScrollBarModel")
  oVScroll = CreateUnoService("com.sun.star.awt.UnoControlScrollBar")
  oVScrollModel.Orientation = 1
  oVScroll.setModel(oVScrollModel)
  oVScroll.setPosSize(aPosSize.Width - nScrollWidth,0,nScrollWidth,aPosSize.Height,_
    com.sun.star.awt.PosSize.X + com.sun.star.awt.PosSize.SIZE )
  'oVScroll.setPosSize(aPosSize.X + aPosSize.Width,aPosSize.Y,nScrollWidth,aPosSize.Height,_
  '  com.sun.star.awt.PosSize.POSSIZE )
  oScrollListener = CreateUnoListener("ScrollAdjust_",_
    "com.sun.star.awt.XAdjustmentListener")
  oVScroll.addAdjustmentListener(oScrollListener)
  
  ' add them to the base controlcontainer
  oBase.addControl("container",oContainer)
  oBase.addControl("vscroll",oVScroll)
  'oDialog.addControl("vscroll",oVScroll)
  

配置するチェックボックスのサイズなどです。

  ' these values are used to make checkboxes
  ' size
  nCtrlWidth = aPosSize.Width - 10 - 10
  nCtrlHeight = 70
  ' margin
  nContainerTopMargin = Int(nCtrlHeight / 4)
  nContainerBottomMargin = Int(nCtrlHeight / 4)
  
  ' number of checkboxes
  nNum = 25
  

コンテナのサイズを計算しなおします。

  ' calculate and change the size of the controlcontainer
  nContainerHeight = nCtrlHeight * nNum + nContainerTopMargin + nContainerBottomMargin
  oContainer.setPosSize(0,0,0,nContainerHeight,com.sun.star.awt.PosSize.HEIGHT)
  

コンテナに合わせてスクロールバーを設定します。

  ' change the scrollbar settings
  nVisble = aPosSize.Height
  nMaxValue = nContainerHeight - aPosSize.Height + nVisble
  oVScrollModel.ScrollValueMax = nMaxValue
  oVScrollModel.LineIncrement = Int(nMaxValue / (nNum * 2))
  oVScrollModel.VisibleSize = nVisble
  oVScrollModel.LiveScroll = True
  

今回利用した画像は適当なものです。

  ' prepare images
  oPS = CreateUnoService("com.sun.star.util.PathSubstitution")
  sPkg = oPS.substituteVariables("$(inst)/share/config/images.zip",True)
  sURL = "vnd.sun.star.pkg://" & ReplaceSlashes(sPkg) & "/res/foil"
  Dim sImgName As String
  
  ' add checkboxes
  For i = 0 To nNum -1
    oCtrl = CreateCheckBox(15,nCtrlHeight*i + nContainerTopMargin,nCtrlWidth,nCtrlHeight )
    oCtrl.Label = "CheckBox" & CStr(i)
    oCtrl.Model.ImagePosition = com.sun.star.awt.ImagePosition.LeftCenter
    oCtrl.Model.ImageURL = sURL & IIf(i<10,"0" & CStr(i),CStr(i)) & ".png"
    oContainer.addControl("CheckBox" & CStr(i),oCtrl)
  Next i
  
  'mri oContainer
  oDialog.execute()
  oVScroll.removeAdjustmentListener(oScrollListener)
  oDialog.dispose()
End Sub

Attach file: fileControlContainer-1.png 509 download [Information] fileControlContainer-1.odt 1378 download [Information]

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