入力フィールドの入力・編集操作を有効にします。

構文

bool AM_EnableTextEdit(
  MENU_HANDLE menu,
  int id
);

パラメータ

menu
[in] メニューハンドル
id
[in] メニューアイテムのアイテムID。

戻り値

 関数が成功したらtrueを、それ以外はfalseを返します。
 idで指定したメニューアイテムが入力フィールド以外のときはfalseを返します。

解説

 idで指定した入力フィールドの入力・編集操作を有効にします。

 この関数は、AM_EditParam構造体EditOptionAM_EDIT_DISABLE_TEXT_EDITオプションを指定して入力・編集操作を無効にした入力フィールドに対して、プログラムで編集操作を有効にするときに使用します。

 特定の条件のときだけキー入力を許したい入力フィールドにはAM_EDIT_DISABLE_TEXT_EDITオプションを指定したおき、入力を開始するときに本関数を呼ぶようにします。

 プログラムで入力フィールドの入力・編集操作を無効にするには、AM_DisableTextEdit関数を呼びます。
 入力フィールドの入力・編集操作が有効かどうかを調べるには、AM_IsTextEditEnabled関数を使用します。

必要条件

ヘッダファイル:
lib.h
AdvancedMenu.h (Ver. 1.6.1以降)
ライブラリファイル:
libAdvancedMenu.a (Ver. 1.6.1以降)
libSTARTUPOPH5000.a

サンプル

 画面上に2個の入力フィールドがあり、初期状態では[SCAN]キーでバーコードを読み取れます。
 キー入力を行うと文字入力モードに切り替わり、[ENT]キーを押すと再びバーコードを読み取るモードに戻ります。

[Q1]、[Q2]キーを押すと、前後の入力フィールドにフォーカスを移動できます。

[SCAN]キーを押してバーコードを読み取ると、フォーカスが次のフィールドに自動的に進みます。

数字キーを押すと、文字入力モードに切り替わります。文字入力モードで[Q1]、[Q2]キーを押すと、カーソルを入力フィールド内で左右に移動できます。

[ENT]キーを押すと入力が確定し、フォーカスが次のフィールドに自動的に進みます。

数字キーを押すと、現在のデータをクリアして文字入力モードに切り替わります。

[CLEAR]キーを押すと、文字入力をキャンセルして元のデータに戻します。

#include <stdio.h>
#include <string.h>
#include "lib.h"
#include "AdvancedMenu.h"

// Prototypes
void task(void);

///////////////////////////////////////////////////////////////////
// Color palette
//////////////////////////////////////////////////////////
#define FORE_COLOR          RGB_WHITTE
#define BACK_COLOR          0xf7f7f7    //Light gray
#define SELECT_COLOR        RGB_BLUE
#define DISABLE_COLOR       0xb0b0b0    //Gray
#define GIUDE_BUTTON        RGB_BLUE
#define APPLY_COLOR         RGB_MAGENTA
#define TITLE_TASK_COLOR    0x008000    //Dark Green

static const AM_ColorPalette CustomColor[] = {
    //ForeColor,        BackColor,        Select_ForeColor, Select_BackColor,  Control_ForeColor
    { RGB_BLACK,        BACK_COLOR,       RGB_WHITE,        SELECT_COLOR,      GIUDE_BUTTON      }, //#0: Base color
    { GIUDE_BUTTON,     BACK_COLOR,       0,                0,                 GIUDE_BUTTON      }, //#1: Guide color
    { RGB_WHITE,        TITLE_TASK_COLOR, 0,                0,                 0                 }, //#2: Title 0f tasks
    { RGB_BLACK,        RGB_WHITE,        RGB_WHITE,        RGB_BLUE,          RGB_YELLOW        }, //#3: Input field color
    { RGB_BLACK,        RGB_WHITE,        RGB_BLACK,        RGB_YELLOW,        RGB_BLUE          }, //#4: Input editing color
    { APPLY_COLOR,      BACK_COLOR,       0,                0,                 APPLY_COLOR       }, //#5: Apply color
};
#define PX_BASE           0  // Base color
#define PX_GUIDE          1  // Guide color
#define PX_TITLE          2  // Title color
#define PX_INPUT          3  // Input field color
#define PX_EDIT           4  // Input editing color
#define PX_APPLY          5  // Apply color


//////////////////////////////////////////////////////////
// Options for task screen
//////////////////////////////////////////////////////////
static const AM_Option TaskOption = {
    RGB_BLACK,                                      // MenuForeColor
    DISABLE_COLOR,                                  // MenuDisabledForeColor
    BACK_COLOR,                                     // MenuBackColor
    sizeof(CustomColor)/sizeof(AM_ColorPalette),  // NumberOfColorPalette
    (pAM_ColorPalette)CustomColor,                  // ColorPalettes
    0,                                              // OptionFlag
    MEDIUM_FONT,                                    // DefaultFont
    1                                               // DefaultLineSpacing
};

//////////////////////////////////////////////////////////
// Text field parameter
//////////////////////////////////////////////////////////
static char EditBuf_A[15+1] = {""};
static const AM_EditParam EditParam_A = {
    15,                 // MaxDigits
    RGB_WHITE,          // Cursor foregraund Color
    RGB_BLUE,           // Cursor backgraund Color
    RGB_WHITE,          // Shift mode foregraund Color
    RGB_BLUE,           // Shift mode backgraund Color
    AM_EDIT_DISABLE_TEXT_EDIT | AM_EDIT_MOVE_CURSOR_BY_Q1Q2 | AM_EDIT_DISALLOW_ALPHA,    // EditOption
    NULL,               // alphaCandidateTable
    EditBuf_A,          // Value
    sizeof(EditBuf_A)  // ValueBufSize
};

static char EditBuf_B[15+1] = {""};
static const AM_EditParam EditParam_B = {
    15,                 // MaxDigits
    RGB_WHITE,          // Cursor foregraund Color
    RGB_BLUE,           // Cursor backgraund Color
    RGB_WHITE,          // Shift mode foregraund Color
    RGB_BLUE,           // Shift mode backgraund Color
    AM_EDIT_DISABLE_TEXT_EDIT | AM_EDIT_MOVE_CURSOR_BY_Q1Q2 | AM_EDIT_DISALLOW_ALPHA,    // EditOption
    NULL,               // alphaCandidateTable
    EditBuf_B,          // Value
    sizeof(EditBuf_B)  // ValueBufSize
};

static char prev_EditBuf[15+1]; //for saving previous value.

//////////////////////////////////////////////////////////
// Definition of the menu items
//////////////////////////////////////////////////////////

// Item ID
enum _TASK_ITEM_ID {
    TASK_ID_FIELD_A = 1,
    TASK_ID_FIELD_B,
    TASK_ID_SCAN,
    TASK_ID_EXIT,
    TASK_ID_CANCEL,
    TASK_ID_APPLY,
};

// Table of the menu items
static const AM_MenuItem TaskMenuTable[] = {
//   itemID,          y,           x,          menuText,                Palette,   visible, enabled, selectable, showControl,   checked, font
    {0,               0,           0,          "Sample task",           PX_TITLE,  true,    true,    false,      AM_TITLE_LINE, false,   MEDIUM_FONT},
    {0,               AM_PIX(16),  1,          "Field A:",              PX_BASE,   true,    true,    false,      AM_NO_CONTROL},
    {TASK_ID_FIELD_A, AM_PIX(29),  1,          (void *)&EditParam_A,   PX_INPUT,  true,    true,    true,       AM_TEXT_EDIT,  false,   LARGE_FONT},
    {0,               AM_PIX(50),  1,          "Field B:",              PX_BASE,   true,    true,    false,      AM_NO_CONTROL},
    {TASK_ID_FIELD_B, AM_PIX(63),  1,          (void *)&EditParam_B,   PX_INPUT,  true,    true,    true,       AM_TEXT_EDIT,  false,   LARGE_FONT},
    {TASK_ID_SCAN,    AM_PIX(114), 0,          "Read barcode",          PX_GUIDE,  true,    true,    false,      AM_SCAN_ICON},
    {TASK_ID_EXIT,    AM_PIX(129), 0,          "Exit",                  PX_GUIDE,  true,    true,    false,      AM_CLEAR_ICON},
    {TASK_ID_CANCEL,  AM_PIX(129), 0,          "Cancel",                PX_GUIDE,  false,   true,    false,      AM_CLEAR_ICON},
    {TASK_ID_APPLY,   AM_PIX(129), AM_PIX(64), "Apply",                 PX_APPLY,  false,   true,    false,      AM_ENT_ICON},
    {-1}
};


//////////////////////////////////////////////////////////
// main
//////////////////////////////////////////////////////////
void main(void)
{
    while(1){
        printf("\fPress ENT to start");
        while(1){
            if (kbhit()){
                if (getchar() == ENT_KEY){
                    task();
                    break;
                }
            }
            Idle();
        }

    }
}

//////////////////////////////////////////////////////////
// task
//////////////////////////////////////////////////////////
void task(void)
{
    bool nowEditing = false;
    MENU_HANDLE hMenu;
    int event;
    char barcodebuff[32];
    AM_BarcodeBuffer buffer;
    int selectedLine;

    memset(EditBuf_A,0,sizeof(EditBuf_A));
    memset(EditBuf_B,0,sizeof(EditBuf_A));

    hMenu = AM_CreateMenu(TaskMenuTable, (const pAM_Option)&TaskOption);

    buffer.dataBuf = barcodebuff;
    buffer.dataBufLength = sizeof(barcodebuff);
    // Set option commands
    //  B0:  Disable all symbology
    //  B2:  Enable CODE39
    //  R4:  Enable EAN
    AM_ConfigBarcodeReader(hMenu, &buffer, "B0B2R4");

    AM_ShowMenu(hMenu, AM_SELECT_ANY_ID);
    AM_EnableBarcodeReader(hMenu);
    while(1){
        event = AM_ExecMenu(hMenu);
        selectedLine = AM_GetSelectedLine(hMenu);
        if (!nowEditing){
            //// Scan mode ////////////////////////////
            if (event == AMENU_BARCODE_READ){
                //Get barcode
                AM_DisableBarcodeReader(hMenu);
                AM_SetText(hMenu, selectedLine, barcodebuff);
                //Skip to the next field
                if (selectedLine == TASK_ID_FIELD_A){
                    AM_SelectLine(hMenu, TASK_ID_FIELD_B);
                }else if(selectedLine == TASK_ID_FIELD_B){
                    AM_SelectLine(hMenu, TASK_ID_FIELD_A);
                }
                AM_EnableBarcodeReader(hMenu);

            }else if((event >='0' && event<='9') || event == SHIFT_KEY){
                // Switching to the text edit mode
                AM_DisableBarcodeReader(hMenu);
                //Save current value for cancel
                strcpy(prev_EditBuf, AM_GetText(hMenu,selectedLine ));
                // Clear the text field
                AM_SetText(hMenu, selectedLine, "");
                // Push back the last key code
                ungetc(event, stdin);

                // Enable text edit
                AM_EnableTextEdit(hMenu, selectedLine);
                AM_SetPaletteIndex(hMenu, selectedLine, PX_EDIT);

                AM_SetVisibleRange(hMenu, TASK_ID_SCAN, TASK_ID_EXIT, false);
                AM_SetVisibleRange(hMenu, TASK_ID_CANCEL, TASK_ID_APPLY, true);
                nowEditing=true;

            }else if (event == CLR_KEY){
                //Exit
                break;
            }
        }else{
            //// Text edit mode ///////////////////////
            if (event == CLR_KEY || event == ENT_KEY){
                // Disable text edit
                AM_DisableTextEdit(hMenu, selectedLine);
                AM_SetPaletteIndex(hMenu, selectedLine, PX_INPUT);

                if (event == CLR_KEY){
                    //Restore previous value
                    AM_SetText(hMenu, selectedLine, prev_EditBuf);
                }else{
                    //ENT_KEY
                    //...
                    //Skip to the next field
                    if (selectedLine == TASK_ID_FIELD_A){
                        AM_SelectLine(hMenu, TASK_ID_FIELD_B);
                    }else if(selectedLine == TASK_ID_FIELD_B){
                        AM_SelectLine(hMenu, TASK_ID_FIELD_A);
                    }
                }
                // Back to scan mode
                AM_EnableBarcodeReader(hMenu);
                AM_SetVisibleRange(hMenu, TASK_ID_CANCEL, TASK_ID_APPLY, false);
                AM_SetVisibleRange(hMenu, TASK_ID_SCAN, TASK_ID_EXIT, true);
                nowEditing=false;
            }
        }
    }
    AM_DisableBarcodeReader(hMenu);

    AM_ReleaseMenu(hMenu);
    return;
}

関連事項

最終更新日:2021/07/03