收藏 分享(赏)

TDBGrid控件中对多个记录的处理.doc

上传人:jinchen 文档编号:6975413 上传时间:2019-04-29 格式:DOC 页数:20 大小:85KB
下载 相关 举报
TDBGrid控件中对多个记录的处理.doc_第1页
第1页 / 共20页
TDBGrid控件中对多个记录的处理.doc_第2页
第2页 / 共20页
TDBGrid控件中对多个记录的处理.doc_第3页
第3页 / 共20页
TDBGrid控件中对多个记录的处理.doc_第4页
第4页 / 共20页
TDBGrid控件中对多个记录的处理.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、TDBGrid 控件中对多个记录的处理唐成斌 DELPHI 的 TDBGrid 控件主要用来处理数据表,它的属性中有一个 dgMultiSelect,若此属性设定为TRUE,则可以选中多个记录(可用 CTRL鼠标左键选择多个记录)。对选中的多个记录可以有以下几种处理方式,比较简单的两种是:清除所有的选择记录可用 DBGrid1.SelectedRows.Clear 语句;删除所有的选择记录可用 DBGrid1.SelectedRows.Delete 语句。但如果想获得选中的所有记录的其他信息,比如,在单独的一个窗体中显示用户选择的记录的第一个字段的内容(如所有选择的姓名)如何处理呢?这就要使用

2、书签功能了,下面是笔者编写的一个 程序中的 过程,来将用户选择的多个记录集中显示在另外一个窗体中(笔者使用的是 DELPHI4),供参考使用 procedure GetSelectedRecord (DataSet : TDataSet; FieldName : String; BookmarkList : TBookmarkList; Strings : TStrings); /这个过程中的参数分别为:数据表、字段名称、书签、用来保存所选字段内容的 /字符串(用于将内容传递到另一个单独窗体中的 TLIST 控件中) var I: Integer; bm : TBookMark; begin

3、Strings.Clear; with Dataset do begin DisableControls; bm := GetBookMark; try /每个选择的记录都有一个书签标志,这就为处理它们提供了条件 for I := 0 to BookmarkList.Count - 1 do begin Bookmark := BookmarkListI; Strings.Add(DataSet.FindField(fieldname).AsString); end; finally GotoBookMark(bm); FreeBookMark(bm); EnableControls; end

4、; end; end; 调用举例: GetSelectedRecord(Table1, NAME, DBGrid1.SelectedRows, Form2.ListBox1.Items);TDBGrid 主要属性及应用TDBGrid 部件是用于显示和编辑数据库表中的记录信息的重要部件,它是我们在程序设计过程当中要经常使用的、灵活地用于显示和编辑数据库表中的记录信息的一个强有力的工具。TDBGrid 具有很多重要的属性,我们可以在程序设计阶段和程序运行过程中进行设置。TDBGrid 部件的一些重要属性及其设置方法请参看联机帮助文件。TDBGrid 部件中一些重要的属性是 Option 属性、Dr

5、awMode 属性和 DefaultDrawing 属性,我们重点对两个属性进行阐述。【Options 属性】:它是 TDBGrid 部件的一个扩展属性,在程序设计阶段设置 Options 属性可以控制 TDBGrid 部件的显示特性和对事件的响应特性。Options 属性在 TDBGrid 部件的属性栏中显示时 ,它的前面带有一个“”标志,双击“”标志,便可以展开一个布尔型属性列表,用户可以逐个地修改其中的各个属性值,修改完毕后可以双击 Options 属性前的“”标志,使 TDBGrid部件的属性列表恢复到原来的显示状态。表 1 列出了 Options 属性中包含的所有的扩展属性项以及它们

6、对 TDBGrid 部件的影响。 表 1 TDBGrid 部件的 Options 属性中的扩展属性项属 性 名 取 值 及 影 响 dbEditing True: 缺省情况下为此值,确保用户能够在网格中编辑插入和删除数据库表中的记录False:在网格中不能编辑、插入和删除表中的记录dbAlwaysShow True: 当用户选中记录中的一个字段时,自动地使该字段Editor True:处于编辑状态False:缺省情况下为此值。当一个字段被选中,它不能自动变成编辑状态dgTitles True: 缺省情况下为此值。在网格的第一行中显示字段名或字段标题False:在网格中不显示字段名或字段对应的标

7、题dgIndicator True: 缺省情况下为此值。在网格的最左边用一个黑箭头标注当前记录指针所在的位置,在插入状态时,箭头变成星状,在编辑状时,箭头变成“I“头。False:在网格中不标识当前记录指针的位置dgColumnResize True: 缺省情况下为此值。通过拖拉网格的垂直分隔线可以改变网格中各列的宽度,在具体操作时要拖拉各列中显示字段标题区域中的垂直分隔线。False:网格中各列的宽度不能改变dgCloLines True: 缺省情况下为此值。在网格中显示各列之间的垂直分隔线。False:在网格中不显示垂直分隔线dgRowLines True: 缺省情况下为此值。在网格中显示

8、各行之间的水平分隔线。False:在网格中不显示水平分隔线。dgTabs True: 缺省情况下为此值。可以在记录的各字段之间移动输入焦点(也即选择提示棒)False:不能在记录的名字段之间移动输入焦点,在网格中按 Tab 键时,直接跳出网格dgRowSelect True: 选择提示棒覆盖整条记录中的全部字段False:缺省情况下为此值。选择提示棒一次只覆盖记录中的一个字段dgAlwaysShow True: 缺省情况下为此值。在网格始终显示选择提示棒,即-Selection 使其控件获得焦点时,也是如此。False:只在当网格获得焦点时,才显示选择提示棒。dbConfirmDelete T

9、rue: 缺省情况下为此值。当在网格中删除记录时,弹出确认信息。False:在网格中删除记录时不弹出确认信息。用户想了解这些可选属性项的作用和影响,还可以参看联机帮助信息。【DragMode 属性】:该属性有两个可选的属性值。当它的值被设置为 dmManual时,在应用程序运行过程中,用户可以用鼠标拖放网格中的各列,改变各列在网格中的显示顺序和位置。当用鼠标拖放网格中的一列、改变它在网格中的位置时,只是改变了该列在数据集中的位置,并没有改变它对应的数据库表中的位置。当该属性的值被设置成 dmAutomatic 时,用户不能用鼠标拖放网格中的各列而改变它在网格中的位置。【DefalultDraw

10、ing 属性】:该属性是布尔型属性,它用于控制网格中各网格单元的绘制方式。在缺省情况下,该属性的值为 True,也就是说 Delphi 使用网格本身缺省的方法绘制网格中各网格单元,并填充各网格单元中的内容,各网格单元中的数据根据其对应的字段部件的 DisplayFormat 属性和 EidtFormat 属性进行显示和绘制。如果 DefaulDrawing 属性被设置为 False 时,Delphi 不会自动地绘制网格中各网格单元和网格单元中的数据,用户必须自己为 TDBGrid 部件的OnDrawDataCell 事件编写相应的程序用于绘制各网格单元和其中的数据。16.4.2 TDBGrid

11、 部件的事件及应用TDBGrid 部件在具有很多重要属性的同时,Delphi 也为它赋予了一些事件,以用于控制用户在 TDBGrid 部件中的操作,我们通过为其中的一些事件编写处理程序,可以有效地控制 TDBGrid 部件的行为。因为在 TDBGrid 部件中一次是显示多条记录和记录中的多个字段,也许在实际应用中,不同的用户各有自己特殊的需要,如只想改变其中某一列的值或者控制用户每次只能进出网格中指定的列等等。表 2 列出了 TDBGrid 部件的主要事件及目的用途。表 2 TDBGrid 部件中的主要事件事 件 名 目 的 用 途OnColEntor 当用户进入网格各列时,触发该事件OnCo

12、lExit 当用户离开网格各列时,触发该事件OnDblClick 当用户在网格中双击鼠标左键时,触发该事件OnDragDrop 当用户在网格中用鼠标进行拖放操作时,触发该事件OnDragOver 当用户在网格中用鼠标拖动网格时,触发该事件OnDrawDataCell 用于定制绘制网格中各网格单元,当向网格中填充数据时触发该事件OnEndDrag 当用户停止拖动网格时,触发该事件OnEnter 当网格获得焦点时,触发该事件OnExit 当网格失去焦点时,触发该事件OnKeyDown 当用户在网格中按下任何键或组合键时,触发该事件OnKeyPress 当用户在网格中按了任何一个数字键或字母键时,触

13、发该事件OnKeyUp 当用户在网格中释放任何被按下的键时,触发该事件上述这些事件在我们开发实际的应用程序时,是很有用处的,读者们可以仔细地研究这些事件的用途,并参看联机帮助信息。procedure TMainForm.DBGrid1DrawColumnCell(Sender: TObject;const Rect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState);var i :integer;beginif gdSelected in State then Exit;/定义表头的字体和背景颜色:for i :=0

14、 to (Sender as TDBGrid).Columns.Count-1 dobegin(Sender as TDBGrid).Columnsi.Title.Font.Name :=宋体; /字体(Sender as TDBGrid).Columnsi.Title.Font.Size :=9; /字体大小(Sender as TDBGrid).Columnsi.Title.Font.Color :=$000000ff; /字体颜色(红色)(Sender as TDBGrid).Columnsi.Title.Color :=$0000ff00; /背景色(绿色)end;/隔行改变网格背景色

15、: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 的边框beginPen.Color := $00ff00

16、00; /定义画笔颜色(蓝色)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; -procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField;

17、State: TGridDrawState);beginif (gdFocused in State) thenbeginif (Field.FieldName = DBComboBox1.DataField ) thenbeginDBComboBox1.Left := Rect.Left + DBGrid1.Left;DBComboBox1.Top := Rect.Top + DBGrid1.top;DBComboBox1.Width := Rect.Right - Rect.Left;DBComboBox1.Height := Rect.Bottom - Rect.Top;DBComboB

18、ox1.Visible := True;end;end;end;-procedure TForm1.DBGrid1ColExit(Sender: TObject);beginIf DBGrid1.SelectedField.FieldName = DBComboBox1.DataField thenbeginDBComboBox1.Visible := false;end;end;-在 DbGrid 的 DrawColumnCell 事件中编写如下代码:Case DataCol Mod 2 = 0 ofTrue: DbGrid1.Canvas.Brush.Color:= clBlue; fil

19、e:/偶数列用蓝色False: DbGrid1.Canvas.Brush.Color:= clAqua; file:/奇数列用浅绿色End;DbGrid1.Canvas.Pen.Mode:=pmMask;DbGrid1.DefaultDrawColumnCell (RectDataColColumnState);-Case DataCol Mod 2 = 0 ofTrue: DbGrid1.Canvas.Brush.Color:= clBlue; file:/偶数列用蓝色False: DbGrid1.Canvas.Brush.Color:= clAqua; file:/奇数列用浅绿色End;I

20、f (State = gdSelected) or (State=gdSelectedgdFocused) thenIf Not DbGrid1.SelectedRows.CurrentRowSelected thenDbGrid1.Canvas.Brush.Color:=clRed; file:/当前选中单元格显示红色DbGrid1.Canvas.Pen.Mode:=pmMask;DbGrid1.DefaultDrawColumnCell (Rect DataCol Column State);-设置 DbGrid 控件的 Options 属性中的 dgRowSelect 属性为真,Colo

21、r 属性为clAqua(背景色)在 DbGrid 的 DrawColumnCell 事件中编写如下代码:if (State = gdSelected) or (State=gdSelected gdFocused) thenDbGrid1.Canvas.Brush.color:=clRed; file:/当前行以红色显示,其它行使用背景的浅绿色DbGrid1.Canvas.pen.mode:=pmmask;DbGrid1.DefaultDrawColumnCell (RectDataColColumnState);-if (State = gdSelected) or (State=gdSel

22、ectedgdFocused) thenbeginCase DataCol Mod 2 = 0 ofTrue : DbGrid1.Canvas.Brush.color:=clRed; file:/当前选中行的偶数列显示红色False: DbGrid1.Canvas.Brush.color:=clblue; file:/当前选中行的奇数列显示蓝色end;DbGrid1.Canvas.pen.mode:=pmmask;DbGrid1.DefaultDrawColumnCell (RectDataColColumnState);end;-横向斑马线, 同时以红色突显当前行效果。file:/其它属性设

23、置同 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.C

24、anvas.pen.mode:=pmMask;DbGrid1.DefaultDrawColumnCell (RectDataColColumnState);-双向斑马线效果:即行间用不同色区分,同时,选中行以纵向斑马线效果区分不同的列。file:/其它属性设置同 3,将上述代码修改为:Case Table1.RecNo mod 2 = 0 of file:/根据数据集的记录号进行判断True : DbGrid1.Canvas.Brush.color:=clAqua; file:/偶数行用浅绿色显示False: DbGrid1.Canvas.Brush.color:= clblue; file:

25、/奇数行用蓝色表示end;If (State = gdSelected) or (State=gdSelectedgdFocused) thenCase DataCol mod 2 = 0 ofTrue : DbGrid1.Canvas.Brush.color:=clRed; file:/当前选中行的偶数列用红色False: DbGrid1.Canvas.Brush.color:= clGreen; file:/当前选中行的奇数列用绿色表示end;DbGrid1.Canvas.pen.mode:=pmMask;DbGrid1.DefaultDrawColumnCell (RectDataCol

26、ColumnState);-DBGrid 不支持鼠标的上下移动的解决代码(感谢 wangxian11 提供)自己捕捉WM_MOUSEWHEEL 消息处理privateOldGridWnd : TWndMethod;procedure NewGridWnd (var Message : TMessage);publicprocedure TForm1.NewGridWnd(var Message: TMessage);varIsNeg : Boolean;beginif Message.Msg = WM_MOUSEWHEEL thenbeginIsNeg := Short(Message.WPa

27、ramHi) 0 thenShowMessage(Vertical scrollbar is visible!);if (GetWindowlong(Stringgrid1.Handle, GWL_STYLE) and WS_HSCROLL) 0 thenShowMessage(Horizontal scrollbar is visible!);-1、 数据表的建立 在 Delphi 的工具菜单中选择 Database desktop,在数据库 DBDemos 下建立一个名为example.db 的数据表。数据表的字段和内容如下: Name Age Wage张山 25 500王武 57 106

28、0李市 30 520刘牛 28 3902、创建基于 TDBGrid 的 TColoredDBGrid 组件 在 Delphi 组件菜单中,选择 New Component,在弹出对话框中作以下设置:Ancestor Type = TDBGridClass Name = TColoredDBGrid然后单击 OK 按钮,Delphi 自动完成组件基本框架的定义。增添OnDRawColoredDBGrid 事件并使它出现在 Object Inspector 的 Events 中以便在应用程序中设定改变行颜色的条件。重载DrawCell 方法,只能自己绘制单元格。不能通过在 OnDrawColumn

29、Cell 来设置颜色,因为在OnDrawColumnCell 改变单元格的颜色会再次触发 OnDrawColumnCell。 下面就是所创建组件的源程序 。3、建立应用程序进行验证。 在 Delphi 文件菜单中选择 New 建立新的应用程序工程 Project1 和主窗体Form1,设置 Form1 的Caption 属性为“控制 DBGrid 行颜色的示例”。在主窗体上添加 Data Source、Table、Button 和ColoredDBGrid 组件。设置各组件的属性如下:Table1.Database=DBDemosTable1.Tablename=example.dbDatas

30、ource1.Dataset=Table1ColoredDBGrid1.Datasource=DataSource1Button1.Caption=退出在 ColoredDBGrid1 的 onDRawColoredDBGrid 事件中输入下列代码,设定由Wage(工资)来决定在 ColoredDBGrid1 各行的颜色。procedure TForm1.ColoredDBGrid1 DRawColoredDBGrid (Sender: TObject; Field: TField; var Color: TColor; var Font: TFont);Varp : Integer;begi

31、np := Table1.FindField(wage).AsInteger;/取得当前记录的 Wage 字段的值。if (p = 500) And (p =800) then beginColor := clMaroon;Font.Style := fsBold;end;end;-unit NewDBGrid;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DB, Grids, DBGrids, Excel97;typeTDrawFieldCellEvent = pr

32、ocedure(Sender: TObject; Field: TField;var Color: TCOlor; var Font: TFont; Row: Longint) of object;/新的数据控件由 TDBGrid 继承而来TNewDBGrid = class(TDBGrid)private/私有变量FWZebra: Boolean; /是否显示斑马颜色FWFirstColor: TColor; /单数行颜色FWSecondColor: TCOlor; /双数行颜色FDrawFieldCellEvent: TDrawFieldCellEvent;procedure AutoIn

33、itialize; /自动初使化过程procedure AutoDestroy;function GetWFirstColor: TColor;/FirstColor 的读写函数及过程procedure SetWFirstColor(Value: TColor);function GetWSecondColor: TCOlor;procedure SetWSecondColor(Value: TColor);function GetWZebra: Boolean;procedure SetWZebra(Value: Boolean);protectedprocedure Scroll(Dist

34、ance: Integer); override;/本控件的重点过程procedure DrawCell(Acol, ARow: Longint; ARect:TRect; AState: TGridDrawState); override;publicconstructor Create(AOwner: TComponent); override;destructor Destroy; override;publishedproperty WZebra: Boolean read GetWZebra write SetWZebra;property OnDblClick;property O

35、nDragDrop;property OnKeyUp;property OnKeyDown;property OnKeyPress;property OnEnter;property OnExit;property OnDrawDataCell;property WFirstColor: TColorread GetWFirstColor write SetWFirstColor;property WSecondColor: TColorread GetWSecondColor write SetWSecondColor;end;procedure Register;implementatio

36、nprocedure Register;beginRegisterComponents(Data Controls, TNewDBGrid);end;procedure TNewDBGrid.AutoInitialize;beginFWFirstColor := RGB(239, 254, 247);FWSecondColor := RGB(249, 244, 245);可以在次添加需要的其它控件及初使化参数end;procedure TNewDBGrid.AutoDestroy;begin在这里释放自己添加参数等占用的系统资源end;procedure TNewDBGrid.SetWZebr

37、a(Value: Boolean);beginFWZebra := Value;Refresh;end;function TNewDBGrid.GetWZebra: Boolean;beginResult := FWZebra;end;function TNewDBGrid.GetWFirstColor: TColor;beginResult := FWFirstColor;end;procedure TNewDBGrid.SetWFirstColor(Value: TColor);beginFWFirstColor := Value;Refresh;end;function TNewDBGr

38、id.GetWSecondColor: TColor;beginResult := FWSecondColor;end;procedure TNewDBGrid.SetWSecondColor(Value: TColor);beginFWSecondColor := Value;Refresh;end;constructor TNewDBGrid.Create(AOwner: TComponent);begininherited Create(AOwner);AutoInitialize;end;destructor TNewDBGrid.Destroy;beginAutoDestroy;in

39、herited Destroy;end;/实现斑马效果procedure TNewDBGrid.DrawCell(ACol, ARow:Longint; ARect: TRect; AState: TGridDrawState);varOldActive: Integer;Highlight: Boolean;Value: string;DrawColumn: Tcolumn;cl: TColor;fn: TFont;begin如果处于控件装载状态,则直接填充颜色后退出if csLoading in ComponentState thenbeginCanvas.Brush.Color := C

40、olor;Canvas.FillRect(ARect);Exit;end;if (gdFixed in AState) and (ACol - IndicatorOffset 0) thenbegininherited DrawCell(ACol, ARow, ARect, AState);Exit;end;对于列标题,不用任何修饰if (dgTitles in Options) and (ARow = 0) thenbegininherited DrawCell(ACol, ARow, ARect, AState);Exit;end;if (dgTitles in Options) then

41、 Dec(ARow);Dec(ACol, IndicatorOffset);if (gdFixed in AState) and (dgRowLines, dgColLines * Options =dgRowLines, dgColLines) thenbegin缩减 ARect,以便填写数据InflateRect(ARect, -1, -1);endelsewith Canvas dobeginDrawColumn := ColumnsACol;Font := DrawColumn.Font;Brush.Color := DrawColumn.Color;Font.Color := Dra

42、wColumn.Font.Color;if FWZebra then /如果属性 WZebra 为 True 则显示斑马纹if Odd(ARow) thenBrush.Color := FWSecondColorelseBrush.Color := FWFirstColor;if (DataLink = nil) or not DataLink.Active thenFillRect(ARect)elsebeginValue := ;OldActive := DataLink.ActiveRecord;tryDataLink.ActiveRecord := ARow;if Assigned(D

43、rawColumn.Field) thenbeginValue := DrawColumn.Field.DisplayText;if Assigned(FDrawFieldCellEvent) thenbegincl := Brush.Color;fn := Font;FDrawFieldCellEvent(self, DrawColumn.Field, cl, fn, ARow);Brush.Color := cl;Font := fn;end;end;Highlight := HighlightCell(ACol, ARow, Value, AState);if Highlight and

44、 (not FWZebra) thenbeginBrush.Color := clHighlight;Font.Color := clHighlightText;end;if DefaultDrawing thenDefaultDrawColumnCell(ARect, ACol, DrawColumn, AState);if Columns.State = csDefault thenDrawDataCell(ARect, DrawColumn.Field, AState);DrawColumnCell(ARect, ACol, DrawColumn, AState);finallyData

45、Link.Activerecord := OldActive;end;if DefaultDrawing and (gdSelected in AState) and(dgAlwaysShowSelection in Options) or Focused)and not (csDesigning in Componentstate)and not (dgRowSelect in Options)and (ValidParentForm(self).ActiveControl = self) thenbegin/显示当前光标处为蓝底黄字,同时加粗显示Windows.DrawFocusRect(

46、Handle, ARect);Canvas.Brush.COlor := clBlue;Canvas.FillRect(ARect);Canvas.Font.Color := clYellow;Canvas.Font.Style := fsBold;DefaultDrawColumnCell(ARect, ACol, DrawColumn, AState);end;end;end;if (gdFixed in AState) and (dgRowLines, dgColLines * Options =dgRowLines, dgColLines) thenbeginInflateRect(ARect, -2, -2);DrawEdge

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报