小弟想做一个查询的小程序,想在用户在Edit中输入查询号码后,自动显示纪录,利用的是Table的Filter方法,把不是的纪录过滤掉,采用的是Edit的change事件,但问题出现了。    每次只能将查询号码粘贴入Edit中,从键盘中一个一个键入字符是不行的,而且本程序运行时只能查一条纪录。要查别的只能关闭重新开始程序(主要问题),我想是事件的问题,怎样才能任意此查询内容呢?大家给点意见好么?
这个时editChange的代码Table.Filter := '';
Table.Filtered := False;  //重新过滤      
Table.Filter := 'NAME='''+Edit.Text+'''';
Table.Filtered := True;
Table.Open;

解决方案 »

  1.   

    不放在editchange事件中处理这个过滤操作,而是响应某一个组合键的事件就可以了
      

  2.   

    你在Changed事件中处理这个事件是不行的,当你输入第一个字符时嵉个事件就触发了.用keydown或keypress事件可以这样做,判断一下键值就是,如#13是回车键.
      

  3.   

    最好在ONKEYPRESS中事件中,当输入回车后执行.if key=#13 then
      begin
       table1.active:=true;
       Table.Filtered :=true;
       Table.Filter := 'NAME='''+Edit.Text+'''';
      end;
      

  4.   

    to:steelbird
    你要找的只是一条记录,高效率的方法是:
    table1.Locate('Name',edit1.Text,[]);推荐用Query,通过SQL语句查询。
      

  5.   

    在ONKEYPRESS中事件中,   Table.Filter := 'NAME  like ''%'+Edit.Text+'%''';
      
    这样,每敲进一个字符,table都会响应的
      

  6.   

    改成keypress 事件
    判断回车时触发
    if key = #13
      

  7.   

    OnChange()事件肯定不行,用OnKeyPress()事件来判断#13回车键。
      

  8.   

    这个时editChange的代码
    if Length(edit.text)=代码长度 then //代码长度应该是固定数值
    begin
    Table.Filter := '';
    Table.Filtered := False;  //重新过滤      
    Table.Filter := 'NAME='''+Edit.Text+'''';
    Table.Filtered := True;
    Table.Open;
    end;
      

  9.   

    我知道楼主想实现什么样的效果,换一种做法,用TQuery控件,不用TTable.
    procedure TForm1.Edit1Change(Sender: TObject);
    var
      s:string;
    begin
      s:='select * from country';//country 换成你的Table名
      if Length(Trim(Edit1.Text))>0 then
        s:=s+' where NAME  like '''+Edit1.Text+'%''';
      with Query1 do
        begin
          Close;
          SQL.Clear;
          SQL.Add(s);
          Open;
        end;
    end;