如何将键盘虚拟按钮发送到TDBLookupComboBox或类似按钮?

问题描述:

我必须将许多Excell文件(转换为CSV)转换为我的应用程序的数据库布局。如何将键盘虚拟按钮发送到TDBLookupComboBox或类似按钮?

在我的表中有一些字段为其他表列表使用外键,当我的转换代码找到这样的字段时,它没有外部标识符,但在Excell上键入的简单文本。

我发现目前最好的方法是插入一个新的行,重点是TDBLookupComboBox字段,然后通过SO发送消息来模拟我输入文本。 ComboBoxautocomplete功能将在外国列表中选择正确的项目。

如果这是最好的方法,我该怎么做?使用Delphi 2006和Firebird发送这些键盘消息?

+3

为什么您的用户界面与自动导入过程有任何关系?您不应该使用GUI组件的密钥处理来做这种事情 - 您应该自己在查询代码中进行查找。您可能必须在WHERE子句中使用'LIKE',但使用GUI控件的自动完成来找到匹配不是解决方案。 GUI控件应该用于**用户界面**(GUI的* UI *部分),而不是替代实际的查询功能。 – 2012-08-17 04:36:36

+1

史诗不好主意。像这样的东西给了“Delphi程序员”一个坏名字。 – 2012-08-17 12:37:42

+0

我必须同意肯和沃伦。当用作流量控制而不是用户界面时,模拟键击或鼠标点击是一个非常糟糕的解决方案。考虑一种替代设计。 – 2012-08-17 12:49:34

而不是“模拟”一个用户,你应该做的是组件做的代码。它使用TDataSet.Locate方法来查找部分字符串并将DataSet游标设置为找到的记录。然后它使用查找源来获取值。

var 
    SearchString: string; 
begin 
    SearchString := 'Dat'; 
    if LookupDataSet.Locate('MySearchField', SearchString, [loCaseInsensitive, loPartialKey]) then 
    begin 
    DestDataSet.Edit; 
    DestDataSet.FieldByName('FLD_ID').AsInteger := LookupDataSet.FieldByName('FLD_ID').AsInteger; 
    // DestDataSet.Post; 
    end 
    else 
    raise Exception.CreateFmt('Lookup value not found for "%s"', [SearchString]); 
end;