已知界面如下:
  □CheckBox1  ComboBox1(等于、不等于)  Edit1
  □CheckBox2  ComboBox2(等于、不等于)  Edit2
  …………
  …………
  若干项!
当选中CheckBox1 则 s := CheckBox1.Caption + ComboBox1.Items[ComboBox1.ItemIndex] + '=' + Edit1.text;当选中若干项时,用And连接~各位一般怎么处理?或者用存储过程也行?给出代码!谢谢~

解决方案 »

  1.   

    procedure TAPubFilterForm.BitBtn1Click(Sender: TObject);
    var i:integer;
        str_xor,str_value,str_c,str_f:string;
    begin
      WhereNewStr:='';
      if b_no>0 then
      with stringgrid1 do
      begin
        for i:=1 to rowcount-1 do
        begin
          if cells[0,i]='且' then str_c:=' and '
          else str_c:=' or ';
          str_xor:=cells[2,i];
          str_f:=f_field(cells[1,i]);
          str_xor:=chntoen(str_xor);
          if (str_xor=' like ') or (str_xor=' not like ')  then
            str_value:='%'+cells[3,i]+'%'
          else if str_xor='% like ' then
            begin
              str_value:=cells[3,i]+'%';
              str_xor:=' like ';
            end
          else if str_xor=' like %' then
            begin
              str_value:='%'+cells[3,i];
              str_xor:=' like ';
            end
          else str_value:=cells[3,i];
          if i=1 then WhereNewStr:=str_f+str_xor+''''+str_value+''''
          else WhereNewStr:=WhereNewStr+str_c+str_f+str_xor+''''+str_value+'''';
        end;
      end;
      //showmessage(WhereNewStr);
    end;
      

  2.   

    1 用compent数组进行循环
    2 将checkbox和edit做成控件数组,
      

  3.   

    把s声明成全局变量,把ComboBox1、2、3...的Tag值设置为1、2、3...然后建立一个过程
    procedure OnAdd(Sender :TObject);
    var
      tmp :string;
    begin
      tmp := TComboBox(FindComponent('ComboBox' + IntToStr(TCheckBox(Sender).Tag))).Items[ComboBox1.ItemIndex] + TEdit(FindComponent('Edit' + IntToStr(TCheckBox(Sender).Tag))).Text;
    if s = '' then
      s :=TCheckBox(Sender).Caption + tmp
    else
      s :='And' + TCheckBox(Sender).Caption + tmp;
    end;
    最后把每个CheckBox1的OnClick事件关联到这个过程
      

  4.   

    和你有点类似,看看 //如果选择日期,加入日期条件
       if cbbdate.Checked =true then
          StrSql:=StrSql+'and sfdate between '+'#'+datetostr(dtpsfdate.Date)+
                  '#'+' and '+'#'+datetostr(dtpsfend.Date)+'#';
       //如果选择客户
       if cbkh1.Checked=true then
        begin      
          StrSql:=StrSql+'and khdm='''+adofind.fieldbyname('khdm').AsString+'''';
        end;
        //如果选择表名
        if cbbm1.Checked=true then
        begin    
          StrSql:=StrSql+'and khbh='''+adofind.fieldbyname('khbh').AsString+'''';
        end;
        //如果选择收费员
        if cbsfy1.Checked=true then
        begin      
          StrSql:=StrSql+'and yff='''+adofind.fieldbyname('czybm').AsString+'''';
        end;
        //如果选择开票员
        if cbkpy1.Checked=true then
        begin
                StrSql:=StrSql+'and ykp='''+adofind.fieldbyname('czybm').AsString+'''';
        end;
        //开始查找数据
        StrSql:=copy(StrSql,5,255);
        if StrSql='' then
          begin
             showmessage('请选择一个查询条件,在其前面打钩即可');
             exit;
          end;
        with dmmain.ADOQCfsf do
           begin
             sql.Clear;
             sql.Add('select * from cfff where');
             sql.Add(StrSql);
             open;
           end;
      

  5.   

    To Linux2001:
      调不通呀!晕~~
      

  6.   

    同意firetoucher的方法,用数组效率要高的多,不断访问控件会很大程度上延长程序运行时间
      

  7.   

    To cow8063:
      你的程序一定有问题!不够健壮!  如果前边的CheckBox我都不选,只选中间的一项为真,你的程序就出错了!
      

  8.   

    再To cow8063:
      不好意思,刚才看错了!~没有留意到你的Copy!可以得到我想要的结果!感谢!~
    不过,我想求更为精简的方法!
    为此,我重载了QrySelect方法!但是代码太长了!~这里紧紧两个CheckBox就这么长的代码!
    不知各位有没有更为完美的做法?procedure TForm5.QrySelect(s, s1, s2, s3: String; i, i1: Integer);
    var
      sign, sign1: String;
    begin
      case i of
        0:
        begin
          sign := '=';
        end;
        1:
        begin
          sign := '<>';
        end;
        2:
        begin
          sign := 'like';
        end;
      end;  case i1 of
        0:
        begin
          sign1 := '=';
        end;
        1:
        begin
          sign1 := '<>';
        end;
        2:
        begin
          sign1 := 'like';
        end;
      end;  ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add('select empid as "用户名", empname as "姓名", empqx as "权限"  from employee where');
      if i <> 2 then
      begin
        ADOQuery1.SQL.Add(s + sign + '''' + s1 + '''');
      end
      else
      begin
        ADOQuery1.SQL.Add(s + ' ' +sign + '''' + s1 + '%''')
      end;
      if i1 <> 2 then
      begin
        ADOQuery1.SQL.Add('and ' + s2 + sign1 + '''' + s3 + '''');
      end
      else
      begin
        ADOQuery1.SQL.Add('and ' + s2 + ' ' + sign1 + '''' + s3 + '%''');
      end;
      ADOQuery1.Open;
    end;