TEdit类的控件能实现AutoComplete吗?(50分)

  • 主题发起人 主题发起人 一个过客
  • 开始时间 开始时间

一个过客

Unregistered / Unconfirmed
GUEST, unregistred user!
就像网页里面的input框,可以保存输入过的信息,自动下拉一个列表?

或者如果能够把ComboBox改装一下,取消那个下拉箭头也可以。总之要Edit样式的。
 
怎么个“可以”??
说个所以然出来啊!!
 
自已写不就行了
当然可以了
用tedit + listbox 就可以了
 
也就是说,windows内置是不支持edit的autocomplete效果的,只有自己写?
 
网页里面的输入框为什么就可以?
 
网页中是因为有关的信息己经放在了注册表中了。
如果自己要写的话,也来一个注册表中保存信息或保存在文件上吧。
 
有意思。你们回答问题的方式很有意思。

我问的是怎样用TEdit实现下拉效果
 
//或者如果能够把ComboBox改装一下,取消那个下拉箭头也可以。总之要Edit样式的。
//看看下面的控件,是不是就是这样?
//把AutoDropDown属性设成True就可以了
//还有Style属性不能为csSimple
unit ComBoBoxIE;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls;

type
TComBoBoxIE = class(TComBoBox)
private
{ Private declarations }
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Mr.Nono', [TComBoBoxIE]);
end;

{ TComBoBoxIE }

procedure TComBoBoxIE.WMPaint(var Message: TWMPaint);
var
C: TControlCanvas;
R: TRect;
begin
inherited;
C := TControlCanvas.Create;
C.Control := Self;
C.Brush.Color := Self.Color;

R := ClientRect;
InflateRect(R, -2, -2);
C.FrameRect(R);

SetWindowPos(FEditHandle, HWND_BOTTOM, 0, 0, Width - 5, Height - 5, SWP_NOMOVE);

C.Free;
end;

end.
 
不错不错,已经很不错了,就差不能调整大小了,能否给下拉列表加上调整大小的功能?
如果麻烦就算了。

另外,我用其他控件(TEdit,TPanel,TListbox,TScrollBar等)聚合起来写了一个这样的
控件,样式几乎和网页里面的功能一模一样,可以调整大小的,可是有一个致命的弱点,
就是我模拟弹出的下拉列表(实际上是一个TPanel放一个TListbox)不能超出所在的窗口,
可是TComboBox的列表就可以,我想是因为我的TPanel属于所在窗口把。如果哪位大哥能
解决这个问题,我另有100分奉上,并且公布源代码。
测试方法很简单,只要能够在主窗口里面弹出一个TPanel之类的容器类的东东,这个东东
能够伸出主窗口就行,就像TComboBox的下拉列表那样。

这个问题分数基本上属于独帅了,还请独兄继续考虑你的TComboBoxIE。

最后,我查阅了MSDN,上面说在IE5.0以上,Edit类是可以自动下拉的,用一个ShAutoComplete
即可,而且在IE&Delphi站点上的那个IEAddress控件,实际上用的就是这个函数,可是
我用SHAutoComplete在TEdit上面始终不成功!如果那位解决这个问题也有另外100分奉送!!

 
呵呵,那用这么麻烦,其实“自动完成”是Windows提供的一个接口,只要你的TEdit在系统中
注册,并提供对应的选值列表,TEdit就可以出现网页中的效果,并且可以自动查找。

在HubDog兄的《Delphi深度探索》中对此有详细的介绍,过客兄买一本吧,书上对OLE等问题
也有比较精彩的论述。

或者留个Mail,我把书中AutoComplete的例子发给你。
(程序不长,但接口的申明比较复杂,就不贴了。)
 
yggk@21cn.com
发过来把,看看先。
 
//ShAutoComplete确实有这个功能,看看下面的例子(窗口上只有一个Edit和一个Button)
//不过我只能在自己的浏览器中使用它,
//因为它的列表框的内容就是IE地址栏的列表框的内容,不知道怎样自定义其中的内容
//至于我的TComBoBoxIE,我在试试[:)]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, Forms,
Dialogs, StdCtrls, ActiveX;

const
SHACF_DEFAULT = $00000000;
SHACF_FILESYSTEM = $00000001;
SHACF_URLHISTORY = $00000002;
SHACF_URLMRU = $00000004;
SHACF_URLALL = SHACF_URLHISTORY or SHACF_URLMRU;
SHACF_USETAB = $00000008;
SHACF_FILESYS_ONLY = $00000010;
SHACF_AUTOSUGGEST_FORCE_ON= $10000000;
SHACF_AUTOSUGGEST_FORCE_OFF = $20000000;
SHACF_AUTOAPPEND_FORCE_ON = $40000000;
SHACF_AUTOAPPEND_FORCE_OFF= $80000000;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
function SHAutoComplete(hWnd: HWND; dwFlags: DWORD): LRESULT; stdcall;

implementation

function SHAutoComplete; external 'shlwapi.dll' name 'SHAutoComplete';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Edit1.Text);
Edit1.Text := '';
end;

procedure TForm1.FormCreate(Sender: TObject);
var
ret: Integer;
begin
ret := SHAutoComplete(Edit1.Handle, SHACF_DEFAULT);
//ShowMessage(IntToStr(ret));//如果这里返回0,则表示调用SHAutoComplete成功了。
end;

initialization
Oleinitialize(nil);

finalization
OleUninitialize;
end.
 
不错不错,如果能自定义下拉列表就圆满了。

我记得在MSDN网站看过SHAutoComplete的介绍,我看看去。
 
而且我知道为什么我以前用SHAutoComplete不成功,是因为没有上面的最后几句代码
 
就是就是,如果能够自定义下拉列表就圆满了(FLG?)。
 
ComBoBox是由一个Edit和一个ListBox(当然还有其他的东西)来实现的,所以要调整其下拉列表可能比较困难;
而IE里面的输入框不太一样,他的下拉框左边是一个ListView,右面是一个ScrollBar,我想可以试试这种方式
 
收到杜宝的代码,确实实现了我要的效果,美中不足的是,如果做成控件就不灵,似乎是
相关代码必须在form创建以后执行才管用,不过已经很不错了。

另外也十分感谢独帅兄的帮助!另外50分到这里来拿:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1375024

杜宝到外面来拿分。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1375020
 
我看了AutoComplete的例子了,确实很好,开了开眼界,我也想把它做成控件,那样用起来就方便了
50分送给杜宝兄吧,或者你把它送给做成控件的高手也行[:)]
我就不要了[8D]
 
后退
顶部