以前用DELPHI做过一个登分的程序,具体功能如下:
stringgrid表单输入,二十条提示保存
在考号框内输入考号,按TAB键,则光标移到姓名格内,自动检索出姓名,再按TAB键,则光标转入成绩栏,如果考生申报则是默认为0,填入成绩后按ENTER换行。
两库同时录入,换行时自动校验是否已登录的成绩是否相同现在客户要求把TAB键换成ENTER键
则出现一个问题
当在第一列内,输入考号,按ENTER,检索姓名后,光标移入第二列
此时循环自动执行了如下
if (key=#13) and (stringgrid1.col=0) then
...
stringgrid1.col:=stringgrid1.col+1;
...if (key=#13) and (stringgrid1.col=1) then
...
stringgrid1.col:=stringgrid1.col+1;
...
这个问题搞得我头都大了
不知这段程序如何写了不知说清楚了没有,肯请大侠出手相助!!

解决方案 »

  1.   

    没明白!
    if (key=#13) and (stringgrid1.col=0) then 
    ... 
    stringgrid1.col:=stringgrid1.col+1; 
    ... if (key=#13) and (stringgrid1.col=1) then 
    ... 
    stringgrid1.col:=stringgrid1.col+1; 你的代码是什么意思?下面这样不就可以实现你上面代码的功能了吗,搞那么多重复干嘛
    if key=#13 then
    stringgrid1.col:=stringgrid1.col+1;
      

  2.   

    试试下面的代码,我没加越界的判断,你自己加吧
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if key=13 then
       begin
       if StringGrid1.Col<4 then
          begin
          StringGrid1.Col:=StringGrid1.Col+1;
          end;
       if StringGrid1.Col=4 then
          begin
          StringGrid1.Row:=StringGrid1.Row+1;
          StringGrid1.Col:=1;
          end;
       end;
    end;
      

  3.   

    就是说在不同列上点击ENTER ,都对应着不同的事件
      

  4.   

    那你这样,不过检索数据总有数据库呀,我什么都不知道,也不可能给你写的太多
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; 
      Shift: TShiftState); 
    begin 
    if key=13 then 
       begin 
       if StringGrid1.Col=1 then 
          begin 
          检索数据
          StringGrid1.Col:=StringGrid1.Col+1; 
          end; 
       if StringGrid1.Col=2 then 
          begin 
          检索数据
          StringGrid1.Col:=StringGrid1.Col+1; 
          end; 
       if StringGrid1.Col=3 then 
          begin 
          检索数据
          StringGrid1.Col:=StringGrid1.Col+1; 
          end; 
       if StringGrid1.Col=4 then 
          begin 
          StringGrid1.Row:=StringGrid1.Row+1; 
          StringGrid1.Col:=1; 
          end; 
       end; 
    end;
      

  5.   

    不好意思,漏了一句
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if key=13 then
       begin
       if StringGrid1.Col=1 then
          begin
          //检索数据
          StringGrid1.Col:=StringGrid1.Col+1;
          exit;
          end;
       if StringGrid1.Col=2 then
          begin
          //检索数据
          StringGrid1.Col:=StringGrid1.Col+1;
          exit;
          end;
       if StringGrid1.Col=3 then
          begin
          //检索数据
          StringGrid1.Col:=StringGrid1.Col+1;
          exit;
          end;
       if StringGrid1.Col=4 then
          begin
          StringGrid1.Row:=StringGrid1.Row+1;
          StringGrid1.Col:=1;
          exit;
          end;
       end;
    end;
    以上代码我这儿运行的好好的
      

  6.   


    if (Key = #13) then
    begin
      if stringgrid.col < stringgrid.colcount - 1 then
        stringgrid.col := stringgrid.col + 1
      else
      begin
        stringgrid.row := stringgrid.row + 1;
        stringgrid.col := 1;
      end;
      //可以将检索数据写成函数,在这里调用。
    end;我AdvStringGrid是这样做,不知道stringgrid是不是一样。
      

  7.   

    hys_427 ,被自己搞晕了,居然犯这样的初级错误
    基本功太差了
    谢谢,可行还有个问题
    按tab键选中时是第三列是直接高亮显示,可以直接编辑的
    而enter进入第三列,则不是,这个问题请问如何解决呢?
      

  8.   

    那是因为你把StringGrid1的Options属性的GoEditing设为True的原因,你把它设为False试试
    可以实现你的目的即可,对一些表面的东西何必强求
      

  9.   

    我是用来作为输入表单用的
    那样不是不可编辑了吗
    因为数量巨大
    所以要求连续
    这也是客户要求把TAB更改成ENTER的原因
      

  10.   

    那样不是不可编辑了吗
    按tab键选中时是第三列是直接高亮显示,可以直接编辑的 
    而enter进入第三列,则不是,这个问题请问如何解决呢?

    按回车键虽然不是高亮显示,但是也直接可以输入呀,要不你把goRangeSelect设为false吧,
    省得为高亮显示而烦恼
      

  11.   

    不希望沉了,
    现在已经开始做改不了的准备的
    不过还是希望能够弄明白
    这个stringgrid是比较麻烦
      

  12.   

    自己再顶两天
    不行只好算了问题 :
    按tab键选中时是第三列是直接高亮显示,可以直接编辑的 
    而enter进入第三列,则不是,这个问题请问如何解决呢?
      

  13.   

    初始设置STRINGGRID。GOEDITING为TRUE在ONSELECTCELL中:IF ACOL = 可编辑列 THEN
     STRINGGRID.OPTION := STRINGGRID.OPTION+[GOEDITING]
    ELSE
      STRINGGRID.OPTION := STRINGGRID.OPTION-[GOEDITING]
    我是这样用,回车移动后高亮度显示。