我想在下边输入产品时,仿效盛科2000XP输入,比如
 产品信息为
助计词   大类   分类  小类  型号   单位   数量  单价 
LX5120   整机   品牌机 联想  5120   台     20    5200
SD5200   整机   品牌机 实达  5200   台     20    5200
--------------
我想在下面(比如出库时的DBGRID)输入产品时,可以在输一个字符时如‘L’,下面自动像
COMBOX的效果,出来   LX5120:品牌机/联想/5120   ,换为'S'后又能出来   SD5200:品牌机/实达/5200   ,然后当你选择一个ITEM后,
他又能把对应的分类、小类、型号和单位写到DBGRID对应的字段上去,这种效果该如何实现?    
我已尝试嵌入COMBOX控件和建立LOOKUP字段但都没有用?
如果谁用过无锡盛科的2000XP进销存软件就知道那种效果了,现在客户要我们写那种效果出来,可百思不得其解!!!肯请帮忙!!!

解决方案 »

  1.   

    呵呵
    碰好,我也是用的类似的这种办法
    但是呢,我是在录了如:B以后,按一个回车,再弹出B%的货号,然后
    选择一下,将货号编码、货号名称、单价等信息全部取出来就
    不用楼主说的,直接选择弹出的原因是,像这样做,如果有10万个货号,那速度可就成了问题了,因为每一次查询操作,就是一次过滤操作procedure TStockInputForm.TickDBGridKeyDown(Sender: TObject;
      var Key: Word; Shift: TShiftState);
    begin
        if key in [VK_RETURN,VK_TAB] then
          SetGridText
            //如果按回车、TAB键,则弹出单一货号输入窗口
        else if key = VK_F8 then
          ShowInputDialog;
            //如果按F8键 ,则弹出多行货号输入窗口,可以同时选择多个货号输入
      end;
    end;//这个就是单一货号窗口的实现过程了
    procedure TStockInputForm.SetGridText;
    var
      tmpStr : String;
    begin
      if TickDBGrid.Fields[0].ReadOnly then
        exit;
      if (TickDBGrid.SelectedField.DisplayLabel = '货号') then
      begin
       {判断是不是有这个货号,如果有,则显示相关内容,如果有多个相似,则显示选择框,否则提示无相关信息}
        if (BodyQuery.State = dsEdit) or (BodyQuery.State = dsInsert) then
          BodyQuery.Post;
        tmpStr := UpperCase(trim(BodyQuery.FieldByName('GDSID').AsString));
        if tmpStr = '' then exit;
        With CodeQuery do
        begin
          Close;
          SQL.Clear;
          SQL.Add('Select GDSID,GDSINID,GDSNAME,SPECIFY,UOMID,SALEPRICE from GOODS where GDSID like '''+tmpStr+'%''');
          Open;
          if recordCount >=1 then
          begin
            if RecordCount >1 then
            begin
              WareInfoForm := TWareInfoForm.Create(Application);
              try
                WareInfoForm.QueryStr := SQL.Text;
                if WareInfoform.ShowModal = 100 then
                begin
                  tmpStr := WareInfoForm.GDSID;
                  Close;
                  SQL.Clear;
                  SQL.Add('Select GDSID,GDSINID,GDSNAME,SPECIFY,UOMID,SALEPRICE from GOODS where GDSID='''+tmpStr+'''');
                  Open;
                end
                else
                begin
                  TickDBGrid.SetActiveField('GDSID');
                  exit;
                end;
              Finally
                WareInfoform.Free;
                WareInfoForm := nil;
              end;
            end;
            BodyQuery.Edit;
            BodyQuery.FieldByName('GDSID').AsString := tmpStr;
            BodyQuery.FieldByName('GDSINID').AsString := trim(FieldByName('GDSINID').AsString);
            BodyQuery.FieldByName('GDSNAME').AsString := FieldByName('GDSNAME').AsString;
            BodyQuery.FieldByName('SPECIFY').AsString := FieldByName('SPECIFY').AsString;
            BodyQuery.FieldByName('UOMID').AsString := FieldByName('UOMID').AsString;
            BodyQuery.FieldByName('UNITPRICE').AsFloat := FieldByName('SalePrice').AsFloat;
          end
          else if RecordCount = 0 then
          begin
            ShowMessage('该编号的商品不存在!');
            BodyQuery.Edit;
            TickDBGrid.GetActiveField.Value := '';
          end;
        end;
      end;
    end;//由于代码太长,所以多选的代码就不写了,而且也太复杂了
      

  2.   

    我嵌入COM_BOX控件碰到的问题就是,输入时光标始终在最前面,使得输入的字符倒着显示,而且当你把COM_BOX中的内容删光时,却总保留着最初输入的那个字符,反倒很不方面,这是怎么回事!
    procedure TForm1.Com_boxKeyPress(Sender: TObject; var Key: Char);
    var
    Tpstr:STring;
    begin
    Com_box.Text:=Key+Com_box.Text;
    Tpstr:=Com_box.Text;
     if key<>#0 then
      if Length(Tpstr)>0 then
       with Ado do
         begin
           Close;
           Com_box.Items.Clear ;
           Com_box.Text:=Tpstr;
           Sql.Clear ;
           Sql.Text:='Select Idno,Idname From Testtb '
                    +'Where Idno Like :myid';
           Parameters[0].Value:=Com_box.Text+'%';
           Open;
           While not Eof do
            begin
              Com_box.Items.Add(Fields[0].Value+':'+Fields[1].Value);
              NExt;
            end;
           Close;
           If com_box.Items.Count>0 then
           Com_box.DroppedDown:=True
          Else Com_box.DroppedDown:=True;
         end;
    end;
     
      

  3.   

    dblookupcombobox可以实现这样的效果
    参看《delphi X 从入门到精通》
      

  4.   

    dblookupcombobox可以实现这样的效果
    直接绑定,下载吧,里面又例子
    参看《delphi X 从入门到精通》
      

  5.   

    建议楼主去下载INFOPOWER3000的控件包
    里面有一个WWDBGRID的控件,比起我们的DBGRID好用多了
    你可以在WWDBGRID中指定连接到的DBLOOKUPCOMBOBOX控件,
    它还自带了DBDTATETIMEPICKER控件,还有什么DBRICHEDIT控件
    还可以在WWDBGRID中显示视片,还可以在其中使用DBCHECK控件
      

  6.   

    DBLookupComboBox可以实现,
    Ehlib的 DBLookupComboBoxEh效果更好
      

  7.   

    dblookupcombobox可以实现这样的效果
    参看《delphi X 从入门到精通》
      

  8.   

    小虫也来了啊?呵呵,再推荐一个控件吧:cxGrid,NND,功能太强大了,强大的我都不知道应该用它的什么功能了呢!
      

  9.   

    我不会在dbgrid中用这种效果,所以我用了个edit,在adoquery.sql中用了个select * from table where fieldname like edit1.text。然后再将此行记录一一填入各个字段。
      

  10.   

    TO yczyk(有鬼:泪眼问花花不语,乱红飞过千秋去) 
    哪里有得下载哦?
    给个连接撒~
      

  11.   

    我是这样解决的:
                 当本列获取光标后且处于改变(onchange)时,用执行一次匹配查询操作就可
    但这样做不好的就是执行查询操作太多降慢了速度.
      

  12.   

    DBLookupComboBox可以实现,
    Ehlib的 DBLookupComboBoxEh效果更好
    在下两个都用过,都能实现,后来因为dblookupcombobox是delphi自带的,并且编译后生成的文件更小,所以用了dblookupcombobox
      

  13.   

    DBLookupComboBox可以实现,
    Ehlib的 DBLookupComboBoxEh效果更好
    在下两个都用过,都能实现,后来因为dblookupcombobox是delphi自带的,并且编译后生成的文件更小,所以用了dblookupcombobox
      

  14.   

    我也遇到同样问题?但没解决,我也试试用dblookupcombobox。
      

  15.   

    要不你申请一个str_res:arrary of string;
    先将数据字段写入其中,然后在这里面查询。这样比每次都检索数据库快多了。不过它要占用一些空间,所以见意在点击确定或取消时,将其为setlength(str_res,0);
    -----------------------------------------------------------
    只说个人观点,从不对自己的议论负任何责任!
    -----------------------------------------------------------