怎样在combobox中动态显示数据?(100分)

  • 主题发起人 主题发起人 shbjkl
  • 开始时间 开始时间
S

shbjkl

Unregistered / Unconfirmed
GUEST, unregistred user!
即在combobox中输入a即在数据库中检索出所有a 开头的数据加到combobox中,继续输入时如
输入ab再在数据库中检索出所有ab 开头的数据加到combobox中.要求没有重复的数据!
 
可在onChange中设置,用一个数据集控件来从数据库中取数。
With Dataset1 do
begin
Close;
CommandText:='select distinct 相应字段 from 表 where 相应字段 like '''+Combobox1.Text+'%''';
Open;
Combobox1.items.Clear;
while not eof do
begin
Combobox1.items.add(fieldbyname(相应字段).asstring);
next;
end;
close;
end;
 
以上方法不行,我试过了
 
这个很简单,不要做在OnChange事件里,因为那样会造成频繁读取数据库
内容,对性能影响很大。

可以在OnKeyPress事件是响应。如下代码:
if Key=#13 then
begin
if ClientNameComboBox.Items.Count=0 then
begin
try
with MainDataModule.FreeADOQuery do //查询
begin
Close;
SQL.Clear;
SQL.Add('select * from ClientName where 简写 like :find ');
if ClientSortCheckBox.Checked then //区分进出品客户名称
begin
SQL.Add('and 所属组别=:sort');
Parameters.ParamByName('sort').Value :=MainForm.MainStatusBar.Panels.Items[3].Text;
end;
Parameters.ParamByName('find').Value := '%'+ClientNameComboBox.Text+'%';
Open;
if RecordCount>0 then
begin
ClientNameComboBox.Items.Clear;
while not Eof do
begin
ClientNameComboBox.Items.Add(FieldByName('客户名称').AsString);
Next;
end;
end else begin
if MainForm.Mshowmessage('提示','该客户名称是新的或者没有类似的客户资料,是否保存至资料库?',2) then
begin
MainForm.N7Click(nil);
ClientManagerForm.SortComboBox.SetFocus;
ClientManagerForm.ClientNameEdit.Text := ClientNameComboBox.Text;
end else
BreedEdit.SetFocus;
end;
Close;
end;
except
MainForm.Mshowmessage('系统错误','读取客户名称资料库时失败!',1);
end;
end else
begin
BreedEdit.SetFocus;//跳转;
ClientNameComboBox.Items.Clear;
end;
end;
 
我是要动态显示,key=#13就不要了。
combobox1.items.clear;的时候把我的combobox1.text也清空了
我用的是flatcombobox 是不是它的问题,可以解决吗?
 
娃娃的应该合理点
 
用回车方法当然可以,我要的是动态显示。总不能让用户输入一个字就敲一下回车吧!
 
我不知道你究竟是做的什么程序,象你所说的要动态的话,你要考虑到程序以后
的扩充问题。这个很麻烦的。我以前也做过一个这样的动态选择客户的,谁知道
现在这个程序中的客户资料多了起来,然后那个动态选择就理所当然的慢的要命
了。

但是还有一个可能就是做股票分析软件,这种选择是必须的,因为所以的软件都
是这样如果你象我上面所说的那样做的话,可能会很麻烦。

费话一堆以后,说说我的解决方法:
1、首先可以肯定用ComboBox解决这个问题很麻烦。
2、我的方法是用Edit + ListBox.
3、ListBox平时隐藏,在Edit的OnChange事件时呈现。
4、根据Edit的text内容来读取数据库内容,然后添加至ListBox.(每次要Items.clear)
5、然后响应Edit的OnKeyDown事件,当Key= VK_DOWN时,就ListBox.SetFocus;
 
请教一下delphi ide 中是如何实现的
就是输入“.”后跳出的列表
我就是要 delphi 一样的功能
 
我觉得其实先把数据库中相关字段的内容先都加载到Combobox1中最好,免得频繁读取数据
库。输入前几位时可自动定位到相应的条目。代码可参照下面的代码:

private
selectItem:boolean;

procedure TForm1.FormShow(Sender: TObject);
begin
selectitem:=true;
With Dataset1 do
begin
Close;
CommandText:='select distinct 相应字段 from 表 where 相应字段 like '''+Combobox1.Text+'%''';
Open;
Combobox1.items.Clear;
while not eof do
begin
Combobox1.items.add(fieldbyname(相应字段).asstring);
next;
end;
close;
end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var sinput, sselected : string;
i, j : integer;
begin
j := 0;
if not selectitem then
begin
selectitem := true;
exit;
end;
sinput := copy((Sender as Tcombobox).text, 1, (Sender as Tcombobox).SelStart);
for i := 0 to (Sender as Tcombobox).items.count - 1 do
if copy((Sender as Tcombobox).items, 1, length(sinput)) = sinput then
begin
if j = 0 then sselected := (Sender as Tcombobox).items;
j := j + 1;
end;
if j > 0 then (Sender as Tcombobox).Text := sselected
else (Sender as Tcombobox).Text := sinput;
(Sender as Tcombobox).SelStart := length(sinput);
(Sender as Tcombobox).SelLength := length((Sender as Tcombobox).text) - length(sinput);
end;

procedure TForm1.ComboBox1KeyPress(Sender: TObject
var Key: Char);
begin
if key=#8 then selectitem:=false
else if key=#13 then selectNext(ActiveControl,true,true)
else (Sender as TCombobox).droppedDown:=true;
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
(Sender as TCombobox).DroppedDown:=false;
end;

 
是不是象金山词霸那样?
用edit和listbox组合代替combox(自己控制listbox的显示。也可以用combox和listbox
组合或者其他组合)
 
对头,就是那样。
至于说数据保存到什么地方,怎么优化你就怎么发挥吧。
 
多人接受答案了。
 
后退
顶部