现在我在开发时遇上这样一个问题:我需要在TDBEdit或是TEdit控件能记忆式录入内容,就象在网页中的自动完成功能一样.比如:我以前录入过abcde,abcdefg,我只要录入a,下面会自动列出abcde,abcdefg来供选择!其实我在其他地方看到过这样的文章,只是当时没有在意,现在想找到这方面的文章都不行了.当时好象是这样说的:需要IE5.0的支持,从COM中引出一个函数.哪位有详细的过程,一定给重分啊!

解决方案 »

  1.   

    To  linzhisong(無聊) :
       写注册表啊?那要写多少啊?而且还要分类写啊.好象我这样大手笔给分的不多啊,期待大侠啊!
      

  2.   

    tdbedit, 麻烦点儿,怎么着也得把那个录入过的内容记下来吧
    曾经看过类似的,不过是用combobox
      

  3.   

    yczyk (有鬼:兄弟会) 
    如果会fontain()提出的combobox方法,则可以使用一个不可见的combobox记录以前录入的数据,在edit的change中通过向combobox传递输入值...
      

  4.   

    分类写???什么意思,ie的原理也是写注册表阿,如果你不愿意,你可以自己写文件保存一样的阿,你可以继承自TDBEdit或者TEdit自己写一个控件或者类,这样你以后就不用每一个都写代码,如果将类名或者你自己在初始化自动健子键或者文件你就不用为分类或者各个edit混淆苦恼了.
      

  5.   

    为 TEdit 添加 IE 的地址自动完成功能
    自动补全文件路径和名称。 function SHAutoComplete(h:hwnd;f:dword):dword;stdcall;external  'Shlwapi.dll';
    procedure TForm1.Button1Click(Sender: TObject);begin  SHAutoComplete(Edit1.Handle,0);end;
      

  6.   

    To :things(平)   有道理,就是麻烦了点!值的考虑!
    firetoucher(风焱) :  我说的分类是指象IE一样,凡是输入姓名的地方只会把以前输入过的名字列出来,输入证件的地方只会把以前的录入过证件数据列出来人.那写注册表不是要好多吗?如果IE是那样实现的(好象也是),它是写的那些值啊?lion_lh(xmanx) :  这段代码我试过,没有用啊!
      

  7.   

    我觉得对每个EDIT都绑定一个TSTRING来记忆每次输入,如果输入的话就从这个TSTRING里找
    对应的
      

  8.   

    最好是自己在写个类来重新封装一下EDIT或者DBEDIT
      

  9.   

    存到数据库里就可以了,我作数据库程序向来都用Tedit.
    edit的显示内容是自己维护的,稍加改动即可实现,搂住所说功能!Tedit的KeyDown事件
    procedure Trydafrm.jkzkKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
     if key=40 then
       begin
         selectfrm.Left:=self.Left+jkzk.Left+4;
         selectfrm.Top:=self.Top+jkzk.Top+20+jkzk.Height;
         selectfrm.Width:=jkzk.Width;
         jkzk.Text:=selectfrm.selectitem('lib_健康状况','健康状况',false,jkzk.Text);
       end;
    end;
    //selectfrm的全部代码unit select;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, Grids, DBGrids, ADODB, Menus, StdCtrls;type
      Tselectfrm = class(TForm)
        ADODataSet1: TADODataSet;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure DBGrid1DblClick(Sender: TObject);
        function selectitem(tabname:string;fieldname:string;bm:boolean;text:string):string ;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      selectfrm: Tselectfrm;implementation
    uses datau;
    {$R *.dfm}procedure Tselectfrm.DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if (key=13) then
       begin
         if adodataset1.RecordCount>0 then self.Tag:=1 else self.Tag:=0;
         self.Close;
       end;
    if key=27 then
       begin
         self.Tag:=0;
         self.Close;
       end;
    end;procedure Tselectfrm.DBGrid1DblClick(Sender: TObject);
    begin      self.Close;
    end;
    function Tselectfrm.selectitem(tabname:string;fieldname:string;bm:boolean;text:string):string ;
    begin
    with ADODataSet1 do
       begin
         Close;
         CommandText:='select '+fieldname+' from '+tabname+' where '+fieldname+' like ''%'+text+'%''';
         if bm then CommandText:=CommandText+' or 编码 like ''%'+text+'%''';
         open;
         selectfrm.ShowModal;
         if self.Tag=1 then Result:=fieldbyname(fieldname).AsString
            else Result:=text;
         close;
       end;
    end;
    end.'lib_健康状况'表的结构ID int 4 0
    健康状况 varchar 50 1可增加“编码“字段,到时输入编码即可自动显示
      

  10.   

    selectfrm是一个通用的模块,我所有的程序都用它
      

  11.   

    用得着这么麻烦么?想要自动关联先前的数据,就必须有一个地方存储这些记录。这是不可否认的。用注册表也好,用Ini文件也好等等,都是一种实现的方法。无所谓在那里存储。有人说从Edit继承过来,我不是很赞同这种想法。ComboBox的自动完成功能大家都见过(ComboBox.AutoComplete := true  //this is default value),也知道只要设置ComboBox.style = csSimple就可以得到Edit的样式。那其实我们要做的事情就是两个。
    1:有数据输入的时候,判断是否是新纪录。如果是,记录下来。
    2:程序启动时,动态的加载这些记录在Combobox的Item中。
      

  12.   

    呵呵,谢谢各位的解答.听了各位的发言,真是受益非前啊!现在,关键问题不在于怎么去查找值了,而是怎么去存储那些输入过的值了.
    方法1,存在注册表里,IE的自动完成好象是这样做的;
    方法2,自己写一个文件,好象挺麻烦的;
    方法3,写在数据库里,嗯,好象行的通.其实这些方案与我当初的设想都不同.当初我提这个问时,是想是不是有这么一个COM服务程序提供了这么一个接口.之所以有这样的想法,也是由于看到了和lion_lh(xmanx)一样的代码,联想到自己用IE时自动完成也确实省了不少的事.可是那段代码行不通,令我好失望啊.大家提的这些方法不现程度上加大了复杂度了!
      

  13.   

    我觉得肯定没有必要动用数据库吧,这样不显得累赘啊~而且影响速度~增加不必要的控件~
    注册表也不好,因为要是有很多项写注册表也不怎么好~写在一个text文件里面,一行一个纪录,程序启动的时候动态加载到combobox中~哪怕是几千行,对于txt文件操作,效率也是很高的~其实实现也就几行代码~
      

  14.   

    我偏向于使用数据库来解决这个问题。如果要保存的历史记录很多,还是比较容易实现的。如果记录比较少。我还是同意楼上兄弟的看法。用TXT文件。至于用组件。我觉得应该可行。我一直有这样的观点:你想得到的,BOLAND的那些人就考虑得到。只是我们自己不会用而已。
      

  15.   

    将记录存到数据库,
    开始输入时从数据库中取出,
    在输入后你可以用tdataset的locate方法
      

  16.   

    COOKIES不就是一个很好的例子么
      

  17.   

    delphi_xizhousheng(西周生) :  请继续讲啊!
      

  18.   

    hehe
    存到文件里面吧然后用edit.onchange的事件,搜索出来,
    然后动态产生一个listbox,显示那些搜索出来的结果呵呵~不知道行不行》?
      

  19.   

    用一个TList,在建立一个结构
    type
      TNote=record
        Text:string;
        ControlName:string;
    end;
    自己记录