请问如何把内容加到 combobox 里,然后输入某文字时自动出相应的记录...类似IE浏览栏效果 ( 积分: 200 )

  • 主题发起人 主题发起人 dprj
  • 开始时间 开始时间
D

dprj

Unregistered / Unconfirmed
GUEST, unregistred user!
1:先加 数据:
var i:integer;

begin
ComboBox2.Items.Clear;
ADOQuery3.Close;
ADOQuery3.SQL.Text:='select * from AAA';
ADOQuery3.Open;
if ADOQuery3.RecordCount>0 then
begin
ADOQuery3.First;
for i:=0 to ADOQuery3.RecordCount-1 do
begin
ComboBox2.Items.Add(ADOQuery3.FieldValues['名称']);
ADOQuery3.Next;
end;
end;
////例:加入了以下 内容
中国
美国
中部
美元
大中华
///
2:然后 在 ComboBox2 里输入 "中" 则 ComboBox2 自动弹出 3个内容"中国""中部""大中华
"...
然后 下箭头选择, ComboBox2.text 跟着 选择变化;

其实就是 IE 浏览器的效果...我们输入 一个相应网址时会弹出 相应的内容....

请问 如何实现呢? 或 有没有其它控件能实现....先谢谢了...顶者有分...
<原DFW论坛里旧资料均不能较好的解决,看有没有新方法...>
 
我也有类似的需要,想让用户在转入部分编码的时候,自动启用过滤。关注
 
关注中[:)][:)][:)][:)][:)][:)]
 
挺弱的问题
 
AutoComplete属性不够?
 
各位: 是 IE 浏览栏的效果啊.....


中国
美国
中部
美元
大中华
自动出 3个内容&quot;中国&quot;&quot;中部&quot;&quot;大中华....是对应的过滤...不是所有都出来....

请大家先试试 IE 的效果......................
 
抄别人的.
unit AutoListComboBox;

interface

uses
SysUtils, Classes, Controls, StdCtrls, Messages;

type
TAutoListComboBox = class(TComboBox)
private
{ Private declarations }
FText:String;
FAllStrings:TStrings; //用来保存所有的字符串
procedure SetStrings(const value:TStrings);
protected
{ Protected declarations }
procedure DoEnter;override; //覆盖事件 DoEnter,当控件获得焦点时,作一些初始化工作
procedure KeyPress(var Key:Char);override; //覆盖事件 KeyPress, 打开自动下拉列表
procedure Change;override; //当用户键入字符导致Text变化时,改变Items包含的字符串
public
{ Public declarations }
constructor Create(AOwner:TComponent);override;
destructor Destroy;override;
published
{ Published declarations }
property AllStrings:TStrings read FAllStrings write SetStrings;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Zhuangquanmin', [TAutoListComboBox]);
end;

{ TAutoListComboBox }

//局部过程 PackStrings 用来去掉字符列表里面的重复项
procedure PackStrings(Strs:TStrings);
var
i:integer;
s:string;
begin
if Strs.Count=0 then
exit;
//将更新的操作放入BegindUpdate 和EndUpdate之间,可以避免TStrings的一些事件发生,从而提高处理速度
Strs.BeginUpdate;
with TStringList(Strs) do //这儿转化的目的是为了使用TStringList的排序功能
begin
Sort;
s:=Strings[0];
i:=1;
while i<Count do
begin
if s=Strings then
Delete(i)
else
begin
s:=Strings;
Inc(i);
end;
end;
end;
Strs.EndUpdate;
end;

procedure TAutoListComboBox.Change;
var
i,iSelStart:integer;
iWidth,MaxWidth,IndexMaxWidth:Integer;
begin
inherited Change;
if Text='' then
begin
Items.Assign(FAllStrings);
Exit;
end;
FText:=Text;
iSelStart:=SelStart;
Items.Clear;
MaxWidth:=0;
IndexMaxWidth:=-1;
for i := 0 to FAllStrings.Count - 1 do
if Pos(FText,FAllStrings)>0 then
begin
Items.Add(FAllStrings);
iWidth:=Length(FAllStrings);
if iWidth>MaxWidth then
begin
MaxWidth:=iWidth;
Inc(IndexMaxWidth,MaxWidth);
end;
end;

//改变列表项显示的长度,以便可以完全显示最长的字符串
Perform(CB_SETDROPPEDWIDTH,Canvas.TextWidth(Items[IndexMaxWidth])+10,0);
if not DroppedDown then
DroppedDown:=true;
Text:=FText;
SelStart:=iSelStart;
Self.AutoDropDown:=True;
end;

constructor TAutoListComboBox.Create(AOwner: TComponent);
begin
inherited;
AutoComplete:=false; //关闭其默认属性
FAllStrings:=TStringList.Create;
end;

destructor TAutoListComboBox.Destroy;
begin
FreeAndNil(FAllStrings);
inherited;
end;

procedure TAutoListComboBox.DoEnter;
begin
inherited;
if FAllStrings.Count<>0 then
PackStrings(FAllStrings)
else
FAllStrings.Assign(Items);
end;

procedure TAutoListComboBox.KeyPress(var Key: Char);
begin
//如果用户键入的不是一些控制键,如:Esc,回车,Ctrl+C/V/X 等就不打开自动下拉列表
if not(Ord(Key) in [27,13,3,22,24]) then
if not DroppedDown then
DroppedDown:=true;
inherited;
end;

procedure TAutoListComboBox.SetStrings(const value: TStrings);
begin
if Assigned(FAllStrings) then
FAllStrings.Assign(value)
else
FAllStrings:=value;
end;

end.
 
你可以使用cxlookupcombobox这个控件
我也是最近刚刚使用的,功能非常强大
 
zqm7323567:的不错, 但 操作几次后下拉就出问题了;
即就算 item 有很多条,下拉都是 一条,然后旁边出个 上下箭头,只剩一条了,无法再拉开;
好像是 DropDownCount 的问题,估计可能某次操作 DropDownCount=1 ,然后再操作>1时 就只能 显示 1条了, 有没有方法把 下拉的内容拉开?

论坛老贴有类似问题,说 修改 AdjustDropDown ,但没说如何修改....

请问有知道如何解决的吗? ....
 
到这里去下载一个demo吧,很不错的哦。
http://www.delphibbs.com/keylife/iblog_show.asp?xid=29547
 
后退
顶部