全体的なアイデア: たとえば、Windows デスクトップでキーボードの「c」キーを押して、「Chrome」ショートカットに到達するまで模倣します。または、リストボックスを使用しているときは、リスト全体をスクロールする代わりに、必要な値の文字を押します。DBGridでこれを実行できるようにしたいので、文字を押すと、「名前列」の文字列の最初の文字が押されたキーと一致するというレコードにジャンプできます。
3 に答える
これは呼び出さincremental search
れ、Embarcadero CodeCentral のサイトに作成方法のサンプルがあります。DBGrid - Incremental search / filter
RRUZの回答に対するあなたのコメントについて:
私は TEdit なしで動作させようとしましたが、数時間後にあきらめました。しかし、私はあなたを落胆させたくありません。私もそのような解決策に興味があります。正確なユース ケースによっては、エントリを dbgrid にキャッチし、ルックアップをトリガーする非表示の TEdit に渡すだけで十分な場合があります。(私の場合、これでは十分ではありませんでした。)これを行うには、次のコードを使用して DBGrid1KeyPress メソッドを追加します。
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
msg: TWMKey;
begin
msg.CharCode := Ord(KEY);
PostMessage(Edit1.Handle, WM_CHAR, Ord(key), 0);
end;
また、グリッドのオプションから doEditing を削除し、場合によってはそれを ReadOnly に切り替える必要があります。
TEdit を画面に表示せずにこれを行う方法は、次のイベント スニペットを追加することです。次のコードは、以前 RRUZ によって参照された Embarcadero CodeCentral のコードの上で機能します。
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key=VK_BACK then
begin
Edit1.Text := copy(Edit1.Text,1,length(Edit1.Text)-1);
end;
end;
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if Key in ['a'..'z'] + ['A'..'Z'] then
begin
Edit1.Text := Edit1.Text + Key;
end;
end;
その後、編集ボックスを非表示に設定できます。必要なのは、リストに集中してキーを押すことだけです。