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

リストコントロールは、リソースに定義することにより静的に作成することができますが、 プログラム動作中に動的に内容を替えることもできます。

'\0'で区切られた文字列データを SysFormPointerArrayToStrings関数によりリスト用のメモリハンドルを作成します。
そのメモリハンドルをロックして、LstSetListChoices関数によりリストに設定することが出来ます。

注意すべき点は、リストの描画が行われるときには、リスト用のメモリハンドルは ロックされていなくてはいけません。
また、リスト項目の文字列データは、リストが表示されている間は、 破棄してはいけません。

サンプル画面

ヘッダファイル
#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

イベントハンドラー
Char        listItem[] = "One\0Two\0Three\0Four";   /* リスト項目の文字列データ */
UInt16      num = 4;                                /* リスト項目数 */

MemHandle   hArray = NULL;                          /* リスト用のメモリハンドル */

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

    switch (pEvent->eType)
    {
    case frmOpenEvent:     /* フォームオープンイベント */
        pForm = FrmGetActiveForm();
        hArray = SysFormPointerArrayToStrings(listItem, num);
        ppItemsText = (CharPtr *)MemHandleLock(hArray);
        LstSetListChoices((ListPtr)FrmGetObjectPtr(pForm, FrmGetObjectIndex(pForm, MainList)), ppItemsText, num);
        FrmDrawForm(pForm);
        handled = true;
        break;

    case frmCloseEvent:    /* フォームクローズイベント */
        if (0 != hArray)
        {
            MemHandleUnlock(hArray);
            MemHandleFree(hArray);
        }
        break;

    default:
        break;
    }

    return handled;
}

'05/6/9 新規作成