1

总体思路:模仿例如,在 Windows 桌面上按键盘上的“c”键,直到进入“Chrome”快捷方式。或者在使用列表框时,按所需值的字母而不是滚动整个列表。我希望能够为 DBGrid 执行此操作,因此我可以按一个字母跳转到“名称列”字符串的第一个字符与按下的键匹配的记录。

4

3 回答 3

1

这被称为incremental searchEmbarcadero CodeCentral 站点中存在如何创建一个示例DBGrid - Incremental search / filter

于 2013-06-06T18:08:02.387 回答
0

重新评论您对 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。

于 2013-06-07T08:44:15.540 回答
0

一种不让 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;

然后,您可以将编辑框设置为不可见。您所需要的只是专注于列表并按下按键。

于 2014-01-21T08:42:57.373 回答