ラベルの文字列を変更する
Top > Tips > Label

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

ラベルに表示される文字列は、 FrmCopyLabel関数で書き換えることができます。

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

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

サンプル画面

ヘッダファイル
#define MainForm        1000
#define NumLabel        1001
#define OneButton       1002
#define TwoButton       1003
#define ThreeButton     1004

#define NO_ONE          "1"
#define NO_TWO          "2"
#define NO_THREE        "3"

リソースファイル
FORM ID MainForm AT (0 0 160 160)
NOFRAME
BEGIN
  TITLE "Change Label"
  LABEL "0" ID NumLabel AT (72 73 AUTO AUTO) FONT 0
  BUTTON "1" ID OneButton AT (72 103 AUTO AUTO) FONT 0
  BUTTON "2" ID TwoButton AT (72 103 AUTO AUTO) FONT 0
  BUTTON "3" ID ThreeButton AT (72 103 AUTO AUTO) FONT 0
END

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

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

    case ctlSelectEvent:    /* コントロール選択イベント */
        handled = true;

        pForm = FrmGetActiveForm();
        FrmHideObject(pForm, FrmGetObjectIndex(pForm, NumLabel));

        switch (pEvent->data.ctlSelect.controlID)
        {
        case OneButton:
            /* ラベルの文字列を"1"に変更 */
            FrmCopyLabel(pForm, NumLabel, NO_ONE);
            break;

        case TwoButton:
            /* ラベルの文字列を"2"に変更 */
            FrmCopyLabel(pForm, NumLabel, NO_TWO);
            break;

        case ThreeButton:
            /* ラベルの文字列を"3"に変更 */
            FrmCopyLabel(pForm, NumLabel, NO_THREE);
            break;

        default:
            handled = false;
            break;
        }

        FrmShowObject(pForm, FrmGetObjectIndex(pForm, NumLabel));
        break;

    default:
        break;
    }

    return handled;
}

'06/2/15 新規作成