日付設定用セレクタトリガにリピートボタンを付ける
Top > Tips > Repeatbutton

 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 新規作成