分享

转载DBGrid和DBGridEH

 木子示羊 2010-08-18

转载DBGridDBGridEH

二、应用实例
    Enlib3.0组件包安装成功后
A、定制标题行
 1、制作复杂标题行
    标题行可设为2行以上高度,并可以为多列创建一个共同的父标题行。为实现这个效果,需在各个列标题属性中以分隔父标题和子标题,如办公用品包括代码和名称两部分,具体属性设置如下:
 
usemultititile=true;
titlelines=2
DBGridEh.Columns[0].Title.Caption := '办公用品|代码';
DBGridEh.Columns[1].Title.Caption := '办公用品|名称';
 
 2、标题行显示图片 
    实现图2中的购买人标题行显示效果。首先添加一个imagelist组件img1并在其中添加一组bmp,ico格式的图片。然后将DBGridEhTitleImages设置为img1.最后在需要显示图片的列标题的imageindex中设置需要显示的img1中图片的序号。按F9执行一下程序,是不是很酷!
 
 3、自动显示标题行的升降排序标志符(降序升序)并做相应排序
    DBGridEh组件可以在标题行单元格中显示小三角形升、降排序标志符图片,在运行时可点击标题行,图片自动切换并做相应排序。具体属性设置如下:
 
OptionsEhdghAutoSortMarking 
Column.Title.TitleButtontrue 
 
SortMarkedColumns 为当前排序列可在运行时使用.
然后在该列的ontitleclick事件中添加代码:
procedure TForm_Query.DBGridEh1TitleBtnClick(Sender: TObject; ACol: Integer; Column: TColumnEh);
var
  sortstring:string; //排序列
begin
  //进行排序
  with Column do
  begin
    if FieldName = '' then
      Exit;
    case Title.SortMarker of
      smNoneEh:
      begin
        Title.SortMarker := smDownEh;
        sortstring := Column.FieldName + ' ASC';
      end;
      smDownEh: sortstring := Column.FieldName + ' ASC';
      smUpEh: sortstring := Column.FieldName + ' DESC';
    end;
  //进行排序
    try
      dataset.Sort := sortstring //dataset为实际数据集变量名
    except
    end;
  end;
end;
 
切记lookup型字段不可做上述设置,否则系统会提示错误。
 
  
 
B、定制表格底部(footer)区域的汇总统计行
    DBGridEh 组件可以在表格底部显示汇总行,如记录数合计、列字段累加和等信息。在FooterRowCount中设置底部显示的行数;然后在Footers 编辑器中添加一个或多个显示列,显示列可以是字段值累加和、记录数合计、字段值或静态文件等集合类型,可以在设计时在ValueType属性中设置,也可在运行时通过设置Footers[i].ValueType指定其类型。其含义见下表:
 
    切记设置DBGridEh.SumList.Active  True,才会进行汇总统计运算。需注意的是,如显示类型为不是当前列的累加和,则需在fieldname属性中指定汇总列,其它类型则无此要求。 
 
 
 
C、定制表格数据单元外观
 1、根据不同字段值显示相应的小图片
    如根据库存材料的不同状态在数据单元格中显示相应图片,具体设置如下:
    添加一个imagelist组件img1并在其中添加一组bmp,ico格式的图片。然后将需要显示图片的列的imagelist属性设置为img1;在keylist属性中添加实际数据存储值,一行为一个值,切记一定要与imagelist中图片顺序一一对应,否则会张冠李戴,面目全非。还可在picklist中添加提示信息,也要求是一行为一个值,并设tooltiptrue,那么,运行时当鼠标移动到该数据单元格时在显示图片的同时还显示提示信息,怎么样,功能够强大吧!可使用空格键或鼠标切换下一张图片,图片切换的同时也改变了实际存储数据值。也可通过shift+空格或鼠标切换为上一张图片。这样就实现了上下两个方向图片切换。
 
 2、显示检查框(checkbox)外观
    对于Boolean型字段值在dbgrideh组件中自动显示为检查框。通常情况下我们需将非Boolean型字段值也此外观显示,如性别字段为字符型,字段值为男性时为选中,女性时为未选中。需要在keylist编辑器中设置实际存储数据值,第一行为选中时的值1”,第二行为未选中的值0”,第三行为其它值2”,支持三态显示。设checkbox属性为True.
 
 3、显示单、多列下拉列表
    根据单元格字段值显示与其相关的其它表字段内容,如部门代码字段显示为部门名称。首先需在当前表中新建立一个lookup型字段,设置好关联表的字段和返回字段。多列下拉列表需在单列基础上做进一步设置,在LookupDisplayFields中以号将关联表中多个字段分隔开,而且返回字段必须作为其中的第一项。具体设置如下:
 
dropdownshowtitlestrue 
dropdownsizingtrue
dropdownwidth-1 
 
    例:当前表中只有部门代码无部门名称列,需与部门表建立关联,当点击单元格时以部门代码、部门名称两列下拉列表形式显示。
 
 4、显示日历下拉列表
    Date  DateTime类型字段值均可以此形式显示。外观与编辑框无异,当点击该单元格时,右侧会出现“▽”符号,点击之即可出现日历下拉列表。有时不希望出现日历下拉列表,只需设置Column.ButtonStyle属性为 cbsNone即可,此方法同样适用于其它组件不以特殊外观显示的情况。
 
 53D或平面外观效果
    设置OptionsEh属性 中fixed, frozen, footer  data rows等属性表格外观为3D效果,设置flattrue则为平面外观效果.
 
 6、锁定多列不滚动
    当表格水平方向信息在一屏幕显示不下时,此项功能非常有用。例如,工资表格中包含姓名、基本工资、绩效工资等信息一屏幕显示不下,需要通过移动水平滚动条显示下一屏信息。如果不锁定关键字段列如姓名,则移动到下一屏时就不知道此条记录对应的姓名。因此,在实际应用中经常需锁定多列不滚动。
 
    例:姓名字段为表格第二列,则设置FrozenCols=2.这样当一屏幕显示不下,通过移动水平滚动条显示下一屏信息时,表格前两列不滚动,作为参照列。
 
D、导入/导出数据
    导入/导出数据在实际处理过程中是比较烦琐的。但是Enlib3.0提供了一系列函数让你轻松实现此功能,而且支持的文件格式很多:Text, Csv, HTML, RTF, XLS 和内部数据格式。除此之外,还可对任意选择的数据区域进行操作。函数如下:
 
Pascal: SaveDBGridEhToExportFile(TDBGridEhExportAsText,DBGridEh1,'c:\temp\file1.txt',False);
 
C++: SaveDBGridEhToExportFile(__classid(TDBGridEhExportAsText),DBGridEh1,"c:\\temp\\file1.txt",false);
 
说明:其中false参数表示导出的是选中的局部数据区域数据,true则为整个表格数据。
 
   例:将当前表格中数据导出为EXCEL等格式文件。
    在窗体中添加一个SaveDialog组件和导出按钮B_exp,在导出按钮的click事件中添加如下代码:
 
procedure TForm1.B_expClick(Sender: TObject);
var 
  ExpClass:TDBGridEhExportClass;
  Ext:String;
begin
  SaveDialog1.FileName := 'file1';
  if (ActiveControl is TDBGridEh) then
    if SaveDialog1.Execute then
    begin
      case SaveDialog1.FilterIndex of
        1: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
        2: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
        3: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
        4: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'rtf'; end;
        5: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
      else
        ExpClass := nil; Ext := '';
    end;
    if ExpClass <> nil then
    begin
      if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <> UpperCase(Ext) then
        SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
      SaveDBGridEhToExportFile(ExpClass,DBGridEh1,SaveDialog1.FileName,False);
      //其中false为局部数据
    end;
  end;
end;
 
E、将存在的DBGrid组件转换为DBGridEh组件. 
    通过笔者上述介绍,想必你已经对Enlib组件包产生好感而且越越欲试了,那就赶快下载使用吧。但是,使用一段时间并且喜欢上它后,你又有新的问题产生了,那就是为了保持界面风格一致,能否将已经开发完成的应用程序中的DBGrid组件能否转换为DBGridEh组件,进行一次彻底革命?答案是肯定的。尽管DBGridEh并不是继承于CustomDBGrid组件, 但是DBGridEhDBGrid它们之间有许多相同之处.因此可以相互转换。
 
具体步骤如下:
 1、在Delphi IDE下打开TDBGrid组件.
 2、通过组合键Alt-F12form 以文本方式显示;
 3、将所有TDBGrid 对象名改变为 TDBGridEh对象名,如:DBGrid1: TDBGrid改为 DBGrid1: TDBGridEh
 4、再次通过组合键Alt-F12将文本方式恢复为form 显示;
 5、将form各相关事件中定义的所有TDBGrid改为TDBGrideh,DBGrid1: TDBGrid改为DBGrid1: TDBGridEh;
 6、重新编译应用程序。
 
 
 
DBGRIDEH Enlib 3.0组件包中的组件之一。Enlib 3.0组件包是一位俄国人为增强Borland系列开发工具功能而开发的第三方组件,它具有界面友好、功能强大、开发效率高、、快速制作预览/打印简单中国式报表等特点。因此,一推出即受到广大Borland程序员的青睐。目前这个版本支持Borland Delphi versions 4567  Borland C++ Builder versions 4 & 5 ,可极大地提高数据库应用系统客户端的性能。许多商品软件如《速达2000》等都使用了该组件。下面本人将使用该组件在实际系统开发过程中的经验总结如下。 
 
Enlib3.0组件包中最重要而且功能最强大的莫过于dbgrideh组件,本文介绍的所有实例均在Delphi 7开发环境下调试通过。
 
一、DBGridEh(增强型表格组件)功能详解
DBGridEh组件无论在外观上还是功能上都非常类似Borland开发工具中现有的dbgrid组件,它除了提供dbgrid组件的全部功能外,还增加了下列新功能:
 
任意选择多行、列或矩形区域的数据.
为多列标题设定共同的父标题行.
表格底部(Footer) 区显示求和、计数和其它统计信息.
自动调整组件宽度与客户区域等宽.
设置标题行、数据行的高度.
超长的标题行、数据行文本自动折行处理.
标题行可作为按钮使用,并可选择是否显示排序标志符(降序升序).
点击列标题可对当前列自动排序而无需编写代码.
能够自动设置删除超长文本显示不下的多余部分,并以省略号()代替.
自动搜索字段(Lookup)数据单元格以单、多列字段下拉列表形式显示.
自动搜索字段(Lookup)数据单元格可进行增量搜索.
可锁定任意列数在屏幕水平方向不滚动.
日期时间控件DateTime picker 可支持TDateField and TDateTimeField两种日期格式.
根据字段不同值显示关联的ImageList 对象图片组中的图片.
隐藏任意列.
显示3D风格的数据区、表尾区和锁定滚动列,制作3D外观表格.
显示Memo类型字段值.
BOOLEAN型数据外,其它数据类型也可以检查框( checkbox )形式显示数据.
使用专门的函数和过程来存取以regini文件格式保存的表格布局(包含各数据列表、数据列访问顺序、列宽、索引标识、行高等信息)文件。
通过设置数据单元格的hintToolTips属性,当移动鼠标到该单元格时,可以显示单元格容纳不下的文本内容.
将组件中数据导入/导出到Text, Csv, HTML, RTF, XLS 和内部数据等多种格式的文件中.
 
DBGridEh组件主要属性见下表(其它属性参见dbgrid):
 
DBGridEh组件事件基本与DBGrid相同,在此不再赘述。
 
 
 
DBGridEH 所有列宽自动适应的实现
interface
THackDBGridEH = class(TCustomdbgrideh)
end;
 
procedure OptimizeGrid(AGrid: TCustomDbGridEh);
 
implementation
procedure OptimizeGrid(AGrid: TCustomDbGridEh);
var
i: integer;
begin
// 優化GRID的寬度
for i := 0 to TDBGridEh(AGrid).Columns.count - 1 do
THackDBGridEH(AGrid).OptimizeSelectedColsWidth(TDBGridEh(AGrid).Columns[i]);
end;
 
 
 
dbgrideh中直接点击title就可按点击的那个字段排序的方法
第一种方法(未测试)
procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
begin
//点击GridEh标题排序
if (Column.Title.SortMarker = smNoneEh) or (Column.Title.SortMarker = smDownEh) then
  begin
   ADOQuery1.SORT := COLUMN.FIELDNAME;
   Column.Title.SortMarker := smUpEh
  end
else
  begin
   ADOQuery1.SORT := COLUMN.FIELDNAME + ' DESC';
   Column.Title.SortMarker := smDownEh
  end;
end; 
 
第二种方法(未测试)
procedure TPrintMai_frm.DBGridEh1TitleClick(Column: TColumnEh);
var
sortstring: string;
begin //进行排序
with Column do
begin
  if FieldName = '' then
   Exit;
  case Title.SortMarker of
   smNoneEh:
    begin
     Title.SortMarker := smDownEh;
     sortstring := Column.FieldName + ' ASC';
    end;
   smDownEh: sortstring := Column.FieldName + ' ASC';
   smUpEh: sortstring := Column.FieldName + ' DESC';
  end; //数据集排序。
  try
   DM.DataModule1.qry2.Sort := sortstring //dataset为实际数据集变量名
  except
  end;
end;
end; 
 
 
 
 
 
 
Delphi 7中的安装方法
 
  1.  EhLib 中的 common  DataService 文件拷贝到 Delphi7 目录中.
  2. TOOLS->Environment Options->Library->Library Path 中添入EHLIB路径。
  3.打开新建文件夹中的 EHLIB70.DPK ,编译一下,但不要安装。
  4.打开Ehlib中的DclEhLib70.DPK,编译,安装 
  5. Delphi 7中打开DclEhLib70.dpk,编译并安装。
  6. 组件面板中出现一个EhLib的组件页。
  7. 打开附带的DEMOS,编译并运行,测试安装成功。
 
 
 
以下是EHLIB的导出代码:(其实EHLIBDEMO1中已有)
 
procedure TInvoiceManager.ppmSaveSelectionClick(Sender: TObject);
var ExpClass:TDBGridEhExportClass;
  Ext:String;
begin
 SaveDialog1.FileName := 'file1';
 if (ActiveControl is TDBGridEh) then
  if SaveDialog1.Execute then
  begin
   case SaveDialog1.FilterIndex of
    1: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
    2: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
    3: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
    4: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'rtf'; end;
    5: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
   else
    ExpClass := nil; Ext := '';
   end;
   if ExpClass <> nil then
   begin
    if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <>
      UpperCase(Ext) then
     SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
    SaveDBGridEhToExportFile(ExpClass,TDBGridEh(ActiveControl),
       SaveDialog1.FileName,False);
   end;
  end;
end;
 
 
 
// 功能:设定 DbGridEh 合计行信息
// 参数: pDbGrid:TDBGridEh;
//     pcFields : string ; 字段列表,字段用逗号分隔
//     pvtType : TFooterValueType ; 统计类型 TFooterValueType = (fvtNon, fvtSum, fvtAvg, fvtCount, fvtFieldValue, fvtStaticText);
// 引用:
// 例如:DbGridEhFoot( DbGridEh1, &acute;Number,Sum&acute;, fvtSum ); 设定数量和金额字段为合计统计
//--------------------------------------------------------------------------------
Procedure DbGridEhFoot( pDbGrid:TDBGridEh; pcFields: string; pvtType : TFooterValueType );
var nFldLoop : integer ;
   cFieldName : string ;
   tmpFldList : TStrings ;
begin
  pDbGrid.FooterRowCount := 1;   // 指定网格尾部统计行行数
  pDbGrid.SumList.Active := true;  // 激活统计
  pDbGrid.FooterColor   := clBtnFace ;  // 指定统计行颜色
  tmpFldList := TStringList.Create ;
  StrToStringList( Uppercase(pcFields),&acute;,&acute;,tmpFldList );  // 将字符串转换为串列表
  For nFldLoop := 0 to pDbGrid.Columns.Count -1 do
  begin
    cFieldName := pDbGrid.Columns[nFldLoop].FieldName ;  // 网格列字段名
    if tmpFldList.IndexOf( uppercase( cFieldName ) ) >= 0 then
    begin
     pDbGrid.Columns[nFldLoop].Footer.ValueType := pvtType ;  // 统计类型
    end;
  end ;
  tmpFldList.Free ;
end;
 
 
 
 
 
 
一、如何在程序中确定Ehlib定义的报表表头颜色? 
在执行打印之前,加上下面的语句:
DBGridEh1.FixedColor:=clLime;//clLime可以换成你想要的颜色比如clRed是红色等等
PrintDBgridEh1.Options:=[pghColored,pghFitingByColWidths];//方括号里的"pghColored"是必需的,其它的根据你的需要决定取舍
 
二、Ehlib中的PrintDBGridEh如何印页码,即第几页共几页
PrintDBGridEh.PageFooter.CenterText:='&[Page]页 共&[Pages]'
在对象管理器中的相关位置有设
 
三、本人刚学习使用ehlib包,现在要实现类似ehlib所带demo1中一个功能:点击dbgrid某列值
的下拉按纽(可以设置),弹出一个下拉列表(其内容是另一个dataset的)。我看demo1
好象是使用了DBLookupComboboxEh,可我参看demo1怎么设置也不行,请指教。谢谢。
 
呵呵,这个效果没有用DBLoookupComboBoxEh,它是利用查找字段实现的。
它在Query1中,对应VName字段,增加了一个叫VName1的查找字段,这个
字段从qrVendors查找相关的数据,再在DBGridEh1显示VName1,这样显示
就是那种效果了。 
 
四、Ehlib 怎样固定某几列?
只要设置dbGridEhFrozenCols属性为几列即可.
3 使用 TDBGridEh 组件
理解 TDBGridEh, TDataLink 以及 TDataSet. 
All below text in equal degrees pertains as to TDBGridEh component as to TDBGrid component.
A TDBGridEh control lets you view and edit records in a dataset in a tabular grid format.
TDBGridEh does not story data in in itself, it only show data from dataset via TDataLink object. Every database control have internal TDataLink object to interaction with dataset. You can connect TDBGridEh to dataset using DataSource property. If you already use TStringGrid component you can see that data shows in TStringGrid and in TDBGridEh very similarly, but mechanism that use to show data in TStringGrid and in TDBGridEh very different. In TStringGrid count of rows is equal of rows in array of strings while in TDBGridEh (and TDBGrid) count of rows always not more then count of visible rows and although vertical scrollbar can display thumb position regarding the count of record in dataset it take info not from grid but directly from dataset. TDataSet don't allows us to work with data as with array of data i.e. we can not quickly get value of the field from certain record, some types of dataset have not even such notion as record number (in such datasets we can only know that we inhere in the begin of dataset or in the end of its or somewhere between, in that case DBGrid shows vertical vertical scrollbar only in three positions). But to have possibility to draw several record simultaneously TDataLink object allows to have buffer of records (record buffer window) with quick readonly access. DBGrid use this possibility of datalink and set size of record buffer window equal of count of visible rows in grid. We can not control what record must be first in this buffer, DataLink itself scroll record buffer window then we navigate through the dataset and it control the scrolling of record buffer window as that the active record as always in record buffer window. It is a reason why the active record change position when users change thumb position of vertical scrollbar using mouse. 
 
TDBGridEh和纵向滚动条 
If you works with different type of dataset you can notice that for some type of dataset DBGrid show vertical scrollbar validly but for over vertical scrollbar have only three position independently of record count in dataset. To set vertical scrollbar accomodation DBGrid use RecordCount and RecNo property of DataSet component. But some dataset and even same dataset under some condition holds -1 in RecordCount and RecNo. DataSet function IsSequenced indicates whether the underlying database table uses record numbers to indicate the order of records. When IsSequenced returns True, applications can safely use the RecNo property to navigate to records in the dataset and DBGrid use RecNo property to show thumb position in vertical scrollbar. But when IsSequenced returns False DBGrid can not define current record position and show vertical scrollbar in three positions. DBGridEh component have possibility to show proportional scrollbar for no sequenced dataset. To do it need to activate SumList and create list of record bookmars. Set SumList.Active to True and SumList.VirtualRecords to True. SumList will run through dataset and create list of record bookmarks, if you use client/sever technology to access database SumList will force dataset to fetch all records, so it operation can take much time. Keep in mind that VirtualRecords will work only for full relationship bookmarks dataset, it means that DataSet.ComapreBookmark function has to return > 0 if bookmark1 > bookmark1 (i.e. record to which indicates bookmark1 have to be after record to which indicates bookmark1), = 0 if bookmark1 = bookmark1, < 0 if bookmark1 = bookmark1. TBDEDataSet in most cases support full relationship bookmarks.
 
 
定制网格标题 
复杂标题 
TDBGridEh 允许在多列上创建标题,例如: 
 
设置 DBGridEh.UseMultiTitle 属性为 True 并且填充字段的标签或列标题的标题,可以使用下面的规则:字段标签中的文本部分或列标题必须由几部分组成,并且用 "|" 分割,几个列的每一个通用部分都设置为相同。其它字段或标题必须在相应的部分包含同样的文本。 
 
例如:
 
Field1.DisplayLabel := 'Title1|SubTitle1';
Field2.DisplayLabel := 'Title1|SubTitle2';
DBGridEh.Columns[0].Title.Caption := 'Title1|SubTitle1';
DBGridEh.Columns[1].Title.Caption := 'Title1|SubTitle2'; 
按钮式标题 
设置Column.Title.TitleButton  True可以强制标题单元为按钮式。写 OnTitleBtnClick事件来控制用户单击标题单元时的操作。 
 
在标题中显示位图 
To show bitmap in titles instead of caption use TitleImages property of TDBGridEh and ImageIndex property of TColumnTitleEh. 
 
自动用位置标识排序标题. 
TDBGridEh allows to show special sortmarking bitmaps (small triangles) in the right part of title cell. In order to automatically marking title by sortmarking bitmaps add dghAutoSortMarking to OptionsEh property. Add dghMultiSortMarking too in order to allow sortmarking several columns simultaneously. Set Column.Title.TitleButton to true for titles which will have possibility to change sortmarkers at run time. At runtime clicking on title will change sortmarking. Holding Ctrl key allows to mark several columns simultaneously. After user change sormarking grid call OnSortMarkingChanged event. You can write this event to change sorting and reopen in dataset. Use SortMarkedColumns property to access to sortmarked columns. 
 
标题属性的默认值 
使用TDBGridEh.ColumnDefValues.Title来设置标题属性的默认值。 
 
定制网格页脚 
页脚以及统计值 
TDBGridEh allows to show special row (footer) or rows at bottom part. Use FooterRowCount property to specify the number of footer rows in the grid. Use Footer or Footers property of TColumnEh object to specify information which need to show in footer cells. Footers property useful then you have more then one footer rows. Footers is a collection of TColumnFooterEh objects where information from i-th aliment of collection will be show in i-th cell of footer column. In footer cell, it is possible to show: Sum value for specified field, record count, value of a specified field or static text. Use property Footer.ValueType or Footers[i].ValueType to specify which type of value will be show in footer cell. If ValueType = fvtStaticText, then set the property Value to specify text which need to show. If ValueType = fvtFieldValue, then you need to set property FieldName to specify field, value of which need to show. To force grid to calculate total values need to activate SumList (DBGridEh.SumList.Active := True). Set ValueType to fvtSum and grid must to show sum value of the column field in the footer cell, you can also specify Column.Footer.FieldName to calculate total value of the other field. Set ValueType to fvtCount to force grid to show count of records in the footer cell.
 
 
定制网格数据单元 
在数据单元中显示字段值为图形。 
TDBGridEh allows to show bitmaps from TImageList component depending on field values. To show bitmaps depending on field values need: Fill list of field values to Column.KeyList property (every value in separate line) and set Column.ImageList property to ImageList control that has the bitmap in according index. Set Column.NotInKeyListIndex to index of bitmap that will be shown if field's value does not correspond to any value in KeyList (for instance you can set index of image for Null field value). At run time you are not allowed to edit bitmap in column cell. Use blank key and mouse click to set next value from Column.KeyList to the field; Shift-blank key and Shift-Mouse click to set previous value from Column.KeyList. Set Column.DblClickNextval to True have allows to change value on mouse double click. 
 
检查框式的逻辑及非逻辑值
Grid automatically shows checkboxes for boolean field. To show checkboxes for non boolean fields fill first line of Column.KeyList property that corresponds to the checked state of the checkbox, second line - non checked state, and set Column.Checkboxes ptoperty to True. Line of KeyList can represent more than one value in a semicolon-delimited list of items. 
 
数据行高度 
使用 RowHeight  RowLines 属性来指定数据行高。完整的数据行高 = 行线高度+行高。设置 RowSizingAllowed  True 以允许可以在运行是使用鼠标来改变行高。
 
设置Column.WordWrapTrue可以使数据行中文本多行显示。如果行高>文本行,它就换行。 
 
显示备注字段 
设置 DrawMemoText to True来显示文本式的备注字段。. 
 
定制单元格字体及颜色 
TDBGridEh 中的 Font  Color 属性描述了数据网格中绘制单元格的字体和颜色。
TColumnEh 中的 Font  Color 属性描述了指定列中绘制单元格的字体和颜色。 
 
事件定制单元格字体及颜色 
有几个事件可以让你能够在绘制单元格前定制单元格字体和颜色。你可以写TDBGridEhOnDrawColumnCellEvent事件句柄来在控制在网格单元中绘制数据。你可以使用Canvas属性的方法来绘制单元格。但是如果你只想改变字体或颜色的属性,我建议你使用下面的事件。你可以写TDBGridEhOnGetCellParams事件来控制在绘制数据单元以前所指定的操作。你可以改变绘制字体及背景色。这个事件适合你在想改变整行的字体或颜色时使用。如果你想改变指定列中单元格的属性,你可以使用TColumnEh.OnGetCellParams。写这个事件用来控制在一列数据单元被重绘或编辑时的操作。在一列数据单元被重绘以前,你可以改变绘制字体,背景色,对齐方式,图像索引,文本或检查框。在编辑一列数据单元以前,你可以改变编辑字体,背景色,文本或只读状态。 
 
列属性的默认值 
 
使用ColumnDefValues属性来设置列属性的默认值。新创建的列将从ColumnDefValues属性中获得属性值,并且直到第一次为其指定值为止。
 
 
在网格的适当位置放置编辑器. 
在下拉列表中显示几个字段。 
在下拉列表中显示几个下拉字段,需要设置列的LookupDisplayFields属性到字段的Semicolons属性来分割多个字段名。命名为Column.Field.LookupResultField的属性必须位于LookupDisplayFields列表中。多字段的下拉列表只能应用于下拉字段。 
 
显示下拉方式的列 
 
你可以通过KeyList  PickList 属性在相关的的字段中显示其它文本。KeyList显示包含在字段的值而非PickList索引所包含的值。 Column.NotInKeyListIndex to index of text from PickList that will be shown if field value do not contain in KeyList (for instance you can set index of text for Null field value). Set Column.DblClickNextval to True to change value on mouse double click. 
 
下拉式计算器 
对于 TDateField  TDateTimeField 字段,inplace 编辑器将显示下拉按钮以显示显示下拉计算器。设置 Column.ButtonStyle  cbsNone 以禁止显示下拉按钮。 
 
设置编辑器颜色和字体 
Inplace编辑器可以设置数据单元的颜色和字体。数据单元使用OnGetCellParams 事件来控制列的颜色和字体。 Inplace 编辑器在行高>一行的高度时自动设置为多行模式并且将列的属性 WordWrap 设置为True.
 
 
自动填充网格列宽到网格客户区 
设置AutoFitColWidthsTrue以自动重置列宽来设置网格的宽度等于客户区宽度。 MinAutoFitWidth 属性决定网格的最小宽度,列宽将会被重新计算。 
3D或平面外观 
使用 OptionsEh 属性来显示/隐藏固定的3D框架,冷区,页脚以及数据行。 
 
使用 Flat 属性来设置用平面方式显示数据网格。 
 
从多种格式导入/导出数据到TDBGridEh 
EhLib 的函数集可以从DBGridEh导出数据到Text, Csv, HTML, RTF, XLS以及其内部格式。它可以保存数据到流(TStream对象)或文件。 
 
例子
Pascal: SaveDBGridEhToExportFile(TDBGridEhExportAsText,DBGridEh1,'c:\temp\file1.txt',False);
C++: SaveDBGridEhToExportFile(__classid(TDBGridEhExportAsText),DBGridEh1,"c:\\temp\\file1.txt",false); 
 
EhLib 的函数集可以从 Text以及其内部格式的数据导入到DBGridEh的数据集中。它可以从文件中读取数据或读取数据到流(TStream对象)。 
 
其它特性 
lookup 编辑器,你可以在运行时清空(设置为Null LookupKeyField 值。比如选择整个文本然后按Delete键。 
 
冷区 
冷区是数据网格列集左边显示的不可滚动的区域。与固定列不同的是,冷区的列可以获得编辑焦点。可以通过设置FrozenCols属性来设置右边不可滚动的列集。 
 
增量搜索 
 
TDBGridEh 允许用户在网格列中实现特定的增量搜索。当用户进入增量搜索时他可以显示字符以及网格,并且在当前的列中查找文本。使用 dghIncSearch  dghPreferIncSearch的值(在OptionsEh 选项中) 在数据网格中操作增量搜索。 dghIncSearch 值允许在数据网格中进行增量搜索。运行时你能够使用下面的键进行增量搜索:
 
Ctrl+F - 开始增量搜索。
Ctrl+Enter - 查找下一个匹配记录。
Ctrl+Shift+Enter - 查找前一个匹配记录。
 
如果OptionsEh选项中的 dghIncSearch 是只读的,那么网络将自动设置增量模式在第一次按键以及1.5秒后返回普通模式。 dghPreferIncSearch 值决定网格设置自动增量搜索模式在第一次按键时替代单元编辑。
 
水平或垂直滚动条 
使用 VertSctollbar, HorzSctollbar 属性来显示/隐藏以及跟踪水平或垂直滚动条。 
 
多选 
TDBGridEh 允许在选定的区域上进行选择记录,列以及矩形区域等操作: 
 
允许多选会影响下面这些属性: 
 
Options选项中的dgMultiSelect属性 - 设置是否允许多选。 
 
Options选项中的dghClearSelection 属性- 设置在用户移到下一个单元时是否清除已选记录。 
 
Options选项中的EditActions属性 -设置用户可以在已选记录上执行哪些操作(比如,拷贝,剪切,删除,粘贴,全选等)。 
 
Options选项中的AllowedSelections属性-设置允许选定记录的类型(比如,行,列,矩形区域等)。 
 
Options选项中的Selection属性-设置一个当前的多选状态,已选记录,列或矩形区域以及存取它们的属性和函数。 
 
从注册表或ini文件中保存或恢复网格和列的层次。 
TDBGridEh 有一个常规设置来从注册表或ini文件中保存和恢复网络以及列的层次: 
 
RestoreColumnsLayout - 从注册表中恢复列的次序,宽度,排序标志。 
 
RestoreColumnsLayoutIni - ini文件中恢复列的次序,宽度,排序标志。 
 
RestoreGridLayout - 从注册表中恢复列的次序,宽度,可视,排序标志,排序索引或行高。 
 
RestoreGridLayoutIni - ini文件中恢复列的次序,宽度,可视,排序标志,排序索引或行高。 
 
SaveColumnsLayout - 保存列的次序,宽度,排序标志到注册表中。 
 
SaveColumnsLayoutIni - 保存列的次序,宽度,排序标志到ini文件中。 
 
SaveGridLayout - 保存列的次序,宽度,可视,排序标志,排序索引或行高到注册表中。 
 
SaveGridLayoutIni - 保存列的次序,宽度,可视,排序标志,排序索引或行高到ini文件中。 
 
当前版本的TDBGridEh不支持的特性: 
这个版本的TDBGridEh不支持下面的特性: 
 
TDBGridEh 不能设置每一个数据窗口中单独行的行高。 
 
TDBGridEh 不能象TreeView那样工作。它不能拥有节点和枝叶。 
 
TDBGridEh 不能横向或纵向合并数据单元。 
 
将已存在的TDBGrid组件转换为TDBGridEh组件: 
 
尽管TDBGridEh并不是从TCustomDBGrid组件继承而来的,但是在TDBGridEhTDBGrid中还是有一些相似的属性。 
 
它允许仅用一点点代价来转换已存在的TDBGrid组件到TDBGridEh 
 
可以按照下面的提示来转转换已存在的TDBGrid组件到TDBGridEh 
 
DelphiIDE中打开包含有TDBGrid组件的应用程序。 
 
设置视图方式为文本方式(Alt-F12)。 
 
将所有的TDBGrid对象改名为TDBGridEh'比如,将object DBGrid1: TDBGrid'改为 'object DBGrid1: TDBGridEh')
 
重新编译你的应用程序。 
 
 
 
5 使用 TDBSumList 组件
TDBSumList说明 
你可以使用TDBSumList在可视动态变化数据集中进行记录统计。在你想查看的数据集中设置相关的数据字段,然后写 SumListChanged 事件来指定在TDBSumList发生改变后所要做的操作。TDBSumList  SumCollection 属性上一个 TDBSum 对象容器。每个 TDBSum 对象是一个可以指定集合值的元件。 FieldName  GroupOperation 决定了集合值的类型,SumValue 控制当前的集合值。
 
TDBSumList 被埋藏于 DBGridEh 组件中,因此所的下面有关TDBGridEh.SumList 的说明与TDBGirdEhTDBGridEh.SumList 属性的说明是一样的。
 
如何工作以及为什么有时SumList的集合值计算不正确?
你知道 data-aware 控件与数据集是通过 TDataLink 对象相连接的。 TDataLink 不允许快速重新计算集合值。例如,当从数据集中删除记录时,数据集发送deDataSetChange事件给所有的TDataLink对象,在当前局部过滤发生改变时,同样的事件也被发送了。因此当 TDataLink 接收到该事件时,它不得不在所有的数据集中重新计算集合值,甚至于仅从数据集中删除一条记录。在激活后, TDBSumList 重载了数据集的下列事件: OnAfterEdit, OnAfterInsert, OnAfterOpen, OnAfterPost, OnAfterScroll, OnBeforeDelete, OnAfterClose。这种方法避免了在所有的数据集中它。在不需要它时,又会出现其它的问题,比如: T
运行时指定这些事件。在指定上述事件之一以前,关闭 SumList
在下面的情形下,SumList 发出存取错误信息。 SumList 试着向数据集返回事件,但数据集数据并未被删除。在SumList(或网格)以及数据集放置在不同的窗体(数据模块)这种情况下,可以显示数据。在这种情况下,试着在从数据集或数据模块中数据集数据被删除时关闭SumList
如果你使用SetRangeApplyRange事件,SumList 将不能跟踪数据集中发生的变化。但可以调用 SumList.RecalAll 方法。
在非BDE数据集的主/明细表中,SumList 不能跟踪数据变化。在主数据集激活状态数据集发生变化后,调用 SumList.RecalAll 方法。
在任何其它情况下,如果你发现了其它SumList的计算值不正确,你都可以调用 RecalAll方法。 
 
 
4 使用 TPrintDBGridEh 组件 
 Delphi  IDE 组件面板中选择 TPrintDBGridEh 并拖放其到 form 上。在 其 DBGridEh 属性中设置为相应的 TDBGridEh 组件。使用 Print 以及 Preview 方法在打印机上打印网格或者在预览窗体中预览网格。 
网格前以网格后的 RTF 文本 
TPrintDBGridEh 允许在打印 / 打印预览网格前或网格后的 RTF 文本。使用 AfterGridText 以及 BeforeGridText 属性来指定文本。 你可以在打印 / 打印预览时通过 BeforeGridText  AfterGridText 属性来替换文本内容。 
当前版本的 TPrintDBGridEh 不支持的特性。 
这个版本不支持下面的特性: 
TPrintDBGridEh 不能在一页中打印 / 打印预览多个网格。 
问答列表 : 
 : 怎样进行横向打印 / 打印预览? 
 : TPrintDBGridEh 并没有专六的属性来设置页面特性。在调用打印或打印预览方法前,你必须设置你将要执行打印的打印源( Orientation )。 
uses ......, PrViewEh, Printers. 
.............. 
procedure TForm1.bPreviewClick(Sender: TObject); 
begin 
PrinterPreview.Orientation := poLandscape; 
PrintDBGridEh1.Preview; 
end ;
 
 
DBGrid介绍:
 Delphi 语言的数据库编程中,DBGrid 是显示数据的主要手段之一。但是 DBGrid 缺省的外观未免显得单调和缺乏创意。其实,我们完全可以在我们的程序中通过编程来达到美化DBGrid 外观的目的。通过编程,我们可以改变 DBGrid 的表头、网格、网格线的前景色和背景色,以及相关的字体的大小和风格。
   以下的示例程序演示了对 DBGrid 各属性的设置,使 Delphi 显示的表格就像网页中的表格一样漂亮美观。
   示例程序的运行:
    Form1 上放置 DBGrid1Query1DataSource1 三个数据库组件,设置相关的属性,使 DBGrid1 能显示表中的数据。然后,在 DBGrid1  onDrawColumnCell 事件中键入以下代码,然后运行程序,就可以看到神奇的结果了。本代码在 Windows98Delphi5.0 环境下调试通过。
procedure TMainForm.DBGrid1DrawColumnCell(Sender: TObject;
 const Rect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState);
var i :integer;
begin
 if gdSelected in State then Exit;
//定义表头的字体和背景颜色:
   for i :=0 to (Sender as TDBGrid).Columns.Count-1 do
   begin
     (Sender as TDBGrid).Columns[i].Title.Font.Name :='宋体'; //字体
     (Sender as TDBGrid).Columns[i].Title.Font.Size :=9; //字体大小
     (Sender as TDBGrid).Columns[i].Title.Font.Color :=$000000ff; //字体颜色(红色)
     (Sender as TDBGrid).Columns[i].Title.Color :=$0000ff00; //背景色(绿色)
   end;
//隔行改变网格背景色:
 if Query1.RecNo mod 2 = 0 then
   (Sender as TDBGrid).Canvas.Brush.Color := clInfoBk //定义背景颜色
 else
   (Sender as TDBGrid).Canvas.Brush.Color := RGB(191, 255, 223); //定义背景颜色
//定义网格线的颜色:
   DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
 with (Sender as TDBGrid).Canvas do // 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; 
 
 问题: Delphi5 - 隔行改变DBGrid网格颜色    Form1 上放置 DBGrid1Query1DataSource1 三个数据库组件,设置相关的属性,使 DBGrid1 能显示表中的数据。然后,在 DBGrid1  onDrawColumnCell 事件中键入以下代码,然后运行程序
 
代码:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
 
var i:integer;
begin
 if gdSelected in State then Exit;  //隔行改变网格背景色: 
   if adoQuery1.RecNo mod 2 = 0 then
     (Sender as TDBGrid).Canvas.Brush.Color := clinfobk //定义背景颜色
 else
   (Sender as TDBGrid).Canvas.Brush.Color := RGB(191, 255, 223);  //定义背景颜色
 
 //定义网格线的颜色:
 DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
 with (Sender as TDBGrid).Canvas do // 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-11 17:12:09    DelphiDBGrid中插入其他可视组件   Delphi提供了功能强大的 DBGrid组件,以方便进行数据库应用程序设计。但是如果我们仅仅利用DBGrid组件,每一个获得焦点(Grid)只是一个简单的文本编辑框,不方便用户输入数据。Delphi也提供了一些其他数据组件来方便用户输入,比如DBComboBoxDBCheckBox等组件,但这些组件却没有DBGrid功能强大。Delphi能不能象Visual Foxpro那样让DBGrid中获得焦点网格可以是其它可视数据组件以方便用户呢?其实我们可以通过在DBGrid中插入其他可视组件来实现这一点。
 
   DelphiDBGrid处理的内部机制,就是在网格上浮动一个组件——DBEdit组件。你输入数据的网格其实是浮动DBEdit组件,其他未获得焦点地方不过是图像罢了。所以,在DBGrid中插入其他可视组件就是在网格上浮动一个可视组件。因此任何组件,包括从简单的DbCheckBox到复杂的对话框,都可以在DBGrid中插入。下面就是一个如何在DBGrid中插入DBComboBox组件的步骤,采用同样的办法可以插入其他组件。
 
 1、在Delphi 4.0中新建一个项目。
 
 2、分别拖动的Data Access组件板上DataSourceTableData Controls组件板上DBGridDBComboBox四个组件到Form1上。
 
 3、设置各个组件的属性如下:
 
rcf1对象 属性 设定植
Form1 Caption 'DBGrid中插入SpinEdit组件示例'
DataSource1 DataSet Table1
Table1 DatabaseName DBDEMOS
TableName 'teacher.DBF'
Active True
DBGrid1 DataSource DataSource1
DBComboBox1 DataField SEX
DataSource DataSource1
Visible False
Strings Items. ''| ''
 
注意:我在这里用了Teacher.dbf,那是反映教职工的性别,只能是或者是
 
 4DrawDataCell事件是绘制单元格,当获得焦点网格所对应的字段与组合框所对应的字段一致时,移动组合框到获得焦点的网格上,并且使组合框可视,从而达到在DBGrid指定列上显示DBComboBox的功能。设置DBGrid1OnDrawDataCell事件如下:
 
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
 if (gdFocused in State) 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;
 
 5DBGrid指定单元格未获得焦点时不显示DBComboBox,设置DBGrid1OnColExit事件如下:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
 If DBGrid1.SelectedField.FieldName = DBComboBox1.DataField then
   begin
     DBComboBox1.Visible := false;
   end;
end;
 
 6、当DBGrid指定列获得焦点时DrawDataCell事件只是绘制单元格,并显示DBComboBox,但是DBComboBox并没有获得焦点,数据的输入还是在单元格上进行。在DBGrid1KeyPress事件中调用SendMessage这个 Windows API函数将数据输入传输到DBComboBox上,从而达到在DBComboBox上进行数据输入。因此还要设置KeyPress事件如下:
 
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
 if (key < > chr(9)) then
 begin
   if (DBGrid1.SelectedField.FieldName =DBComboBox1.DataField) then
   begin
     DBComboBox1.SetFocus;
     SendMessage(DBComboBox1.HandleWM_Charword(Key)0);
   end;
 end;
end;
 
   程序在中文Windows 98Delphi 4.015 下调试通过。希望本文能使你可以更加方便快捷的开发数据库应用程序。  
 
 
 2003-11-11 17:17:56    锁定DBGrid左边的列    我在使用 Delphi3 进行数据库编程的时候,希望 DBGRID 构件在显示数据的时候能象FoxPro  BROWSE 命令一样,锁定左边指定的几列不进行滚动,请问应用什么方法来实现?
 
   我们知道 Delphi  TStringGrid 有一个属性 FixedCols 来指定不滚动的列。虽然TDBGrid 不能直接使用这一属性,但通过强制类型转换也可以首先这一功能,因为这两个类都来自 TCustomGrid 类。下面我们以 Delphi 3.0 Demos\Db\CtrlGrid 为例来说明具体的用法。在这个例子的 TFmCtrlGrid.FormShow 过程中加入如下一行: 
 
   TStringGrid(DbGrid1).FixedCols := 2; 
 
   运行该程序,在左右移动各列时,Symbol 列不会移动。除了这种方法,也可以采用下面的方法:首先在 Form 声明部分加上
 
   type TMyGrid = Class(TDBGrid) end; 
 
   然后在 TFmCtrlGrid.FormShow 过程中加入: 
 
   TMyGrid(DbGrid1).FixedCols := 2; 
 
   两者从形式上略有不同,但实质都是一样的。我们这里设置 FixedCols  2,这是因为在 DBGrid 构件最左侧有个指示列,如果你将 DBGrid  Options 属性的 dgIndicator 设为False,则应设置 FixedCols 1  
 
 
 2003-11-11 17:21:36    使dbgrid的某几笔资料变色   你可在 DBGrid 元件的 DrawDataCell 事件中依资料的条件性来改变格子或文字的颜色.
 :
 
OnDrawDataCell(...)
begin
 with TDBGrid(Sender) do
 begin
   if (条件) then
     Canvas.TextOut(Rect.Left + 4
   Rect.Top + 2
 
'要显示的文字如表格的资料');
end;
 
   而你会看到 DBGrid 的显示资料怎麽有重叠的情况那是因为原本DBGrid要显示的资料与 TextOut 所显示的资料重叠
   解决方法 :
    Query 元件所加入的栏位(在元件上按右键会有 Add Fields...的选单)在不要显示资料的栏位的 OnGetText 事件中有一参数设定为 False;
 
procedure TForm1.Query1Detail1GetText(Sender: TField; var Text: string;
DisplayText: Boolean);
begin
 // 决定在 DBGrid 得知表格资料时要不要显示所得到的资料False -> 不显示
 // 就可避免与 TextOut 的文字重叠了
 DisplayText : = False;
end;
end;
 
   如果用 Delphi 3 处理很简单.例如:对表中某字段当其数值小于0时为红字其他为黑字.
 DBGrid.OnDrawColumnCell(...) :
 
begin
 if TableField.AsInteger < 0 then
   DBGrid.Canvas.Font.Color := clRed
 else
   DBGrid.Canvas.Font.Color := clBlack;
 DBGrid.DefaultDrawColumnCell(...);
end;
 
这样对 Field 指定的格式仍旧生效不必重写.  
 
 
 2003-11-11 17:25:29    实战Delphi数据网格色彩特效   Delphi中的数据网格控件(TDbGrid)对于显示和编辑数据库中大量的数据起着十分重要的作用;然而,在使用数据网格控件的同时,也往往因为表格中大量的数据不易区分,而令操作者眼花缭乱。如何提高网格控件的易用性,克服它的此项不足呢?本文从改变数据网格的色彩配置角度,提出了一种解决办法。
 
   以下为数据网格控件的6种特殊效果的实现方法,至于数据网格控件与数据集如何连接的方法从略。
 
1. 纵向斑马线效果:实现网格的奇数列和偶数列分别以不同的颜色显示以区别相邻的数据列。
file://DbGridDrawColumnCell事件中编写如下代码:
 
Case DataCol Mod 2 = 0 of
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://将上述代码修改为:
Case DataCol Mod 2 = 0 of
True: DbGrid1.Canvas.Brush.Color:= clBlue; file://偶数列用蓝色
False: DbGrid1.Canvas.Brush.Color:= clAqua; file://奇数列用浅绿色
End;
If ((State = [gdSelected]) or (State=[gdSelectedgdFocused])) then
If Not DbGrid1.SelectedRows.CurrentRowSelected then
DbGrid1.Canvas.Brush.Color:=clRed; file://当前选中单元格显示红色
DbGrid1.Canvas.Pen.Mode:=pmMask;
DbGrid1.DefaultDrawColumnCell (Rect 
DataCol 
Column 
State);
 
上述两种方法突出了列的显示效果。
 
3.在数据网格中以红色突出显示当前选中的行。
   设置DbGrid控件的Options属性中的dgRowSelect属性为真,Color属性为clAqua(背景色)
DbGridDrawColumnCell事件中编写如下代码:
 
if ((State = [gdSelected]) or (State=[gdSelected gdFocused])) 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
Case DataCol Mod 2 = 0 of
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,将上述代码修改为:
Case Table1.RecNo mod 2 = 0 of file://根据数据集的记录号进行判断
True : DbGrid1.Canvas.Brush.color:=clAqua; file://偶数行用浅绿色显示
False: DbGrid1.Canvas.Brush.color:=clblue; file://奇数行用蓝色表示
end;
if ((State = [gdSelected]) or (State=[gdSelectedgdFocused])) then file://选中行用红色显示
DbGrid1.Canvas.Brush.color:=clRed;
DbGrid1.Canvas.pen.mode:=pmMask;
DbGrid1.DefaultDrawColumnCell (Rect
DataCol
Column
State);
 
6.双向斑马线效果:即行间用不同色区分,同时,选中行以纵向斑马线效果区分不同的列。
 
file://其它属性设置同3,将上述代码修改为:
Case Table1.RecNo mod 2 = 0 of file://根据数据集的记录号进行判断
True : DbGrid1.Canvas.Brush.color:=clAqua; file://偶数行用浅绿色显示
False: DbGrid1.Canvas.Brush.color:= clblue; file://奇数行用蓝色表示
end;
If ((State = [gdSelected]) or (State=[gdSelectedgdFocused])) then
Case DataCol mod 2 = 0 of
True : DbGrid1.Canvas.Brush.color:=clRed; file://当前选中行的偶数列用红色
False: DbGrid1.Canvas.Brush.color:= clGreen; file://当前选中行的奇数列用绿色表示
end;
DbGrid1.Canvas.pen.mode:=pmMask;
DbGrid1.DefaultDrawColumnCell (Rect
DataCol
Column
State);
 
   上述6种方法分别就数据网格控件的列和行的色彩进行了设置,读者可以根据自己的需要设置特效。该程序在Delphi5中测试通过。  
 
 
 2003-11-13 11:11:31    点击DBGridTitle对查询结果排序 关键词:DBGrid 排序  
 
   欲实现点击DBGridTitle对查询结果排序,想作一个通用程序,不是一事一议,例如不能在SQL语句中增加Order by ...,因为SQL可能原来已经包含Order by ...,而且点击另一个Title时又要另外排序,目的是想作到象资源管理器那样随心所欲。
 
procedure TFHkdata.SortQuery(Column:TColumn);
var
 SqlStr,myFieldName,TempStr: string;
 OrderPos: integer;
 SavedParams: TParams;
begin
 if not (Column.Field.FieldKind in [fkData,fkLookup]) then exit;
 if Column.Field.FieldKind =fkData then
   myFieldName := UpperCase(Column.Field.FieldName)
 else
   myFieldName := UpperCase(Column.Field.KeyFields);
 while Pos(myFieldName,';')<>0 do
 myFieldName := copy(myFieldName,1,Pos(myFieldName,';')-1)+ ',' + copy(myFieldName,Pos(myFieldName,';')+1,100);
 with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
 begin
   SqlStr := UpperCase(Sql.Text);
   // if pos(myFieldName,SqlStr)=0 then exit;
   if ParamCount>0 then
   begin
     SavedParams := TParams.Create;
     SavedParams.Assign(Params);
   end;
   OrderPos := pos('ORDER',SqlStr);
   if (OrderPos=0) or (pos(myFieldName,copy(SqlStr,OrderPos,100))=0) then
     TempStr := ' Order By ' + myFieldName + ' Asc'
   else if pos('ASC',SqlStr)=0 then
     TempStr := ' Order By ' + myFieldName + ' Asc'
   else
     TempStr := ' Order By ' + myFieldName + ' Desc';
   if OrderPos<>0 then SqlStr := Copy(SqlStr,1,OrderPos-1);
   SqlStr := SqlStr + TempStr;
   Active := False;
   Sql.Clear;
   Sql.Text := SqlStr;
   if ParamCount>0 then
   begin
     Params.AssignValues(SavedParams);
     SavedParams.Free;
   end;
   Prepare;
   Open;
 end;
end;
 
 
 
 2003-11-13 11:13:57    去掉DbGrid的自动添加功能 
关键词:DbGrid  
 
   移动到最后一条记录时再按一下就会追加一条记录,如果去掉这项功能 
   procedure TForm1.DataSource1Change(Sender: TObject; Field: TField);
   begin
     if TDataSource(Sender).DataSet.Eof then TDataSource(Sender).DataSet.Cancel;
   end;
 
 
 
 
 
 2003-11-16 12:05:46    DBGrid不支持鼠标的上下移动的解决代码(感谢 wangxian11 提供)自己捕捉WM_MOUSEWHEEL消息处理
private
 OldGridWnd : TWndMethod;
procedure NewGridWnd (var Message : TMessage);
public
 
procedure TForm1.NewGridWnd(var Message: TMessage);
var
 IsNeg : Boolean;
begin
 if Message.Msg = WM_MOUSEWHEEL then
 begin
   IsNeg := Short(Message.WParamHi) < 0;
   if IsNeg then
     DBGrid1.DataSource.DataSet.MoveBy(1)
   else
     DBGrid1.DataSource.DataSet.MoveBy(-1)
 end
 else
   OldGridWnd(Message);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 OldGridWnd := DBGrid1.WindowProc ;
 DBGrid1.WindowProc := NewGridWnd;
end;      
 
 
 2003-11-17 14:46:56    dbgrid中移动焦点到指定的行和列   dbgrid是从TCustomGrid继承下来的,它有colrow属性,只不过是protected的,不能直接访问,要处理一下,可以这样:
 
   TDrawGrid(dbgrid1).row:=row;
   TDrawGrid(dbgrid1).col:=col;
   dbgrid1.setfocus;
就可以看到效果了。
 
   1 这个方法是绝对有问题的,它会引起DBGrid内部的混乱,因为DBGrid无法定位当前纪录,如果DBGrid只读也就罢了(只读还是会出向一些问题,比如原本只能单选的纪录现在可以出现多选等等,你可以自己去试试),如果DBGrid可编辑那问题就可大了,因为当前纪录的关系,你更改的数据字段很可能不是你想象中的
   2 我常用的解决办法是将上程序改为(随便设置col是安全的,没有一点问题)
 
   Query1.first;
   TDrawGrid(dbgrid1).col:=1;
   dbgrid1.setfocus;
 
   这就让焦点移到第一行第一列当中 
 
 
 2003-11-17 14:55:26    如何使DBGRID网格的颜色随此格中的数据值的变化而变化?   在做界面的时候,有时候为了突出显示数据的各个特性(如过大或者过小等),需要通过改变字体或者颜色,本文就是针对这个情况进行的说明。
 
   如何使DBGRID网格的颜色随此格中的数据值的变化而变化。如<60的网格为红色?
   Delphi中数据控制构件DBGrid是用来反映数据表的最重要、也是最常用的构件。在应用程序中,如果以彩色的方式来显示DBGrid,将会增加其可视性,尤其在显示一些重要的或者是需要警示的数据时,可以改变这些数据所在的行或列的前景和背景的颜色。
  DBGrid属性DefaultDrawing是用来控制Cell(网格)的绘制。若DefaultDrawing的缺省设置为True,意思是Delphi使用DBGrid的缺省绘制方法来制作网格和其中所包含的数据,数据是按与特定列相连接的Tfield构件的DisplayFormatEditFormat特性来绘制的;若将DBGridDefaultDrawing特性设置成FalseDelphi就不绘制网格或其内容,必须自行在TDBGridOnDrawDataCell事件中提供自己的绘制例程(自画功能)。
  在这里将用到DBGrid的一个重要属性:画布Canvas,很多构件都有这一属性。Canvas代表了当前被显示DBGrid的表面,你如果把另行定义的显示内容和风格指定给DBGrid对象的CanvasDBGrid对象会把Canvas属性值在屏幕上显示出来。具体应用时,涉及到CanvasBrush属性和FillRect方法及TextOut方法。Brush属性规定了DBGrid.Canvas显示的图像、颜色、风格以及访问Windows GDI 对象句柄,FillRect方法使用当前Brush属性填充矩形区域,方法TextOut输出Canvas的文本内容。
 
  以下用一个例子来详细地说明如何显示彩色皼/div>

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多