我用keiy() 同志的代码可以生成以下效果:
在StringGrid内显示100行数据,窗口可见是10行,座边的FixedCols显示行号分别为  
0,1,2,3,4,5,6,7,8,9  如果要拉动滚动条想看下面十一行以后的数据,FixedCols显示的行好  
还是0,1,2,3,4,5,6,7,8,9  即使你把滚动条拉到末行,FixedCols显示的还是0,1,2,3,4,5,6,7,8,9    
比如:  
       姓名          年龄            性别              工作单位  
0      甲                33                男                    xxxx  
1      以                22                女                    营业员    
2      亿                29                女                    四饿  
3      乙                34                女                    时光  
4      丙                23                男                    亿饿  
5      ....................................  
6      ....................................  
7      ....................................  
8      ....................................  
9      .................................... 
代码如下:
procedure  TForm1.sgDrawCell(Sender:  TObject;  ACol,  ARow:  Integer;  
   Rect:  TRect;  State:  TGridDrawState);  
var  
   i:integer;  
begin  
   if  (rect.Left=0)  and  (rect.Top  >sg.DefaultRowHeight)  then    //这里,从第1行开始  
   begin  
       i:=rect.Top  div    sg.DefaultRowHeight-1;        //i从0开始  
       sg.Canvas.TextOut(0,rect.Top,inttostr(i));  
       sg.Update;  
   end;  
end; 
我选择这种效果的目的是便于用数字键盘选择StringGrid上某行数据.虽然行号固定了,但是如何得到所要选择的行我一点办法都没有,关键是只用数字键盘上的数字0~9选择数据行,当数据滚动到55行,但我却可以根据FixedCols上的行号换算成55行,这样可以得到StringGrid1.Row=55,请高手帮我想办法吧。

解决方案 »

  1.   

    这个容易 我不知道你的 行号是怎么取的 我以前做过根据GRID中的记录自动跳转到哪一行
    基本的思路如下 写的代码只是代表思路 不一定正确with adoquery1 do
    begin
      first;
      while (not eof) and (fieldbyname('').asstring=条件{---此处应该是你加的条件,看你自己怎么定义了}) do
      begin
        next;
        dbgrid1.setfocus;//让焦点回来,因为QUERY数据集指针已经指到了我们需要的那行数据,只是因为我们别的操作导致焦点离开 如果焦点回来 你会发现你要的那行数据高亮了 
      end;
    end;
      

  2.   

    呵呵 上面最后几行弄错了 不好意思
    with adoquery1 do
    begin
      first;
      while (not eof) and (fieldbyname('').asstring=条件{---此处应该是你加的条件,看你自己怎么定义了}) do
      begin
        next; 
      end;
        dbgrid1.setfocus
    end;
       dbgrid1.setfocus 是为了让焦点回来,因为经过判断QUERY数据集指针已经指到了我们需要的那行数据,只是因为我们别的操作导致焦点离开 如果焦点回来 你会发现你要的那行数据高亮了
      

  3.   

    我是用StringGrid控件的,数据集没有和StringGrid绑定呀。
      

  4.   

    不是特明白你的意思,因为我觉得你的要求与fixcol无关,而与你每次移动的条数有关,你的意思是否是头的的行号+你的0-9=你要的行号?
      

  5.   

    感觉这样应该符合你的要求:
    procedure TForm1.sgKeyPress(Sender: TObject; var Key: Char);
    begin
      if (key>='0') and (key<='9') then
         sg.Row:=sg.TopRow+ord(key)-ord('0'); //sg.toprow当前最上面的行号+你选的0-9
    end;
      

  6.   

    我的意思是按Fixedcols上的行号选择StringGrid1.Row;当StringGrid显示位置为第一行开始时,我按数字键的0~9可以选择0~9行的数据,StringGrid1.Row=Key-48;但是当StringGrid滚动是,当前显示的不是1~10行数据,可能是20~29行的数据。我不知道
    当前显示数据行的范围。
      我想我只要按数字键盘上的0~9就会选中对应行的记录,不管StringGrid是否滚动了。Fixcol   姓名    年龄   性别   工作单位  实际数据行
    0         甲    33      男      xxxx    20   //就是说按数字键盘"0"键会选中20行
    1         以    22      女      营业员  21   //就是说按数字键盘"0"键会选中21行 
    2         亿    29      女      四饿    22   //就是说按数字键盘"0"键会选中22行
    3         乙    34      女      时光    23   //就是说按数字键盘"0"键会选中23行
    4         丙    23      男      亿饿      24   //就是说按数字键盘"0"键会选中24行
    ......
      

  7.   

    按我上面的方法就可以了,不过要注意:
    1.最好设stringgrid options的goDrawFocusSelected为ture,不然你选中时,不显示选中内容
    2.如果你要选整行,要设stringgrid options的goRowSelect为true
    3.在按键前要先选中你的stringgrid(或用sg.SetFocus;)