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 新規作成
Copyright (c) 2006 kasa0 All rights reserved.