如果光标在第二列时,输入数据(ID)按回车键后,根据第二列的内容从表2中将具有此(ID)的数据自动填到第三列中,如何实现?
计算字段或查询字段在DBGRID中编辑数据,如果光标所在的列不是最后一列,按回车键后,光标就跳到下一列,如果是最后一列则插入一条记录,光标跳到下一行的第二列,如何实现?
keypress or keydown 事件中
postmessage TAB事件

解决方案 »

  1.   

    其实你就是对dbgrid的onkeydown事件进行编程,对每个键和当前列进行判断,作相应的动作,具体我有代码
      

  2.   

    我的ONKEYDOWN函数内容如下:请高手指正
      if key=13 then
        begin
          k:=dbgrid1.SelectedIndex;
          if k<dbgrid1.FieldCount-1 then
            begin
              // 如果光标在第二列时(K=2),根据第二列的内容,将另一个表中ID等于第二列
              // 内容的另一项赋给第三列;
              dbgrid1.Fields[k+1].FocusControl; //光标为什么不能跳到下一列?
            end;
          else
            begin
              query1.insert;
              dbgrid1.Fields[0].ReadOnly:=false;
              dbgrid1.Fields[0].asstring:=edit1.text;
              dbgrid1.Fields[0].ReadOnly:=true;
              dbgrid1.Fields[1].FocusControl;
            end;
      

  3.   

    这是我的一段代码你慢慢研究就明白了procedure Tfmyinhang.DBGrid1ColExit(Sender: TObject);
    var
    iYear1,iMonth1,iDay1:word;
    formdate,enddate:tdatetime;
    zydc,zydm:string;
    yhbhao:integer;
    begin
     case dbgrid1.SelectedIndex of
     7:begin with Query1 do
        begin
          close;
          sql.clear;
          sql.add('select count(*),max(yhb_hao) from yhb');
          sql.add('where yhb_shoufu=:hao');
          parambyname('hao').asstring:=fmcenter.Queryyhb.fieldbyname('yhb_shoufu').asstring;
          if not prepared then
           prepare;
          try
           open;
          except
           showmessage('无法求出最大收付号');
          exit;
          end;
         liu:=fields[0].asinteger;
         yhbhao:=fields[1].asinteger;
        end;
    if liu<=0 then
     begin
      with Query2 do
       begin
         close;
         sql.clear;
         sql.add('select max(yhb_hao) from yhbtotal');
         sql.add('where yhb_zhang=:name and yhb_date>=:be and yhb_date<=:ed and yhb_shoufu=:hao');
         parambyname('name').asstring:=zbname;
         parambyname('be').asdatetime:=formdate;
         parambyname('ed').asdatetime:=enddate;
         parambyname('hao').asstring:=fmcenter.Queryyhb.fieldbyname('yhb_shoufu').asstring;
         if not prepared then
          prepare;
         try
           open;
         except
           showmessage('无法求出最大收付号');
           exit;
          end;
          yhbhao:=fields[0].asinteger;
        end;
     end;
     if fmcenter.queryyhb.State in [dsedit,dsinsert] then
     fmcenter.Queryyhb.fieldbyname('yhb_hao').asinteger:=yhbhao+1;
       end;
     5: begin
     zydm:=fmcenter.queryyhb.fieldbyname('yhb_zhaiyao').asstring;
       with fmcenter.table5 do
          begin
        if locate('zy_number',zydm,[]) then    if  FMCENTER.Queryyhb.state in [dsedit,dsinsert] then
            fmcenter.Queryyhb.fieldbyname('yhb_zhaiyao').asstring:= fieldbyname('zy_nr').asstring;
          end;
     end;
      8: begin
           if fmcenter.queryyhb.fieldbyname('yhb_shouri').asstring='' then
             begin
              if fmcenter.querysetup1.fieldbyname('xj_zijinlai').asboolean then
              dbgrid1.Columns[16].visible:=false;
               if fmcenter.querysetup1.fieldbyname('xj_zijinlailei').asboolean then
              dbgrid1.Columns[17].visible:=false;
             end
            else
             begin
              if fmcenter.querysetup1.fieldbyname('xj_zijinlai').asboolean then
               dbgrid1.Columns[16].visible:=true;
              if fmcenter.querysetup1.fieldbyname('xj_zijinlailei').asboolean then
               dbgrid1.Columns[17].visible:=true;
             end;
         end;
       9: begin
           if fmcenter.queryyhb.fieldbyname('yhb_fuchu').asstring='' then
             begin
              if fmcenter.querysetup1.fieldbyname('xj_zijinrong').asboolean then
              dbgrid1.Columns[18].visible:=false;
              if fmcenter.querysetup1.fieldbyname('xj_ronglei').asboolean then
              dbgrid1.Columns[19].visible:=false;
             end
            else
             begin
             if fmcenter.querysetup1.fieldbyname('xj_zijinrong').asboolean then
              dbgrid1.Columns[18].visible:=true;
             if fmcenter.querysetup1.fieldbyname('xj_ronglei').asboolean then
              dbgrid1.Columns[19].visible:=true;
             end;
         end;
      19 :begin
        zydm:=fmcenter.queryyhb.fieldbyname('yhb_rongtuleibie').asstring;
       if fmcenter.table6.locate('rt_number',zydm,[]) then
           zydc:=fmcenter.table6.fieldbyname('rt_number').asstring;
      if FMCENTER.Queryyhb.state in [dsinsert,dsedit] then
            fmcenter.Queryyhb.fieldbyname('yhb_rongtuleibie').asstring:=fmcenter.table6.fieldbyname('rt_name').asstring;
          end;
         
       end;
    end;
      

  4.   

    1.
      在dbgrid1.keypress 事件中加入:
       if key=#13 then
       begin
         key=#0;
         postmessage(activecontrol.handle,WM_keydown,vk_tab,0);
       end;
    2.
      在table.afterinsert事件中加入:
        dbgrid1.selectedindex:=1;
    3.
      在DBGrid1ColExit事件中查询、赋值。
      
      

  5.   

    onkeydown
        if key=13 then
        begin
           key:=9;
           abort;
        edit;