フィールドに文字列を設定する
Top > Tips > Field

 フィールドはリソースで定義しておけば、 ユーザーから入力された文字を保存しておくメモリ領域を 自動的に確保してくれますが、 初期表示のようにプログラムで初期値を設定する場合は、 メモリ領域をプログラムで確保する必要があります。
 良くある処理なので、関数化しておくと便利です。

 Palmsourceにある Palm OS SDK: Version 4.0のExamplesにも (Finger\Src\FingerMain.c(190): FieldPtr SetFieldTextFromStr( FormPtr formP, UInt16 fieldID, MemPtr strP )) 同様の関数が定義されているので、 自分の用途に合った関数を作成してみましょう。

/* Fieldオブジェクトに指定文字列を設定する */
Err SetStrToFieldText(
    FieldPtr pField,    /* I:Fieldポインタ */
    const Char *str)    /* I:Field設定文字列 */
{
    MemHandle   hMem;

    hMem = FldGetTextHandle(pField);
    if (NULL != hMem)     /* Fieldにメモリハンドルが設定されていた */
    {
        Err  err;

        /* メモリハンドルが設定されているのでリサイズする */
        FldSetTextHandle(pField, NULL);   /* Fieldからメモリハンドルを切り離す */
        err = MemHandleResize(hMem, StrLen(str) + 1);
        if (errNone != err)    /* メモリリサイズ失敗? */
        {
            /* エラーなので元に戻す */
            FldSetTextHandle(pField, hMem);
            return err;
        }
    }
    else
    {
        /* メモリハンドルが設定されていないので新たに確保する */
        hMem = MemHandleNew(StrLen(str) + 1);
        if (NULL == hMem)   /* メモリ確保失敗? */
        {
            return memErrNotEnoughSpace;    /* メモリ確保失敗 */
        }
    }

    /* 確保したメモリハンドルに文字列をコピー */
    StrCopy((Char *)MemHandleLock(hMem), str);
    MemHandleUnlock(hMem);

    /* メモリハンドルをFieldに設定 */
    FldSetTextHandle(pField, hMem);

    /* Fieldを再描画 */
    FldDrawField(pField);

    return errNone;
}

'04/12/5 新規作成