dbgrid使用大全(delphi)

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

Delphi 数据表格增加色彩

作者: xxxx 发文时间: 2003.07.18 16:29:42

 

  在 DELPHI 中经常用到网格控件( DBGrid )显示数据,网格控件只提供了每一行的颜色属性,但在实际应用中我们经常希望它按某一行某一项的取值不同显示不同的颜色,甚至在网格中的单位表格项中显示出图像等等,下面我们以一个简单的例子来告诉大家怎么做。

 

  比如我们要求如果春季有退书用红色表示,如果秋季有退书用黄色表示

 

    

 

  利用 DBGrid 自绘功能可以很容易地实现这样的要求。用户可以处理 DBGrid OnDrawColumnCell 事件,在其中实现特殊的效果。要判断记录是否满足要求,可以使用 DBGrid DataLink 属性获得数据,但 DBGrid DataLink 属性属于保护成员,必须在 TCustomDBGrid 的子类中调用。

 

type

TMyCustomDBGrid = class(TCustomDBGrid);

 

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;

DataCol: Integer; Column: TColumn; State: TGridDrawState);

var

sCjts,sQjTs:String;

begin

with TMyCustomerDBGrid(Sender) do

begin

Cjts:=DataLink.Fields[5].AsString;

sQjts:=DataLink.Fields[9].AsString;

if sCjts<> ‘‘ then         // 春季退书数量 >0 的用红色显示

Canvas.Brush.Color := clRed

else

if sQjts<> ‘‘ 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);

http://www.delphibbs.com/delphibbs/dispq.asp?lid=737517

 

Delphi 语言的数据库编程中, DBGrid 是显示数据的主要手段之一。但是 DBGrid 缺省的外观未免显得单调和缺乏创意。其实,我们完全可以在我们的程序中通过编程来达到美化 DBGrid 外观的目的。通过编程,我们可以改变 DBGrid 的表头、网格、网格线的前景色和背景色,以及相关的字体的大小和风格。

以下的示例程序演示了对 DBGrid 各属性的设置,使 Delphi 显示的表格就像网页中的表格一样漂亮美观。

示例程序的运行:

Form1 上放置 DBGrid1 Query1 DataSource1 三个数据库组件,设置相关的属性,使 DBGrid1 能显示表中的数据。然后,在 DBGrid1 onDrawColumnCell 事件中键入以下代码,然后运行程序,就可以看到神奇的结果了。本代码在 Windows98 Delphi5.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;

 

 

2003-11-11 17:07:42 问题 : Delphi5 - 隔行改变 DBGrid 网格颜色 Form1 上放置 DBGrid1 Query1 DataSource1 三个数据库组件,设置相关的属性,使 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 Delphi DBGrid 中插入其他可视组件 Delphi 提供了功能强大的 DBGrid 组件,以方便进行数据库应用程序设计。但是如果我们仅仅利用 DBGrid 组件,每一个获得焦点( Grid )只是一个简单的文本编辑框,不方便用户输入数据。 Delphi 也提供了一些其他数据组件来方便用户输入,比如 DBComboBox DBCheckBox 等组件,但这些组件却没有 DBGrid 功能强大。 Delphi 能不能象 Visual Foxpro 那样让 DBGrid 中获得焦点网格可以是其它可视数据组件以方便用户呢?其实我们可以通过在 DBGrid 中插入其他可视组件来实现这一点。

 

Delphi DBGrid 处理的内部机制,就是在网格上浮动一个组件—— DBEdit 组件。你输入数据的网格其实是浮动 DBEdit 组件,其他未获得焦点地方不过是图像罢了。所以,在 DBGrid 中插入其他可视组件就是在网格上浮动一个可视组件。因此任何组件,包括从简单的 DbCheckBox 到复杂的对话框,都可以在 DBGrid 中插入。下面就是一个如何在 DBGrid 中插入 DBComboBox 组件的步骤,采用同样的办法可以插入其他组件。

 

1 、在 Delphi 4.0 中新建一个项目。

 

2 、分别拖动的 Data Access 组件板上 DataSource Table Data Controls 组件板上 DBGrid DBComboBox 四个组件到 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 ,那是反映教职工的性别,只能是“男”或者是“女”。

 

4 DrawDataCell 事件是绘制单元格,当获得焦点网格所对应的字段与组合框所对应的字段一致时,移动组合框到获得焦点的网格上,并且使组合框可视,从而达到在 DBGrid 指定列上显示 DBComboBox 的功能。设置 DBGrid1 OnDrawDataCell 事件如下:

 

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;

 

5 DBGrid 指定单元格未获得焦点时不显示 DBComboBox ,设置 DBGrid1 OnColExit 事件如下:

procedure TForm1.DBGrid1ColExit(Sender: TObject);

begin

If DBGrid1.SelectedField.FieldName = DBComboBox1.DataField then

begin

DBComboBox1.Visible := false;

end;

end;

 

6 、当 DBGrid 指定列获得焦点时 DrawDataCell 事件只是绘制单元格,并显示 DBComboBox ,但是 DBComboBox 并没有获得焦点,数据的输入还是在单元格上进行。在 DBGrid1 KeyPress 事件中调用 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.Handle WM_Char word(Key) 0);

end;

end;

end;

 

程序在中文 Windows 98 Delphi 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:// DbGrid DrawColumnCell 事件中编写如下代码:

 

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( 背景色 )

DbGrid DrawColumnCell 事件中编写如下代码:

 

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 点击 DBGrid Title 对查询结果排序 关键词 :DBGrid 排序

 

欲实现点击 DBGrid Title 对查询结果排序,想作一个通用程序,不是一事一议,例如不能在 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 继承下来的,它有 col row 属性,只不过是 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 构件的 DisplayFormat EditFormat 特性来绘制的;若将 DBGrid DefaultDrawing 特性设置成 False Delphi 就不绘制网格或其内容,必须自行在 TDBGrid OnDrawDataCell 事件中提供自己的绘制例程(自画功能)。

  在这里将用到 DBGrid 的一个重要属性:画布 Canvas ,很多构件都有这一属性。 Canvas 代表了当前被显示 DBGrid 的表面,你如果把另行定义的显示内容和风格指定给 DBGrid 对象的 Canvas DBGrid 对象会把 Canvas 属性值在屏幕上显示出来。具体应用时,涉及到 Canvas Brush 属性和 FillRect 方法及 TextOut 方法。 Brush 属性规定了 DBGrid.Canvas 显示的图像、颜色、风格以及访问 Windows GDI 对象句柄, FillRect 方法使用当前 Brush 属性填充矩形区域,方法 TextOut 输出 Canvas 的文本内容。

 

  以下用一个例子来详细地说明如何显示彩色的 DBGrid 。在例子中首先要有一个 DBGrid 构件,其次有一个用来产生彩色筛选条件的 SpinEdit 构件,另外还有 ColorGrid 构件供自由选择数据单元的前景和背景的颜色。

 

   1. 建立名为 ColorDBGrid Project ,在其窗体 Form1 中依次放入所需构件,并设置属性为相应值,具体如下所列:

 

   Table1 DatabaseName: DBDEMOS

TableName: EMPLOYEE.DB

Active: True;

   DataSource1 DataSet: Table1

   DBGrid1 DataSource1: DataSource1

DefaultDrawing: False

   SpinEdit1 Increment:200

Value: 20000

   ColorGrid1 GridOrdering: go16 1

 

   2. DBGrid1 构件 OnDrawDataCell 事件编写响应程序:

 

// 这里编写的程序是 <60 的网格为红色的情况,其他的可以照此类推

   procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;Field: TField; State: TGridDrawState);

   begin

   if Table1.Fieldbyname( Salary ).value<=SpinEdit1.value then

   DBGrid1.Canvas.Brush.Color:=ColorGrid1.ForeGroundColor

   else

    DBGrid1.Canvas.Brush.Color:=ColorGrid1.BackGroundColor;

   DBGrid1.Canvas.FillRect(Rect);

   DBGrid1.Canvas.TextOut(Rect.left 2,Rect.top 2,Field.AsString);

   end;

 

  这个过程的作用是当 SpinEdit1 给定的条件得以满足时,如′ salary ′变量低于或等于 SpinEdit1.Value 时, DBGrid1 记录以 ColorGrid1 的前景颜色来显示,否则以 ColorGrid1 的背景颜色来显示。然后调用 DBGrid Canvas 的填充过程 FillRect 和文本输出过程重新绘制 DBGrid 的画面。

 

   3. SpinEdit1 构件的 OnChange 事件编写响应代码:

 

   procedure TForm1.SpinEdit1Change(Sender: TObject);

   begin

   DBGrid1.refresh; // 刷新是必须的,一定要刷新哦

   end;

 

  当 SpinEdit1 构件的值有所改变时,重新刷新 DBGrid1

 

   4. ColorGrid1 OnChange 事件编写响应代码:

 

   procedure TForm1.ColorGrid1Change(Sender: TObject);

   begin

   DBGrid1.refresh; // 刷新是必须的,一定要刷新哦

  end;

 

  当 ColorGrid1 的值有所改变时,即鼠标的右键或左键单击 ColorGrid1 重新刷新 DBGrid1

 

   5. Form1 窗体(主窗体)的 OnCreate 事件编写响应代码:

 

   procedure TForm1.FormCreate(Sender: TObject);

   begin

   ColorGrid1.ForeGroundIndex:=9;

    ColorGrid1.BackGroundIndex:=15;

  end;

 

  在主窗创建时,将 ColorGrid1 的初值设定前景为灰色,背景为白色,也即 DBGrid 的字体颜色为灰色,背景颜色为白色。

 

   6. 现在,可以对 ColorDBGrid 程序进行编译和运行了。当用鼠标的左键或右键单击 ColorGrid1 时, DBGrid 的字体和背景颜色将随之变化。

 

  在本文中,只是简单展示了以彩色方式显示 DBGrid 的原理,当然,还可以增加程序的复杂性,使其实用化。同样道理,也可以将这个方法扩展到其他拥有 Canvas 属性的构件中,让应用程序的用户界面更加友好。

 

 

 

 

2003-11-17 14:58:08 判断 Grid 是否有滚动条?这是一个小技巧,如果为了风格的统一的话,还是不要用了。:)

 

。。。

 

if (GetWindowlong(Stringgrid1.Handle, GWL_STYLE) and WS_VSCROLL) <> 0 then

ShowMessage('Vertical scrollbar is visible!');

if (GetWindowlong(Stringgrid1.Handle, GWL_STYLE) and WS_HSCROLL) <> 0 then

ShowMessage('Horizontal scrollbar is visible!');

 

。。。

 

 

2003-11-17 15:04:27 两个 Grid 的同步滚动 在实际制作一个项目当中,有时候需要几个 grid 一起同步滚动以减少用户的操作量。希望下面那段代码对您有一定的参考价值。

 

{1.}

 

unit SyncStringGrid;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs, Grids;

 

type

TSyncKind = (skBoth, skVScroll, skHScroll);

TSyncStringGrid = class(TStringGrid)

 

private

FInSync: Boolean;

FsyncGrid: TSyncStringGrid;

FSyncKind: TSyncKind;

{ Private declarations }

procedure WMVScroll(var Msg: TMessage); message WM_VSCROLL;

procedure WMHScroll(var Msg: TMessage); message WM_HSCROLL;

 

protected

{ Protected declarations }

 

public

{ Public declarations }

procedure DoSync(Msg, wParam: Integer; lParam: Longint); virtual;

 

published

{ Published declarations }

property SyncGrid: TSyncStringGrid read FSyncGrid write FSyncGrid;

property SyncKind: TSyncKind read FSyncKind write FSyncKind default skBoth;

end;

 

procedure Register;

 

implementation

 

procedure Register;

begin

RegisterComponents('Samples', [TSyncStringGrid]);

end;

 

procedure TSyncStringGrid.WMVScroll(var Msg: TMessage);

begin

if not FInSync and Assigned(FSyncGrid) and (FSyncKind in [skBoth, skVScroll]) then

FSyncGrid.DoSync(WM_VSCROLL, Msg.wParam, Msg.lParam);

inherited;

end;

 

procedure TSyncStringGrid.WMHScroll(var Msg: TMessage);

begin

if not FInSync and Assigned(FSyncGrid) and (FSyncKind in [skBoth, skHScroll]) then

FSyncGrid.DoSync(WM_HSCROLL, Msg.wParam, Msg.lParam);

inherited;

end;

 

procedure TSyncStringGrid.DoSync(Msg, wParam: Integer; lParam: Longint);

begin

FInSync := True;

Perform(Msg, wParam, lParam);

FinSync := False;

end;

 

end.

 

{****************************************}

 

{2.}

private

OldGridProc1, OldGridProc2: TWndMethod;

procedure Grid1WindowProc(var Message: TMessage);

procedure Grid2WindowProc(var Message: TMessage);

 

public

{...}

 

procedure TForm1.Grid1WindowProc(var Message: TMessage);

 

begin

OldGridProc1(Message);

if ((Message.Msg = WM_VSCROLL) or (Message.Msg = WM_HSCROLL) or Message.msg = WM_Mousewheel)) then

begin

OldGridProc2(Message);

end;

end;

 

procedure TForm1.Grid2WindowProc(var Message: TMessage);

begin

OldGridProc2(Message);

if ((Message.Msg = WM_VSCROLL) or (Message.Msg = WM_HSCROLL) or (Message.msg = WM_Mousewheel)) then

begin

OldGridProc1(Message);

end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

OldGridProc1 := StringGrid1.WindowProc;

OldGridProc2 := StringGrid2.WindowProc;

StringGrid1.WindowProc := Grid1WindowProc;

StringGrid2.WindowProc := Grid2WindowProc;

end;

 

 

  <

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值