スタイルが csOwnerDrawFixed の TComboBox 子孫コンポーネントで「入力時に検索」動作を実装する正しい方法は何ですか?
2 に答える
- TTimer を使用します (timIncSearch と呼びましょう)。次のプロパティを (設計時に) 設定します。
間隔:=400; //経験的に発見 - Windows エクスプローラーで使用される遅延です
...そして、OnTimer で検索エンジンを記述します。ここの最初の行が timIncSearch.Enabled:=False; であることを確認してください。また、csOwnerDrawFixed を使用しているため、コントロールの再描画を強制する方がよいでしょう。
余談ですが、詳細をあまり教えてくれなかったので推測ですが、おそらく OnEnter および OnExit イベントをフックして、DropDown リストをカスタムで開いたり閉じたりする必要があります。(通常、これは AutoDropDown プロパティを適切に設定することによって実現されます)
- ComboBox.KeyPress に次のように記述します
with timIncSearch do
begin
Enabled:=False;
Enabled:=True;
end;
...ここでも注意してください。おそらく、#13 を個別に (または何でも) 処理するには、'case Key of' コンストラクトが必要です。
その他のヒント:
- 状況によっては、OnKeyDown をフックする必要があるかもしれません (BackSpace、Del、Arrows などの特殊なキーを処理したい場合 -キーが押されている間、イベントが繰り返されることを考慮して)および/または OnKeyUp (上記と同様の処理を行いたいが、キーボードのキーの自動リピート機能を考慮しない場合)。
最初に、「*my_string*」または「my_string*」機能が必要かどうかを決定する必要があります。つまり、文字列内を検索するか、最初から検索するかを決定します。それが分かったら、コンボ ボックスに入力されたすべての単語のインデックスを作成し、キーストロークごとに検索する必要があります。OnTimer の処理は正しいアプローチではないと思います。「OnChange」などを使用したいと思います。ソートされた (dupignore) TStringList を使用するか、ハッシュ テーブルを使用してインデックスを作成することができます (実装はあなた次第です)。アーキテクチャは、コンボに含めることができる文字列の最大数によって異なります。ハッシュ テーブルを使用できるよりも大きな数である場合 (複数のインデックスを指す 1 つのハッシュ カーディナル: 配列、TList...)