Palm OSには、カレンダーコントロールにより日付を選択するダイアログが、
提供されています。
これにより、日付を選択させる処理は、わずか数行で実装することができます。
しかし、わずか数日を変更するならば、カレンダーを表示するよりも、 リピートボタンを数回押す方が操作は簡単です。
サンプル画面
ヘッダファイル
#define MainForm 1000 #define PrevButton 1001 #define DateTrigger 1002 #define NextButton 1003 |
リソースファイル
FORM ID MainForm AT (0 0 160 160) NOFRAME BEGIN TITLE "Repeat Button" REPEATBUTTON "\x02" ID PrevButton AT (41 CENTER 10 AUTO) FONT 4 LEFTANCHOR NOFRAME SELECTORTRIGGER "0000/00/00" ID DateTrigger AT (CENTER PREVTOP AUTO AUTO) FONT 0 REPEATBUTTON "\x03" ID NextButton AT (PREVRIGHT CENTER 10 AUTO) FONT 4 LEFTANCHOR NOFRAME END |
イベントハンドラ
UInt16 gYear; /* 年 */ UInt16 gMonth; /* 月 */ UInt16 gDay; /* 日 */ /* 日付設定用セレクタトリガに日付を設定する */ static void SetDateSelectorTrigger( FormPtr pForm) { ControlPtr pCtrl; CharPtr pLabel; pCtrl = FrmGetObjectPtr(pForm, FrmGetObjectIndex(pForm, DateTrigger)); pLabel = (CharPtr)CtlGetLabel(pCtrl); /* 日付をYYYY/MM/DD形式に変換 */ DateTemplateToAscii("^4r/^3z/^0z", gMonth, gDay, gYear, pLabel, 11); CtlSetLabel(pCtrl, pLabel); } /* 日付設定用セレクタトリガの日付に加算する */ static void DateModify( FormPtr pForm, /* I:フォームポインタ */ Int16 iAdd) /* I:加算値 */ { gDay += iAdd; if (0 >= gDay) /* 前月になる? */ { gMonth--; if (0 >= gMonth) /* 前年になる? */ { gMonth = 12; gYear--; } gDay += DaysInMonth(gMonth, gYear); } else { Int16 iDays; iDays = DaysInMonth(gMonth, gYear); if (gDay > iDays) /* 次月になる? */ { gDay -= iDays; gMonth++; if (12 < gMonth) /* 次年になる? */ { gMonth = 1; gYear++; } } } SetDateSelectorTrigger(pForm); } static Boolean MainFormHandleEvent(EventPtr pEvent) { Boolean handled = false; FormPtr pForm; DateTimeType datetime; switch (pEvent->eType) { case frmOpenEvent: /* フォームオープンイベント */ pForm = FrmGetActiveForm(); /* 日付設定用セレクタトリガーに今日の日付を設定 */ TimSecondsToDateTime(TimGetSeconds(), &datetime); gYear = datetime.year; gMonth = datetime.month; gDay = datetime.day; SetDateSelectorTrigger(pForm); FrmDrawForm(pForm); handled = true; break; case ctlRepeatEvent: /* リピートボタンイベント */ pForm = FrmGetActiveForm(); if (PrevButton == pEvent->data.ctlRepeat.controlID) /* ←押下? */ { DateModify(pForm, -1); } else if (NextButton == pEvent->data.ctlRepeat.controlID) /* →押下? */ { DateModify(pForm, +1); } /* ボタンの再描画のために、戻り値はtrueにしない */ break; case ctlSelectEvent: /* コントロール選択イベント */ if (DateTrigger == pEvent->data.ctlSelect.controlID) /* 日付設定用セレクタトリガー */ { /* 日付を選択(カレンダーコントロール表示) */ if (SelectDay(selectDayByDay, &gMonth, &gDay, &gYear, "Select Date")) { pForm = FrmGetActiveForm(); SetDateSelectorTrigger(pForm); } handled = true; } break; default: break; } return handled; } |
'06/3/8 新規作成
Copyright (c) 2006 kasa0 All rights reserved.