Mesoscopic Programming

タコさんプログラミング専門

ヌメロン製作講座第15回:棋譜データの入力処理

今回は棋譜データグリッドの入力処理の一部を実装します。
今回実装するのはコール&ジャッジの入力です。

  • 棋譜データ入力時の画面

  • 修正ソースファイル

Numer0n.h
Numer0n.cpp
main.h
main.cpp


今回の修正個所。

class Numer0n

  • 追加変数
  1. Record newRecord;
    • 新規棋譜データ追加用変数

作業用の変数なんで別にここに置く必要もないんですけど、イベント間でまたがって使うので関数ローカルにもできないしセル構造体のサイズ増やすのもグローバルにするのも嫌だしで、ここに置きました。

struct Player

  • 修正メソッド
  1. VOID Player :: Init( MoveID move )
    • 今回対応するのはコールだけなので、デフォルトのアイテム所持数をゼロにしました。

struct EditParam

  • 追加変数
  1. EditModeID mode;
    • 編集モード識別子

コールナンバーを入力したあと、同じセルに対してイート数とバイト数も入力しなければならないので、いま何を入力しているのか区別するために追加しました。

struct Cell

  • 追加メソッド
  1. BOOL GetRecordEditParam( EditParam & edit )
    • 棋譜データセル用編集パラメータ取得メソッド
  2. BOOL SetRecordEditData( EditParam & edit )
    • 棋譜データセル用編集パラメータ設定メソッド

BOOL Cell :: GetRecordEditParam()

コール&ジャッジデータの入力開始処理です。

BOOL Cell :: GetRecordEditParam( EditParam & edit )
{
    Record          & record    = numer0n.newRecord;
    ParamID         pid         = GetParamID();
    RecordCellID    rcid        = ( RecordCellID ) ( ( pid - PARAM_RECORD ) % MAX_RECORD_CELL );
    MoveID          move        = ( MoveID ) ( rcid - RECORD_CELL_FIRST );

    if ( cid == CELL_RECORD )
    {
        Message( _T( "棋譜データは編集できません" ) );
    }
    else if ( cid == CELL_CALL )
    {
        edit.top += height;

        if ( edit.mode == EDIT_BEGIN )
        {
            ZeroMemory( & record, sizeof record );

            record.move = move;
            record.did  = DATA_CALL;

            sprintf( edit.text, "%0*d", numer0n.maxColumn, record.call.number );

            edit.cid    = CELL_NUMBER;
            data        = edit.mode;

            return TRUE;
        }
        else if ( edit.mode == EDIT_EAT )
        {
            strcpy( edit.text, "0" );

            edit.cid    = CELL_UPDOWN;
            edit.max    = numer0n.maxColumn;
            data        = edit.mode;

            return TRUE;
        }
        else if ( edit.mode == EDIT_BYTE )
        {
            strcpy( edit.text, "0" );

            edit.cid    = CELL_UPDOWN;
            edit.max    = numer0n.maxColumn - record.call.eat;
            data        = edit.mode;

            return TRUE;
        }
    }
    else
    {
        Message( _T( "工事中です" ) );
    }

    return FALSE;
}

同じセルにコールナンバー、イート数、バイト数の3種類のデータを入力します。
現在何を入力しているかは edit.mode に保持してあります。
開始時は edit.mode == EDIT_BEGIN なのでコールナンバーを入力します。
コールナンバーの編集タイプは CELL_NUMBER 型なので edit.cid には CELL_NUMBER を設定します。
イート数とバイト数の編集タイプは CELL_UPDOWN 型なのです。
編集用のコントロールウィンドウがセルの真下に表示されるように、edit.top にセルの高さを追加しています。
入力中の値は numer0n.newRecord に保持してあります。

BOOL SetRecordEditData()

コール&ジャッジデータの入力終了処理です。

BOOL Cell :: SetRecordEditData( EditParam & edit )
{
    Record & record = numer0n.newRecord;

    if ( cid == CELL_CALL )
    {
        if ( edit.mode == EDIT_BEGIN )
        {
            record.call.number  = ( Number ) edit.pos;

            app.focus->OnEditBegin( EDIT_EAT );
        }
        else if ( edit.mode == EDIT_EAT )
        {
            record.call.eat     = ( Column ) edit.pos;

            app.focus->OnEditBegin( EDIT_BYTE );
        }
        else if ( edit.mode == EDIT_BYTE )
        {
            record.call.byte    = ( Column ) edit.pos;

            if ( numer0n.AddRecord( record ) )
            {
                app.focus->MakeGrid();
                app.focus->Invalidate();
                app.focus->SelectLast();

                return TRUE;
            }
        }
    }

    return FALSE;
}

edit.mode によりコール&ジャッジのどのパラメータを入力中なのか判定しています。
コールナンバーなら次はイート数の入力なので app.focus->OnEditBegin( EDIT_EAT ) をコールして引き続き編集処理を継続します。
同様にイート数なら次はバイト数という風に編集作業を継続します。
最後にバイト数の入力が終了した場合は numer0n.AddRecord( record ) をコールして棋譜データを追加します。
棋譜データを追加した場合は棋譜データグリッドの内容が変化するので新たにグリッドデータを作成して再表示させます。
そして最後尾のセルを選択することで自動的に次の入力セルを選択します。

  • 修正メソッド
  1. BOOL GetRecordText( PTCHAR text )
    • コール&ジャッジデータ表示を実装
  2. BOOL GetEditParam( EditParam & edit )
    • 棋譜データ編集パラメータ取得メソッド GetRecordEditParam() コールを追加
  3. BOOL SetEditData( EditParam & edit )
    • 棋譜データ設定メソッド SetRecordEditData() コールを追加

class Grid

  • 追加メソッド
  1. virtual VOID Invalidate()
    • グリッド再描画メソッド

次回は~です。