Pythonでマクロ(11):ダイアログとフォーム

このシリーズの最終回である。

LibreOfficeのユーザインタフェースとしてダイアログとフォームがある。

「日付フィールドに日付を入力して<Enter>キーを入力するとその日付の年・月・日がシートに代入される」

これをCalcの画面に付けたフォームで行うときのマクロは以下のようになる(これは日付フィールドのイヴェント表の中の「キーを押したとき」のイヴェント処理である):


#coding: utf-8
import uno
import screen_io as ui
row=0
doc = XSCRIPTCONTEXT.getDocument()
ctrl =doc.getCurrentController()
sheet = doc.Sheets[0]
form = sheet.DrawPage.Forms[0]
datef1 = form['datefield1']

def keyPressed_macro(event):
  global row
  k = event.KeyCode
  c = event.KeyChar.value 
  mods = event.Modifiers
  # mods are additive
  # 0 - None
  # 1 - Shift
  # 2 - Ctrl
  # 4 - Alt
  # 8 - Super_R
  print(k, c, mods)
  if k == 1280:  #Enterキー
    #print(datef1.IsDate)
    year = datef1.Date.Year
    month = datef1.Date.Month
    day = datef1.Date.Day
    #表への書き出し
    row+=1
    print(row)
    print(year, month, day)
    sheet.getCellByPosition(0,row).Value=year
    sheet.getCellByPosition(1,row).Value=month
    sheet.getCellByPosition(2,row).Value=day

  return

実行画面

シートとフォーム

同じことをダイアログで行う例はここにある。

【まとめ】

  • フォームもダイアログのためのマクロは同程度の手間で作れる。イヴェント処理が若干異なる。フォームではコントロールのイベント監視は付属するイヴェント表が使えるが、ダイアログ上のコントロールではイベントの監視部分からマクロに含めなければならない。
  • フォームはシートの一部として配置できるが、ダイアログは別窓の表示となる。
  • フォームの位置は固定。ダイアログは移動可。従ってフォームを何処に配置するかを配慮する必要がある。
  • ダイアログは要らないときは邪魔になる。起動のタイミングを考慮する必要がある。
  • 不要になつたダイアログは画面上から消せるが、フォームはできない。
  • ダイアログは様々な部品を配置するインタフェースに向いている。