さて、久々にDelphiでプログラミングをしています。昨日など、一日中プログラミングに時間を割けるなんてなんて久しぶりだろう…。
さて、表題の通りListBoxやComboBoxにあるAutoCompliteプロパティ、これは説明の通り、キーを押していくことで、候補になる項目をあらかじめ表示する機能ですね、IEの4だったか、それをいれることでこういう機能が実装されたらしいので、てっきりこれもそれを使っていたのだと思いましたが…。どうやら違うようです。
まずListBoxですが、これ、いわゆるインクリメンタルサーチと同じ働きを実現できます。VCLソースのある方はTCustomListBox.KeyPressなんかみてもらうと分かりますけど、
素早くキーを入力した場合、その文字列とマッチする項目がリストにあるかどうか調べ(LB_FINDSTRINGを使う)、あればそこに移動…という流れです。ここまでだと完全マッチじゃないとダメなので、当然メンタルサーチなんてできやしないのですが…。
なんとというか、考えれば当たり前というか、仮想リストボックスの場合、DoFindData*1が呼び出され、そのインデックスに移動する仕組みになってます。
つまり、OnDataFindイベントで、AnsiStartsTextなどを使って前方一致するようにしておけば、インクリメンタルサーチ風になるということです*2。
まあ、リストボックスの中身が名前の昇順じゃないと意味がないのは言うまでもないですが、使いようによってはかなり便利かも。
コンボボックスもあんまりみてませんが、とりあえずIEの機能には頼らず全部自力で実現してるのは確かみたいですね、手が込んでるなあ…。
Kylixを作るとき、こういう作業が役に立ったみたいなことを、Borlandの人が言ってたそうですが、なるほどこれは、役に立ちそう。さすがDelphi、こう細かいところに手が込んでるところがいいですね(その反面細かくないところでバグがいくつかあるというのが残念です、直せないわけでもないだろうに…)。