我用一个combobox1让用户选择要查询的字段,另外combobox2让用户输入选择字段值,也可输入内容.combobox2是用adoquery遍历了数据库的该字段所有不空值.
但是客户输入时有点问题:
假设数据库中:张三,张四
用户输入"张":张三就自己出来了,要查张四的话得修改查询信息,这时delete和backspace哪个都不好用,乱码.

解决方案 »

  1.   

    把COMBOBOX换了
    !~这个空间本来就是用来查询的,用作输入和查询难免要出现错误!~
      

  2.   

    但是我们老板要选择和输入都要呢.
    能不能编码让程序判断:假如有输入行为就把COMBOBOX给clear了?在哪个事件编码?
      

  3.   

    把combobox的autocomplete属性设为false可以解决乱码问题
      

  4.   

    乱码是因为你使用了TXPMan控件,且在NT系统中使用。
    在KeyPress事件中执行ComboBox_XPMan_KeyPress可解决北问题。function IsNTSystem:Boolean;
    var
      info:OSVERSIONINFO;
    begin
      info.dwOSVersionInfoSize:=sizeof(info);
      GetVersionEx(info);
      Result:=info.dwPlatformId=VER_PLATFORM_WIN32_NT;
    end;procedure ComboBox_XPMan_KeyPress(Sender:TObject;var Key: Char);
      function HasSelectedText(CB_HWND:HWND; var StartPos, EndPos: DWORD): Boolean;
      begin
        SendMessage(CB_HWND, CB_GETEDITSEL, Integer(@StartPos),
          Integer(@EndPos));
        Result := EndPos > StartPos;
      end;
    var
      StartPos, EndPos: DWORD;
      OldText, SaveText: WideString;  //关键在此,中间字符串要设为宽字符串型
      LastByte: Integer;
      TheCB:TComboBox;
      CBHandle:HWND;
    begin
      if not IsNTSystem then Exit;    //非NT系统则退出  TheCB:=TComboBox(Sender);
      CBHandle:=TheCB.Handle;  if not TheCB.AutoComplete then exit;  if ord(Key) = VK_BACK then
      begin
        SaveText := TheCB.Text;
        if HasSelectedText(CBHandle, StartPos, EndPos) then
        begin
          SendMessage(CBHandle,CB_GETEDITSEL,Integer(@StartPos),Integer(@EndPos));
          Delete(SaveText, StartPos + 1, EndPos - StartPos);
          SendMessage(CBHandle, CB_SETCURSEL, -1, 0);
          TheCB.Text := SaveText;
          SendMessage(CBHandle,CB_SETEDITSEL,0,MakeLParam(StartPos,StartPos));
          Key := #0;
        end
        else if(TheCB.Style in [csDropDown,csSimple]) and (Length(SaveText)>0) then
        begin
          LastByte := StartPos;
          OldText := Copy(SaveText, 1, LastByte - 1);
          SendMessage(CBHandle, CB_SETCURSEL, -1, 0);
          TheCB.Text := OldText + Copy(SaveText, EndPos + 1, MaxInt);
          SendMessage(CBHandle, CB_SETEDITSEL, 0, MakeLParam(LastByte - 1,
            LastByte - 1));
          Key := #0;
        end;
      end;
    end;