我用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,请高手帮我想办法吧。
在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,请高手帮我想办法吧。
解决方案 »
- 谁能做个来电显示的控件?
- 想在C++网络编程上有所成就,苦读并多练《C++程序设计语言》《TCP/IP详解 卷1卷2》《数据结构》《Win32多线程程序设计》《Windows程序设
- 关于ADOStoredProc的问题?
- 请教一下各位大虾,哪里有QuickRpt.pas的源代码啊?
- 大哥哥,大姐姐,帮帮我.
- 一个动态调用控件的问题
- 谁有五子棋(人跟电脑对弈)的代码?
- FastReport中要在语句中控制MEMO里的Text居左居中该怎样写?
- 求救!Delphi7怎么没有DBDateTimePicker,急!
- 我想问问如何有没有关于如何实现这种技术的文章,或资料
- 简单的问题:当前查询出10条记录,每条记录有两个字段,点了按钮后,怎样分别传递给20个变量?
- 如何实现在拖动一个TImage时,拖动图标显示该image的内容(半透明的)?
基本的思路如下 写的代码只是代表思路 不一定正确with adoquery1 do
begin
first;
while (not eof) and (fieldbyname('').asstring=条件{---此处应该是你加的条件,看你自己怎么定义了}) do
begin
next;
dbgrid1.setfocus;//让焦点回来,因为QUERY数据集指针已经指到了我们需要的那行数据,只是因为我们别的操作导致焦点离开 如果焦点回来 你会发现你要的那行数据高亮了
end;
end;
with adoquery1 do
begin
first;
while (not eof) and (fieldbyname('').asstring=条件{---此处应该是你加的条件,看你自己怎么定义了}) do
begin
next;
end;
dbgrid1.setfocus
end;
dbgrid1.setfocus 是为了让焦点回来,因为经过判断QUERY数据集指针已经指到了我们需要的那行数据,只是因为我们别的操作导致焦点离开 如果焦点回来 你会发现你要的那行数据高亮了
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;
当前显示数据行的范围。
我想我只要按数字键盘上的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行
......
1.最好设stringgrid options的goDrawFocusSelected为ture,不然你选中时,不显示选中内容
2.如果你要选整行,要设stringgrid options的goRowSelect为true
3.在按键前要先选中你的stringgrid(或用sg.SetFocus;)