我怎样才能得到一个 TDBLookupComboBox 来显示你正在输入的内容?

How can I get a TDBLookupComboBox to show what you are typing?

我的表格上有一个 TDBLookupComboBox

当我将光标放在其中并键入时,选择会跳转到我键入的内容(或尽可能接近)。

但是,我在字段中输入的内容没有得到任何指示。

TDBComboBoxTDBLookupComboBox 的执行方式类似,但是,当我在字段中键入时,我键入的字符出现在常规文本中,而选择的 'completion' 出现在 inverse/selected 跟随常规文本。

有什么方法可以让 TDBLookupComboBox 在这方面表现得像 TDBComboBox 吗?

不,你不能让 TDBLookupComboBox 像 TDBComboBox 一样工作(没有一点修改)。

问题是 TDBLookupComboBox 用于从另一个 table 中查找索引字段(通常是数字)。所选索引设置在目标字段中。当您制作 TDBLookupComboBox "editable"(如 TDBComboBox)时,您可以输入任何内容,甚至不在源中的值-table。这不应该发生(按设计)。在这种情况下,您会在目标字段中设置什么索引值?

您有多种选择。 您可以 "hack" TDBLookupComboBox 来覆盖绘制过程,以使用未选择(已键入)的文本覆盖所选文本。这是不容易的。特别是如果您想正确维护功能。但是这里有一些代码,我认为我已经接近你想要的了。虽然当输入不在查找数据集中的内容时,它不会再进一步​​。 (它也不考虑右对齐文本等):

type
  TDBLookupComboBox = class(DBCtrls.TDBLookupComboBox)
  protected
    procedure Paint; override;
    procedure KeyPress(var Key: Char); override;
  end;

type
  TForm1 = class(TForm)
    DBLookupComboBox1: TDBLookupComboBox;
//.....

procedure TDBLookupComboBox.Paint;
var
  TextPart: String;
begin
  inherited;
  Canvas.Font := Font;
  Canvas.Brush.Color := Color;
  // keeps case like the field is drawn
  TextPart := Copy(Text, 1, Length(SearchText));
  Canvas.TextOut(2, 2, TextPart);
end;

procedure TDBLookupComboBox.KeyPress(var Key: Char);
begin
  inherited;
  // we need this because paint is already called
  // we need to call it again to overwrite the text
  invalidate;
end;

它会覆盖表单顶部的 DBLookupComboBox。您不必将其编译成新组件。您可以使用 DBLookupComboBox 将其粘贴到您的表单中。我们需要在按键后再次调用 Paint(使用无效),因为在进入该例程之前已经调用了 paint。

另一种选择是使用 TDBComboBox。您可以在OnEnter中填写下拉项。

procedure TForm1.DBComboBox1Enter(Sender: TObject);
begin
  DBComboBox1.Items.Clear;
  IBQuery1.First;
  while not IBQuery1.EOF do
  begin
    DBComboBox1.Items.Add(IBQuery1.FieldByName('TESTFIELD').DisplayText);
    IBQuery1.Next;
  end;
end;

如果速度太慢(进入组合框时),您也可以在打开数据集时填充项目。

绝地图书馆的另外几个选项:

JvDBLookupCombo1
打字的时候直接有下拉。原始键入的文本保留在框中。

TJvDBSearchComboBox
也做你想做的,但没有连接到目标数据源。您需要在 OnExit 上自行设置所需的字段。