如何获得TDBLookupComboBox以显示您正在键入的内容



我的表单上有一个TDBLookupComboBox

当我把光标放进去并键入时,所选内容会跳转到我键入的内容(或尽可能接近)。

然而,我没有得到任何迹象表明我在字段中键入了什么。

TDBComboBox的执行方式与TDBLookupComboBox类似,但是,当我在字段中键入时,我键入的字符将显示在正文本中,并且选择的"完成"将显示在反文本/正文本后面的selected中。

有没有办法让TDBLookupComboBox在这方面表现得像TDBComboBox

不,你不能让TDBLookupComboBox像TDBComboBox一样工作(如果没有一点黑客攻击)。

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

你有几个选择。您可以"破解"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上自己设置所需的字段。

相关内容

  • 没有找到相关文章

最新更新