ボタンの文字列を変更する
Top > Tips > Button

Palmでは画面上に配置されるボタンなどのコントロールを、 リソースとして静的に作成しますが、 ボタンに表示されている文字列を動作中に変更したいときもあります。

ボタンに表示される文字列は、 ラベルコントロールと同様に扱えるので、 FrmCopyLabel関数で書き換えることができます。

ここで注意しなくてはいけないのが、 リソースで設定したボタンの文字列長よりも長い文字列を設定してはいけないということです。
FrmCopyLabel関数は、ラベルやボタンなどのコントロールのラベルに 指定の文字列を設定するだけで、文字列分のメモリ領域を管理はしていないので、 リソースで設定した文字列よりも長い文字列を設定した場合には、 リソースを破壊してしまいます。

それから、ボタンを再描画するために、 書き換え前にFrmHideObject関数を呼び出し、 書き換え後にFrmShowObject関数を呼び出します。

サンプル画面

ヘッダファイル
#define MainForm        1000
#define StartButton     1001

#define MODE_START      0
#define MODE_STOP       1

#define LABEL_START     "Start"
#define LABEL_STOP      "Stop"

リソースファイル
FORM ID MainForm AT (0 0 160 160)
NOFRAME
BEGIN
  TITLE "Change Button Label"
  BUTTON "Start" ID StartButton AT (CENTER 74 45 25) FONT 0
END

イベントハンドラー
UInt16   buttonMode = MODE_START;

Boolean MainFormHandleEvent(
    EventPtr pEvent)    /* I:イベント */
{
    Boolean     handled = false;
    FormPtr     pForm;

    switch (pEvent->eType)
    {
    case frmOpenEvent:     /* フォームオープンイベント */
        pForm = FrmGetActiveForm();
        FrmDrawForm(pForm);
        handled = true;
        break;

    case ctlSelectEvent:    /* コントロール選択イベント */
        if (StartButton == pEvent->data.ctlSelect.controlID)    /* ボタンをタップ? */
        {
            pForm = FrmGetActiveForm();
            FrmHideObject(pForm, FrmGetObjectIndex(pForm, StartButton));

            if (MODE_START == buttonMode)    /* "Start"だった? */
            {
                /* ボタンの文字列を"Stop"に変更 */
                FrmCopyLabel(pForm, StartButton, LABEL_STOP);
                buttonMode = MODE_STOP;
            }
            else
            {
                /* ボタンの文字列を"Start"に変更 */
                FrmCopyLabel(pForm, StartButton, LABEL_START);
                buttonMode = MODE_START;
            }

            FrmShowObject(pForm, FrmGetObjectIndex(pForm, StartButton));
            handled = true;
        }
        break;

    default:
        break;
    }

    return handled;
}

'06/2/15 新規作成