在DELPHI中经常用到网格控件DBGrid显示数据.docx
- 文档编号:9199916
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:13
- 大小:21.22KB
在DELPHI中经常用到网格控件DBGrid显示数据.docx
《在DELPHI中经常用到网格控件DBGrid显示数据.docx》由会员分享,可在线阅读,更多相关《在DELPHI中经常用到网格控件DBGrid显示数据.docx(13页珍藏版)》请在冰豆网上搜索。
在DELPHI中经常用到网格控件DBGrid显示数据
在DELPHI中经常用到网格控件(DBGrid)显示数据,网格控件只提供了每一行的颜色属性,但在实际应用中我们经常希望它按某一行某一项的取值不同显示不同的颜色,甚至在网格中的单位表格项中显示出图像等等,下面我们以一个简单的例子来告诉大家怎么做。
比如我们要求如果春季有退书用红色表示,如果秋季有退书用黄色表示
利用DBGrid自绘功能可以很容易地实现这样的要求。
用户可以处理DBGrid的OnDrawColumnCell事件,在其中实现特殊的效果。
要判断记录是否满足要求,可以使用DBGrid的DataLink属性获得数据,但DBGrid的DataLink属性属于保护成员,必须在TCustomDBGrid的子类中调用。
type
TMyCustomDBGrid=class(TCustomDBGrid);
procedureTForm1.DBGrid1DrawColumnCell(Sender:
TObject;constRect:
TRect;
DataCol:
Integer;Column:
TColumn;State:
TGridDrawState);
var
sCjts,sQjTs:
String;
begin
withTMyCustomerDBGrid(Sender)do
begin
Cjts:
=DataLink.Fields[5].AsString;
sQjts:
=DataLink.Fields[9].AsString;
ifsCjts<>‘‘then //春季退书数量>0的用红色显示
Canvas.Brush.Color:
=clRed
else
ifsQjts<>‘‘then //秋季退书数量>0的用黄色显示
Canvas.Brush.Color:
=clYellow
else
Canvas.Brush.Color:
=clWhite;
Canvas.Font.Color:
=clBlack;
canvas.fillrect(rect);
canvas.textout(rect.left+4,rect.top+4,Column.Field.AsString);
end;
end;
由此方法可以延伸出其它控件的多种修饰方法,比如可以按数据项值采用不同的颜色,可以按记录号显示不同的颜色。
总之,灵活应用canvas、rect及bitmap等对象,可以将各种网格装饰得绚丽多彩。
如何才能得到DBGRID的行号,而不是数据集的行号?
Edit1.Text:
=inttostr(TDrawGrid(DBGrid1).Row);
在Delphi语言的数据库编程中,DBGrid是显示数据的主要手段之一。
但是DBGrid缺省的外观未免显得单调和缺乏创意。
其实,我们完全可以在我们的程序中通过编程来达到美化DBGrid外观的目的。
通过编程,我们可以改变DBGrid的表头、网格、网格线的前景色和背景色,以及相关的字体的大小和风格。
以下的示例程序演示了对DBGrid各属性的设置,使Delphi显示的表格就像网页中的表格一样漂亮美观。
示例程序的运行:
在Form1上放置DBGrid1、Query1、DataSource1三个数据库组件,设置相关的属性,使DBGrid1能显示表中的数据。
然后,在DBGrid1的onDrawColumnCell事件中键入以下代码,然后运行程序,就可以看到神奇的结果了。
本代码在Windows98、Delphi5.0环境下调试通过。
procedureTMainForm.DBGrid1DrawColumnCell(Sender:
TObject;
constRect:
TRect;DataCol:
Integer;Column:
TColumn;State:
TGridDrawState);
vari:
integer;
begin
ifgdSelectedinStatethenExit;
//定义表头的字体和背景颜色:
fori:
=0to(SenderasTDBGrid).Columns.Count-1do
begin
(SenderasTDBGrid).Columns[i].Title.Font.Name:
='宋体';//字体
(SenderasTDBGrid).Columns[i].Title.Font.Size:
=9;//字体大小
(SenderasTDBGrid).Columns[i].Title.Font.Color:
=$000000ff;//字体颜色(红色)
(SenderasTDBGrid).Columns[i].Title.Color:
=$0000ff00;//背景色(绿色)
end;
//隔行改变网格背景色:
ifQuery1.RecNomod2=0then
(SenderasTDBGrid).Canvas.Brush.Color:
=clInfoBk//定义背景颜色
else
(SenderasTDBGrid).Canvas.Brush.Color:
=RGB(191,255,223);//定义背景颜色
//定义网格线的颜色:
DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
with(SenderasTDBGrid).Canvasdo//画cell的边框
begin
Pen.Color:
=$00ff0000;//定义画笔颜色(蓝色)
MoveTo(Rect.Left,Rect.Bottom);//画笔定位
LineTo(Rect.Right,Rect.Bottom);//画蓝色的横线
Pen.Color:
=$0000ff00;//定义画笔颜色(绿色)
MoveTo(Rect.Right,Rect.Top);//画笔定位
LineTo(Rect.Right,Rect.Bottom);//画绿色的竖线
end;
end;
2003-11-1117:
07:
42问题:
Delphi5-隔行改变DBGrid网格颜色在Form1上放置DBGrid1、Query1、DataSource1三个数据库组件,设置相关的属性,使DBGrid1能显示表中的数据。
然后,在DBGrid1的onDrawColumnCell事件中键入以下代码,然后运行程序
代码:
procedureTForm1.DBGrid1DrawColumnCell(Sender:
TObject;constRect:
TRect;
DataCol:
Integer;Column:
TColumn;State:
TGridDrawState);
vari:
integer;
begin
ifgdSelectedinStatethenExit;//隔行改变网格背景色:
ifadoQuery1.RecNomod2=0then
(SenderasTDBGrid).Canvas.Brush.Color:
=clinfobk//定义背景颜色
else
(SenderasTDBGrid).Canvas.Brush.Color:
=RGB(191,255,223);//定义背景颜色
//定义网格线的颜色:
DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
with(SenderasTDBGrid).Canvasdo//画cell的边框
begin
Pen.Color:
=$00ff0000;//定义画笔颜色(蓝色)
MoveTo(Rect.Left,Rect.Bottom);//画笔定位
LineTo(Rect.Right,Rect.Bottom);//画蓝色的横线
Pen.Color:
=clbtnface;//定义画笔颜色(兰色)
MoveTo(Rect.Right,Rect.Top);//画笔定位
LineTo(Rect.Right,Rect.Bottom);//画绿色
end;
end;
用BDE中的table1未能通过,颜色没有隔行变化。
2003-11-1117:
12:
09在Delphi的DBGrid中插入其他可视组件Delphi提供了功能强大的DBGrid组件,以方便进行数据库应用程序设计。
但是如果我们仅仅利用DBGrid组件,每一个获得焦点(Grid)只是一个简单的文本编辑框,不方便用户输入数据。
Delphi也提供了一些其他数据组件来方便用户输入,比如DBComboBox,DBCheckBox等组件,但这些组件却没有DBGrid功能强大。
Delphi能不能象VisualFoxpro那样让DBGrid中获得焦点网格可以是其它可视数据组件以方便用户呢?
其实我们可以通过在DBGrid中插入其他可视组件来实现这一点。
Delphi对DBGrid处理的内部机制,就是在网格上浮动一个组件——DBEdit组件。
你输入数据的网格其实是浮动DBEdit组件,其他未获得焦点地方不过是图像罢了。
所以,在DBGrid中插入其他可视组件就是在网格上浮动一个可视组件。
因此任何组件,包括从简单的DbCheckBox到复杂的对话框,都可以在DBGrid中插入。
下面就是一个如何在DBGrid中插入DBComboBox组件的步骤,采用同样的办法可以插入其他组件。
1、在Delphi4.0中新建一个项目。
2、分别拖动的DataAccess组件板上DataSource、Table,DataControls组件板上DBGrid,DBComboBox四个组件到Form1上。
3、设置各个组件的属性如下:
rcf1对象属性设定植
Form1Caption'在DBGrid中插入SpinEdit组件示例'
DataSource1DataSetTable1
Table1DatabaseNameDBDEMOS
TableName'teacher.DBF'
ActiveTrue
DBGrid1DataSourceDataSource1
DBComboBox1DataFieldSEX
DataSourceDataSource1
VisibleFalse
StringsItems.'男'|'女'
注意:
我在这里用了Teacher.dbf,那是反映教职工的性别,只能是“男”或者是“女”。
4、DrawDataCell事件是绘制单元格,当获得焦点网格所对应的字段与组合框所对应的字段一致时,移动组合框到获得焦点的网格上,并且使组合框可视,从而达到在DBGrid指定列上显示DBComboBox的功能。
设置DBGrid1的OnDrawDataCell事件如下:
procedureTForm1.DBGrid1DrawDataCell(Sender:
TObject;constRect:
TRect;Field:
TField;State:
TGridDrawState);
begin
if(gdFocusedinState)then
begin
if(Field.FieldName=DBComboBox1.DataField)then
begin
DBComboBox1.Left:
=Rect.Left+DBGrid1.Left;
DBComboBox1.Top:
=Rect.Top+DBGrid1.top;
DBComboBox1.Width:
=Rect.Right-Rect.Left;
DBComboBox1.Height:
=Rect.Bottom-Rect.Top;
DBComboBox1.Visible:
=True;
end;
end;
end;
5、DBGrid指定单元格未获得焦点时不显示DBComboBox,设置DBGrid1的OnColExit事件如下:
procedureTForm1.DBGrid1ColExit(Sender:
TObject);
begin
IfDBGrid1.SelectedField.FieldName=DBComboBox1.DataFieldthen
begin
DBComboBox1.Visible:
=false;
end;
end;
6、当DBGrid指定列获得焦点时DrawDataCell事件只是绘制单元格,并显示DBComboBox,但是DBComboBox并没有获得焦点,数据的输入还是在单元格上进行。
在DBGrid1的KeyPress事件中调用SendMessage这个WindowsAPI函数将数据输入传输到DBComboBox上,从而达到在DBComboBox上进行数据输入。
因此还要设置KeyPress事件如下:
procedureTForm1.DBGrid1KeyPress(Sender:
TObject;varKey:
Char);
begin
if(key<>chr(9))then
begin
if(DBGrid1.SelectedField.FieldName=DBComboBox1.DataField)then
begin
DBComboBox1.SetFocus;
SendMessage(DBComboBox1.Handle,WM_Char,word(Key),0);
end;
end;
end;
程序在中文Windows98,Delphi4.015下调试通过。
希望本文能使你可以更加方便快捷的开发数据库应用程序。
2003-11-1117:
17:
56锁定DBGrid左边的列我在使用Delphi3进行数据库编程的时候,希望DBGRID构件在显示数据的时候能象FoxPro的BROWSE命令一样,锁定左边指定的几列不进行滚动,请问应用什么方法来实现?
我们知道Delphi的TStringGrid有一个属性FixedCols来指定不滚动的列。
虽然TDBGrid不能直接使用这一属性,但通过强制类型转换也可以首先这一功能,因为这两个类都来自TCustomGrid类。
下面我们以Delphi3.0的Demos\Db\CtrlGrid为例来说明具体的用法。
在这个例子的TFmCtrlGrid.FormShow过程中加入如下一行:
TStringGrid(DbGrid1).FixedCols:
=2;
运行该程序,在左右移动各列时,Symbol列不会移动。
除了这种方法,也可以采用下面的方法:
首先在Form声明部分加上
typeTMyGrid=Class(TDBGrid)end;
然后在TFmCtrlGrid.FormShow过程中加入:
TMyGrid(DbGrid1).FixedCols:
=2;
两者从形式上略有不同,但实质都是一样的。
我们这里设置FixedCols为2,这是因为在DBGrid构件最左侧有个指示列,如果你将DBGrid的Options属性的dgIndicator设为False,则应设置FixedCols为1。
2003-11-1117:
21:
36使dbgrid的某几笔资料变色你可在DBGrid元件的DrawDataCell事件中依资料的条件性来改变格子或文字的颜色.
如:
OnDrawDataCell(...)
begin
withTDBGrid(Sender)do
begin
if(条件)then
Canvas.TextOut(Rect.Left+4
Rect.Top+2
'要显示的文字如表格的资料');
end;
而你会看到DBGrid的显示资料怎麽有重叠的情况那是因为原本DBGrid要显示的资料与TextOut所显示的资料重叠
解决方法:
在Query元件所加入的栏位(在元件上按右键会有AddFields...的选单)在不要显示资料的栏位的OnGetText事件中有一参数设定为False;
procedureTForm1.Query1Detail1GetText(Sender:
TField;varText:
string;
DisplayText:
Boolean);
begin
//决定在DBGrid得知表格资料时要不要显示所得到的资料False->不显示
//就可避免与TextOut的文字重叠了
DisplayText:
=False;
end;
end;
如果用Delphi3处理很简单.例如:
对表中某字段当其数值小于0时为红字其他为黑字.
在DBGrid.OnDrawColumnCell(...)中:
begin
ifTableField.AsInteger<0then
DBGrid.Canvas.Font.Color:
=clRed
else
DBGrid.Canvas.Font.Color:
=clBlack;
DBGrid.DefaultDrawColumnCell(...);
end;
这样对Field指定的格式仍旧生效不必重写.
2003-11-1117:
25:
29实战Delphi数据网格色彩特效Delphi中的数据网格控件(TDbGrid)对于显示和编辑数据库中大量的数据起着十分重要的作用;然而,在使用数据网格控件的同时,也往往因为表格中大量的数据不易区分,而令操作者眼花缭乱。
如何提高网格控件的易用性,克服它的此项不足呢?
本文从改变数据网格的色彩配置角度,提出了一种解决办法。
以下为数据网格控件的6种特殊效果的实现方法,至于数据网格控件与数据集如何连接的方法从略。
1.纵向斑马线效果:
实现网格的奇数列和偶数列分别以不同的颜色显示以区别相邻的数据列。
file:
//在DbGrid的DrawColumnCell事件中编写如下代码:
CaseDataColMod2=0of
True:
DbGrid1.Canvas.Brush.Color:
=clBlue;file:
//偶数列用蓝色
False:
DbGrid1.Canvas.Brush.Color:
=clAqua;file:
//奇数列用浅绿色
End;
DbGrid1.Canvas.Pen.Mode:
=pmMask;
DbGrid1.DefaultDrawColumnCell(Rect
DataCol
Column
State);
2.纵向斑马线,同时以红色突出显示当前单元格效果:
以突出显示当前选中的字段。
file:
//将上述代码修改为:
CaseDataColMod2=0of
True:
DbGrid1.Canvas.Brush.Color:
=clBlue;file:
//偶数列用蓝色
False:
DbGrid1.Canvas.Brush.Color:
=clAqua;file:
//奇数列用浅绿色
End;
If((State=[gdSelected])or(State=[gdSelectedgdFocused]))then
IfNotDbGrid1.SelectedRows.CurrentRowSelectedthen
DbGrid1.Canvas.Brush.Color:
=clRed;file:
//当前选中单元格显示红色
DbGrid1.Canvas.Pen.Mode:
=pmMask;
DbGrid1.DefaultDrawColumnCell(Rect
DataCol
Column
State);
上述两种方法突出了列的显示效果。
3.在数据网格中以红色突出显示当前选中的行。
设置DbGrid控件的Options属性中的dgRowSelect属性为真,Color属性为clAqua(背景色)
在DbGrid的DrawColumnCell事件中编写如下代码:
if((State=[gdSelected])or(State=[gdSelectedgdFocused]))then
DbGrid1.Canvas.Brush.color:
=clRed;file:
//当前行以红色显示,其它行使用背景的浅绿色
DbGrid1.Canvas.pen.mode:
=pmmask;
DbGrid1.DefaultDrawColumnCell(Rect
DataCol
Column
State);
4.行突显的斑马线效果:
既突出当前行,又区分不同的列(字段)。
file:
//其它属性设置同3,将上述代码修改为:
if((State=[gdSelected])or(State=[gdSelectedgdFocused]))then
begin
CaseDataColMod2=0of
True:
DbGrid1.Canvas.Brush.color:
=clRed;file:
//当前选中行的偶数列显示红色
False:
DbGrid1.Canvas.Brush.color:
=clblue;file:
//当前选中行的奇数列显示蓝色
end;
DbGrid1.Canvas.pen.mode:
=pmmask;
DbGrid1.DefaultDrawColumnCell(Rect
DataCol
Column
State);
end;
5.横向斑马线,同时以红色突显当前行效果。
file:
//其它属性设置同3,将上述代码修改为:
CaseTable1.RecNomod2=0offile:
//根据数据集的记录号进行判断
True:
DbGrid1.Canvas.Brush.color:
=clAqua;file:
//偶数行用浅绿色显示
False:
DbGrid1.Canvas.Brush.color:
=clblue;file:
//奇数行用蓝色表示
end;
if((State=[gdSelected])or(State=[gdSelectedgdFocused]))thenfile:
//选中行用红色显示
DbGrid1.Canvas.Brush.color:
=clRed;
DbGrid1.Canvas.pen.mode:
=pmMask;
DbGrid1.DefaultDrawColumnCell(Rect
DataCol
Column
State);
6.双向斑马线效果:
即行间用不同色区分,同时,选中行以纵向斑马线效果区分不同的列。
file:
//其它属性设置同3,将上述
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DELPHI 经常 用到 网格 控件 DBGrid 显示 数据