delphi DBgrid 使用大全.doc_第1页
delphi DBgrid 使用大全.doc_第2页
delphi DBgrid 使用大全.doc_第3页
delphi DBgrid 使用大全.doc_第4页
delphi DBgrid 使用大全.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在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.Fields5.AsString; sQjts:=DataLink.Fields9.AsString; ifsCjtsthen/春季退书数量0的用红色显示 Canvas.Brush.Color:=clRed else ifsQjtsthen/秋季退书数量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); /delphibbs/dispq.asp?lid=737517 在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; Page/定义表头的字体和背景颜色: fori:=0to(SenderasTDBGrid).Columns.Count-1do begin (SenderasTDBGrid).Columnsi.Title.Font.Name:=宋体;/字体 (SenderasTDBGrid).Columnsi.Title.Font.Size:=9;/字体大小 (SenderasTDBGrid).Columnsi.Title.Font.Color:=$000000ff;/字体颜色(红色) (SenderasTDBGrid).Columnsi.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);/画蓝色的横线 PagePen.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 TableNameteacher.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; PageDBComboBox1.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(keychr(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的DemosDbCtrlGrid为例来说明具体的用法。在这个例子的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事件中依资料的条件性来改变格子或文字的颜色. Page如: 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.AsInteger0then 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 PageIfNotDbGrid1.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,将上述代码修改为: CaseTable1.RecNomod2=0offile:/根据数据集的记录号进行判断 True:DbGrid1.Canvas.Brush.color:=clAqua;file:/偶数行用浅绿色显示 False:DbGrid1.Canvas.Brush.color:=clblue;file:/奇数行用蓝色表示 end; If(State=gdSelected)or(State=gdSelectedgdFocused)then CaseDataColmod2=0of True:DbGrid1.Canvas.Brush.color:=clRed;file:/当前选中行的偶数列用红色 PageFalse:DbGrid1.Canvas.Brush.color:=clGreen;file:/当前选中行的奇数列用绿色表示 end; DbGrid1.Canvas.pen.mode:=pmMask; DbGrid1.DefaultDrawColumnCell(Rect DataCol Column State); 上述6种方法分别就数据网格控件的列和行的色彩进行了设置,读者可以根据自己的需要设置特效。该程序在Delphi5中测试通过。 2003-11-1311:11:31点击DBGrid的Title对查询结果排序关键词:DBGrid排序 欲实现点击DBGrid的Title对查询结果排序,想作一个通用程序,不是一事一议,例如不能在SQL语句中增加Orderby.,因为SQL可能原来已经包含Orderby.,而且点击另一个Title时又要另外排序,目的是想作到象资源管理器那样随心所欲。 procedureTFHkdata.SortQuery(Column:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论