ダイアログのコントロール(部品)に日付フィールドというものがある。形式に従って日付けを入力すると年、月、日に自動的に分解しくれる。
作例では誕生日を入力して<Enter>キーを入力すると入力の終わりを意味し結果はCalcのシートに表示される。
【ダイアログ上の日付フィールド】
【マクロ】
#coding: utf-8
import uno
import screen_io as ui
import unohelper
from com.sun.star.awt import XKeyListener
class MyKeyListener(unohelper.Base, XKeyListener):
def __init__(self, sheet, datef1):
self.sheet = sheet
self.datef1 = datef1
self.row = 0
def keyPressed( self, event ):
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(self.datef1.IsDate)
year = self.datef1.Date.Year
month = self.datef1.Date.Month
day = self.datef1.Date.Day
#表への書き出し
self.row+=1
print(self.row)
print(year, month, day)
self.sheet.getCellByPosition(0,self.row).Value=year
self.sheet.getCellByPosition(1,self.row).Value=month
self.sheet.getCellByPosition(2,self.row).Value=day
def createDialog():
ctx = XSCRIPTCONTEXT.getComponentContext()
smgr = ctx.getServiceManager()
dp = smgr.createInstanceWithContext("com.sun.star.awt.DialogProvider", ctx)
dialog = dp.createDialog("vnd.sun.star.script:Standard.Dialog3?location=application")
#表
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.Sheets[0]
#コントロールの登録
datef1 = dialog.getControl("DateField1")
#エヴェント監視(Enterキーを検出)
datef1_listener = MyKeyListener(sheet, datef1)
datef1.addKeyListener(datef1_listener)
dialog.execute()
dialog.dispose()
<\div>
- <Enter>キーの入力はイヴェントとして発生する。このイヴェントは keyPressedメッソドで処理される。このメソッドは親クラスXKeyListenerで定義されているのでクラスMyKeyListenerではそれを継承し再定義している。
- このキー・イヴェントは全てのキー入力で起こる。eventの属性Kcodeの値を調べ<Enter>キーを取り出す。
- 日付フィールドの属性、Date.Year、Date.Month、Date.Dayから入力した年、、月、日が得られる。
- このマクロではダイアログとCalcのシートを同時に使っている。
One Reply to “Pythonでマクロ(7):誕生日の入力を日付フィールドを使って”