★どうやら回答者 No.5 さんの考えが近いようですね。
・FEP のような学習機能を実現するにはコンボボックスのデータ項目1つ1つに
インデックス番号(支店名コード)などを関連付けてセット(管理)します。
この関連付けは『CB_SETITEMDATA』というメッセージで行えます。
・その後、ユーザさんが選択したデータ項目を最上位に移動させます。
・移動はデータ項目と関連付けたインデックス番号(支店名コード)をペアで行います。
・移動は『選択位置の取得』→『選択位置の削除』→『先頭位置への挿入』という
3ステップが基本です。
・これで使用頻度が高い順に最上位にデータ項目が移っていきます。
これが学習機能ですね。
・下に簡単なサンプルを載せますが、C/C++ ですよ。
サンプル:初期設定(フォームに読み込ませる最初)
static LPCTSTR lpTable[] = { 文字列0番 … 文字列100番, NULL };
LPCTSTR *lpSeek = lpTable;
INT nIndex; ←インデックス番号(支店名コード)
for ( nIndex = 0 ; *lpSeek != NULL ; nIndex++ ){
SendMessage( Combo.hWnd, CB_INSERTSTRING, nIndex, *lpSeek ); ←データ項目(支店名・文字列)
SendMessage( Combo.hWnd, CB_SETITEMDATA, nIndex, nIndex ); ←インデックス番号を関連付ける
lpSeek++;
}
サンプル:学習機能(選択した項目を上位に移動)
TCHAR szBuffer[ 256 ]; ←文字列領域
INT nSelect; ←選択位置
INT nIndex; ←インデックス番号(支店名コード)
nSelect = SendMessage( Combo.hWnd, CB_GETCURSEL, 0, 0 ); ←選択位置の取得
nIndex = SendMessage( Combo.hWnd, CB_GETITEMDATA, nSelect, 0 ); ←選択位置のインデックス番号を取得
SendMessage( Combo.hWnd, CB_GETLBTEXT, nSelect, szBuffer ); ←選択位置の文字列取得
SendMessage( Combo.hWnd, CB_DELETESTRING, nSelect, 0 ); ←選択位置の削除
SendMessage( Combo.hWnd, CB_INSERTSTRING, 0, szBuffer ); ←先頭位置への挿入
SendMessage( Combo.hWnd, CB_SETITEMDATA, 0, nIndex ); ←先頭位置へインデックス番号を関連付ける
サンプル:項目位置取得(選択している項目のインデックス番号を取得)
INT nSelect; ←選択位置
INT nIndex; ←インデックス番号(支店名コード)
nSelect = SendMessage( Combo.hWnd, CB_GETCURSEL, 0, 0 ); ←選択位置の取得
nIndex = SendMessage( Combo.hWnd, CB_GETITEMDATA, nSelect, 0 ); ←選択位置のインデックス番号を取得
return( nIndex ); ←これがインデックス番号(支店名コード)になります
最後に:
・言葉での説明が難しいので C/C++ での実装例を交えました。
・上記の部分だけでは学習機能が不揮発性ですのでソフトを終了してしまうと、次の起動で初期化されて
しまいます。これを防ぐにはファイルへ使用頻度順のコンボボックスの『学習インデックス情報』を
保存します。また、次の起動にそのファイルを読み込んで使用頻度順に再現させる必要があります。
・まずは、上記の部分を組み込んで『学習機能』ぽいのを実感(体感?)してみて下さい。
・以上。一旦おわりにします。→また何かコメントを…。
お礼
danchorです。 早速のご教示ありがとうございます。 これが個々に設定出来れば作業の効率がグンと上がり、喜んでもらえそうです。 早速改訂して配布することにします。 ついでで申し訳ないのですが、確かこのドロップダウンリストに表示させる順番も変えれたような記憶があるのですが・・・。 すなわち何も指定しなかったときには5番目に表示されるがそれを1番上にして以降順番にでるようにみたいに。 でもそうすると1~4番目は後ろに廻る? それとも無視される?? すみません。 よろしくお願いいたします。