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