動的にリストを作る(その2)
Top > Tips > List

LstSetListChoices関数による動的なリストは、文字列配列を元に作成するので簡単にできますが、 項目の追加・削除するのに文字列を作り直さなければいけないし、 1つの文字列しか表示することができません。

リスト項目としてより多くの情報を表示させたり、リスト項目の追加・削除を自由にしたい場合には、 LstSetDrawFunction関数を使い、リストの内容を自由に描画することができます。

サンプル画面

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

リソースファイル
FORM ID MainForm AT (0 0 160 160)
NOFRAME
BEGIN
  TITLE "Dynamic List"
  LIST "" ID MainList AT (1 16 158 AUTO) FONT 0 VISIBLEITEMS 13
END

イベントハンドラ
UInt16      gNum = 4;

/* リスト描画用コールバック */
static void DrawOneLine(
    Int16 itemNum,          /* I:リスト行数(0〜) */
    RectanglePtr bounds,    /* I:描画領域 */
    CharPtr* itemText)      /* I:リスト項目 */
{
    Char        buff[3];
    CharPtr     listTable[] = {
                                "One",
                                "Two",
                                "Three",
                                "Four"
                              };

    if (0 <= itemNum && gNum > itemNum)    /* リスト項目が0〜3の間? */
    {
        /* リスト項目の描画 */
        StrIToA(buff, itemNum + 1);
        WinDrawChars(buff, StrLen(buff), bounds->topLeft.x, bounds->topLeft.y);

        WinDrawChars(listTable[itemNum], StrLen(listTable[itemNum]), bounds->topLeft.x + 10, bounds->topLeft.y);
    }
}


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

    switch (pEvent->eType)
    {
    case frmOpenEvent:     /* フォームオープンイベント */
        pForm = FrmGetActiveForm();
        pList = (ListPtr)FrmGetObjectPtr(pForm, FrmGetObjectIndex(pForm, MainList));

        LstSetDrawFunction(pList, DrawOneLine);    /* リスト描画ファンクション設定 */
        LstSetListChoices(pList, NULL, gNum);      /* リストの項目数を設定 */

        FrmDrawForm(pForm);
        break;

    default:
        break;
    }

    return handled;
}

LstSetDrawFunction関数の第2引数に、リストの1項目を描画するコールバック関数を指定します。
コールバック関数はリストの描画が必要になった時に、Palm OSから呼び出されます。
第1引数に描画すべきリストの行、 第2引数に描画する矩形領域、 第3引数に、リスト項目のテキストポインタの配列へのポインタ が渡されます。

'05/6/10 新規作成