コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

DSでかな漢字変換(4)

かな漢字変換ネタに飽きてきました。ただ、ちょっと、バージョンアップしたので書いておきます。
xmlで返ってくる変換候補について、全て選べるようにしました。

画面の写真です。

int HaitiSelect( int n, int page );

これは候補文字を表示する関数です。変換候補が表示画面内に納まりきらない場合には、今までは無視していましたが、pageという変数が実は表示ページを指定するもので、もともと関数の引数として用意していましたが、関数の中では使っていませんでした。今回、この機能を組み込みました。
関数の戻り値は、この候補が持っている最大ページです。

//**************************************************
//  候補文字の表示
//  最終ページを返す。
//**************************************************
int  HaitiSelect( int n, int page )
{
FILE *fp = NULL;
char tagData[256];
long posSegmentList;
int  ret;
int  ul;
int  x, y;
int  hf, haikei;
int  pagecnt = 0;

 //XMLファイルを開く
 fp = fpOpen( KANAKANJI_FOLDER, JIMSERVICE_XML, 0 ); 
 if( fp==NULL ){
  ShinoUpPrint( MainScreenA, (u8 *)JIMSERVICE_XML, RGB(31,0,0),RGB(0,0,0), 1,RGB(0,0,0) );
  ShinoUpPrint( MainScreenA, (u8 *)"↑がみつかりません", RGB(31,0,0), RGB( 0,0,0 ), 1, RGB( 0,0,0 ) );
  return( -1 );
 }

 xmlReadMojiCode( fp );    //XMLデータの文字コードを取得する

 fseek( fp, 0, SEEK_SET );   //ファイルの先頭に

 ret = xmlTagTopFound( fp, '<' ); //最初のタグ開始位置までスキップ

 ret = xmlSearchLayerTag( fp, "ResultSet/Result/SegmentList", ftell(fp) );
 
 posSegmentList = ftell( fp );  //SegmentList開始位置退避

 fseek( fp, posSegmentList, SEEK_SET );  //SegmentList開始位置に復帰させる

 ret = xmlSearchTag( fp, "Segment", n+1 ); //(n+1)個目の"Segment"タグを探してその位置に移動する
 if( ret!=XML_TRUE ){ return( -1 ); }
 
 ret = xmlSearchTag( fp, "CandidateList", 1 );
 if( ret!=XML_TRUE ){ return( -1 ); }

 x = 0;
 y = 4;
 hf = 0;
 while( true ){
  ret = xmlGetValue( fp, (char*)"Candidate", tagData, 256, ftell(fp) );
  if( ret!=XML_TRUE ){ break; }
   
  UTF82SJIS( (unsigned char*)tagData, 255 );
  
  ul = strlen( tagData );  //文字の長さ
  if( ul+x>28 ){
   x = 0;
   y -= 1;
  }
  if( hf==0 ){
   haikei = RGB(31,31,10);
   hf = 1;
  }
  else{
   haikei = RGB(10,31,0);
   hf = 0;
  }
  
  if( y<0 ){
   y = 4;
   pagecnt++;
  }
  
  if( page==pagecnt ){
   ShinoPrint( KeyScreen, 6*x, 14*y, (u8 *)tagData, RGB(0,0,0), haikei, 1 );
  }
  x += ul;
 }

 fclose( fp );
 
 return( pagecnt );
}

pageの指定がいくつであれ、全ての候補語を検索しているので、非常に効率の悪いプログラムになっています。

あとは、編集部分を少し変えました。かな漢字変換部分に何も入力されていなければ、下のメインの編集エリアの編集が有効となるように、if文に、&& kanaKan.Text[0]!=0 を追加しました。ソースは下記です。

//**************************************************
//  ラインエディットします
//**************************************************
int  LeditKanaKan( LineEditParam lineEdit, LineEditParam kanaKan )
{
int  keyCode;

 //1ラインの文字数は256文字以下
 if( lineEdit.ChaMojiSu>EDITMOJIMAX ){ lineEdit.ChaMojiSu = EDITMOJIMAX; }
 if( kanaKan.ChaMojiSu>EDITMOJIMAX ){ kanaKan.ChaMojiSu = EDITMOJIMAX; } //かな漢字変換エリア

 //表示可能文字数は2以上
 if( lineEdit.ChaDispNum<=2 ){ lineEdit.ChaDispNum = 2; }
 if( kanaKan.ChaDispNum<=2 ) { kanaKan.ChaDispNum = 2;  } //かな漢字変換エリア

 //指定の位置に文字を表示します(初期化します)
 LineEditSyokika( lineEdit );

 while( true ){
  //キー待ち
  keyCode = GetKeyPen();

  if( keyCode==0x1c ){
   //右カーソル:カーソルを右に動かす
   if( (SoftKeyboard&0x400)==0x400 && kanaKan.Text[0]!=0 ){ CursorRightMove( kanaKan ); }else{ CursorRightMove( lineEdit );}
  }
  else if( keyCode==0x1d ){
   //左カーソル:カーソルを左に動かす
   if( (SoftKeyboard&0x400)==0x400 && kanaKan.Text[0]!=0 ){ CursorLeftMove( kanaKan ); }else{ CursorLeftMove( lineEdit ); }
  }
  else if( keyCode==0x1e ){
   //上カーソル:カーソルを編集文字列の先頭に動かす
   if( (SoftKeyboard&0x400)==0x400 ){
    CursorUpMove( kanaKan );
   }
   else{
    SoftKeyboard |= 0x400;  //[漢]ボタンのオン
    KanButton( kanaKan );
    //CursorUpMove( lineEdit );
   }
  }
  else if( keyCode==0x1f ){
   //下カーソル:カーソルを編集文字列の最後に動かす
   if( (SoftKeyboard&0x400)==0x400 ){
    if( kanaKan.Text[0]!=0 ){
     //かな漢字変換
     callKanjiHenkan( lineEdit, kanaKan );
    }
    else{
     //かな漢字変換エリアを閉じる
     SoftKeyboard |= 0x400;  //ビットを1にして1でXORとると0になる
     SoftKeyboard ^= 0x400;  //[漢]ボタンのオフ
     KanButton( kanaKan );
    }
   }
   else{
    CursorDownMove( lineEdit );
   }
  }
  else if( keyCode==0xff ){
   //タッチペンがキー以外のところをタッチした
   if( (SoftKeyboard&0x400)==0x400 ){ OutAreaTouch( kanaKan ); }
   OutAreaTouch( lineEdit );
  }
  else if( keyCode==0x7f || keyCode==0x6 ){
   // [DEL] キーの処理
   if( (SoftKeyboard&0x400)==0x400 && kanaKan.Text[0]!=0 ){ DelText( kanaKan );   }else{ DelText( lineEdit );  }
  }
  else if( keyCode==0x8 || keyCode==0x2 ){
   // [BS] キーの処理
   if( (SoftKeyboard&0x400)==0x400 && kanaKan.Text[0]!=0 ){ BsText( kanaKan ); }else{ BsText( lineEdit ); }
  }
  else if( (keyCode>=0x20 && keyCode<=0x7e) || (keyCode>=0xa1 && keyCode<=0xdf) ){
   //1バイト文字を挿入します。
   if( (SoftKeyboard&0x400)==0x400 ){
    if( keyCode==0x20 ){
     //かな漢字変換する
     //かな漢字変換
//     callKanjiHenkan( kanaKan );
    }
    //半角文字はかな漢字変換エリアに入力不可とする
   }
   else{
    InsHankakuText( lineEdit, keyCode );
   }
  }
  else if( keyCode==0x5049 ){
   //[漢]ボタンが押された処理
   KanButton( kanaKan );
  }
  else if( keyCode==0x814A || keyCode==0x814B ){
   //濁点または半濁点が入力された
   if( (SoftKeyboard&0x400)==0x400 ){
    DakutenHandakuten( kanaKan, keyCode );
   }
   else{
    DakutenHandakuten( lineEdit, keyCode );
   }
  }
  else if( keyCode==0x8140 ){
   //全角スペースが押された処理
   if( (SoftKeyboard&0x400)==0x400 ){
    //[漢]ボタンが押されていてかな漢字変換エリアに文字があれば
    if( kanaKan.Text[0]!=0 ){
     //かな漢字変換
     callKanjiHenkan( lineEdit, kanaKan );
    }
   }
   else{
    InsZenkakuText( lineEdit, keyCode );
   }
  }
  else if( keyCode>=0x100 ){
   //2バイトキー入力を行います
   if( (SoftKeyboard&0x400)==0x400 ){
    InsZenkakuText( kanaKan, keyCode );
   }
   else{
    InsZenkakuText( lineEdit, keyCode );
   }
  }
  else if( keyCode==0x1 ){  //(A)ボタンの場合は編集終了
   if( (SoftKeyboard&0x400)==0x400 ){
    if( kanaKan.Text[0]==0 ){
     //かな漢字変換エリアを閉じる
     SoftKeyboard |= 0x400;  //ビットを1にして1でXORとると0になる
     SoftKeyboard ^= 0x400;  //[漢]ボタンのオフ
     KanButton( kanaKan );
     return( 0xd );
    }
    else{
     //かな漢字変換エリアの文字をメインテキストにコピー
     InsMainText( lineEdit, kanaKan );
     kanaKan.Text[0] = 0;
     *kanaKan.CurPosi = 0;
     KanButton( kanaKan ); //変換エリアの初期化
    }
   }
   else{
    return( 0x1 );
   }
  }
  else if( keyCode==0xd ){  //[Enter]ボタンの場合は編集終了
   if( (SoftKeyboard&0x400)==0x400 ){
    if( kanaKan.Text[0]==0 ){
     //かな漢字変換エリアを閉じる
     SoftKeyboard |= 0x400;  //ビットを1にして1でXORとると0になる
     SoftKeyboard ^= 0x400;  //[漢]ボタンのオフ
     KanButton( kanaKan );
     return( 0xd );
    }
    else{
     //かな漢字変換エリアの文字をメインテキストにコピー
     InsMainText( lineEdit, kanaKan );
     kanaKan.Text[0] = 0;
     *kanaKan.CurPosi = 0;
     KanButton( kanaKan ); //変換エリアの初期化
    }
   }
   else{
    return( 0xd );
   }
  }
  else if( keyCode==0x1b ){  //[ESC]ボタンの場合は編集終了
   return( 0x1b );
  }
  else if( keyCode==0x3 ){  //[START]ボタンの場合は編集終了
   return( 0x3 );
  }
  else if( keyCode==0x4 ){  //[SELECT]ボタンの場合は編集終了
   return( 0x4 );
  }
  else if( keyCode==0x5 ){  //[X]ボタンの場合は編集終了
   return( 0x5 );
  }
  //カーソル位置にカーソルを表示します
  DispCurLposi( lineEdit );
  if( (SoftKeyboard&0x400)==0x400 ){ DispCurLposi( kanaKan ); }
 }
}

新しいプログラムは、NDS Program Roomにアップしています。興味のある方はダウンロードしてみて下さい。

本当にやりたいことリスト

(ブログの終わりにやりたいことを書いておきたいと思います)

  • 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
  • Androidプログラム
  • Web系のプログラム