DBGrid 常 常 用 于 数 据 库 的 直 接 显 示 和 维 护 工 作, 这 也 是DELPHI 中 最 直 观 的 一 种 数 据 库 处 理 手 段, 在 系 统 的 缺 省 状 态 下, DBGrid 所 提 供 的 界 面 比 较 单 调, 只 能 用 简 单 的 前 景 色 和 背 景 色 装 饰 表 面, 并 且 不 能 直 接 显 示 图 像, 但 它 有 一 个 功 能 极 强 的 属 性 即CANVAS 画 布, 灵 活 使 用 此 属 性 可 完 全 改 善 上 述DBGrid 的 不 足, 使 其 呈 现 出 具 有 生 机 和 活 力 的 数 据 库 显 示 界 面。 ---- 一、CANVAS 概 述: ---- CANVAS( 画 布) 是DELPHI 中 为 某 些 控 件 所 定 义 的 一 个 类, 它 允 许 在 控 件 表 面 进 行 灵 活 的 绘 图 操 作 或 信 息 显 示, 并 且 适 用 于 多 种 控 件, 如StringGrid、DBgrid、Form 等, 为 美 化 程 序 界 面 提 供 了 非 常 方 便 的 方 法。 它 可 以 完 全 改 善 某 些 控 件 本 身 的 表 现 形 式, 使 其 以 全 新 的 面 貌 出 现。CANVAS 具 有 多 种 属 性 并 支 持 多 种 操 作 命 令, 可 以 实 现 在 指 定 的 对 象 上 画 点、 画 线、 画 多 边 形、 画 扇 形、 画 圆、 定 义 画 笔 特 性、 输 出 各 种 字 符 串 及 图 像 等 多 种 功 能; 在CANVAS 属 性 的 使 用 过 程 中, 经 常 需 要 与 对 象Rect 配 合, Rect 对 象 可 以 定 义 一 块 矩 形 区 域, 然 后 灵 活 的 对 此 区 域 进 行 各 种 绘 图 操 作,Rect 又 与 控 件Tbitmap 之 间 存 在 着 紧 密 的 关 系, 通 过 有 关 命 令 可 以 方 便 的 把 图 像 送 入Rect 之 内, 为 在 数 据 库 网 格 中 使 用 图 像 提 供 了 方 便。 使 用CANVAS 需 要 注 意 一 点: 当 窗 口 进 行 重 画 时, 画 布 上 的 图 像 将 消 失, 比 如 当 窗 口 进 行 最 小 化 又 重 新 恢 复 时, 就 会 引 起 画 布 上 图 像 的 消 失, 另 外 当 刚 刚 运 行 程 序 时, 窗 口 也 是 属 于 重 新 绘 制, 所 以 如 果 在 绘 制 窗 口 之 前 在 画 布 上 绘 图, 弹 出 窗 口 后 将 不 能 显 示 出 图 像, 比 如 在TForm1.FormCreate() 事 件 中 进 行 画 布 绘 图 操 作 将 是 徒 劳 的, 但 可 以 在 此 事 件 中 进 行 画 布 操 作 的 准 备 工 作, 比 如 设 置 画 笔 的 颜 色 和 宽 度 等。 ---- 二、DBGrid 对CANVAS 的 支 持 ---- DBGrid 不 仅 是 简 单 的 拥 有CANVAS 属 性, 而 且 它 本 身 提 供 了 对CANVAS 最 大 限 度 的 支 持, 可 具 体 体 现 在 两 个 方 面, 其 一 是DBGrid 中 的 每 一 个 表 格 项, 被 自 动 定 义 为 一 个 独 立 的TRect 对 象, 这 样 给 使 用 者 以 每 个 表 格 为 单 位 进 行 图 像 处 理 提 供 了 方 便 的 条 件; 另 处 一 点, 由 于 利 用CANVAS 所 绘 的 图 像 或 显 示 的 图 像 窗 口 重 画 是 会 消 失, 这 样 在 很 多 情 况 下 将 破 坏 表 格 内 的 图 像, 而DBGrid 本 身 又 提 供 了 解 决 此 问 题 的 完 善 方 法, 它 有 一 个DrawDataCell() 事 件, 每 当 表 格 项 的 某 一 部 分 发 生 变 化 时, 都 将 自 动 调 用 此 事 件, 这 样 把CANVAS 图 像 过 程 安 排 在 此 事 件 中 即 可 永 久 保 持 表 格 图 像 的 完 整 性; 在 此 事 件 中 有 一 个TRect 参 数, 即 是 重 画 表 格 时 当 前 表 格 的 矩 形 区 域 范 围, 所 以 在 此 事 件 中 可 非 常 方 便 的 对 网 格 中 每 一 个 表 格 项 进 行 灵 活 的 着 色、 图 像 显 示 或 字 符 显 示 操 作; ---- 三、DBGrid 多 颜 色 填 充 技 巧 ---- 大 部 分 工 作 需 要 在DrawDataCell() 事 件 中 完 成, 此 事 件 中 除 了 有 一 个TRect 参 数 处, 还 有 一 个 极 有 用 的 参 数 就 是TField, 从 此 参 数 可 检 测 到 当 前 绘 制 的 是 哪 一 个 字 段 名, 这 样 可 方 便 的 按 照 字 段 进 行 颜 色 处 理, 只 要 按 字 段 的 名 称 调 整 当 前 数 据 项 表 格 的Rect 对 象 颜 色, 即 可 使DBGrid 按 字 段 分 颜 色 显 示 数 据, 另 外 也 可 以 按 记 录 号 或 者 某 一 数 据 项 的 数 值 决 定 所 使 用 的 颜 色, 比 如 负 数 用 绿 色, 正 数 用 红 色,0 则 用 白 色, 这 样 可 起 到 非 常 直 观 的 显 示 效 果; 具 体 操 作 时 需 要 注 意 以 下 问 题, 即 网 格 的 内 容 显 示 问 题, 当 用 一 种 颜 色 填 充 表 格 的Rect 之 后, 该 表 格 项 中 的 内 容 会 被 画 布 完 全 覆 盖, 此 时 必 须 利 用 画 布 的 字 符 串 显 示 功 能 重 显 该 表 格 内 容, 才 不 会 影 响 正 常 的 表 格 内 容; ---- 四、DBGrid 图 像 处 理 能 力 ---- 在DBGrid 中 使 用 图 像 有 两 种 实 用 的 意 义, 其 一 是 可 以 把 图 像 做 为 表 格 的 背 景 使 用, 在 图 像 之 上 显 示 表 格 的 相 关 数 据, 这 样 可 使 网 格 具 有 特 殊 的 表 现 风 格, 其 操 作 方 法 与 颜 色 填 充 相 似, 只 要 用 图 像 显 示 命 令 代 替 颜 色 填 充 命 令 即 可; 进 行 此 操 作 时 有 一 点 必 须 注 意, 在 系 统 的 缺 省 填 充 模 式 下, 字 符 将 带 有 背 景 效 果, 这 样 在 图 像 上 显 示 字 符 将 覆 盖 部 分 图 像 内 容, 显 示 效 果 不 好, 为 了 实 现 在 图 像 直 接 显 示 字 符 的 效 果, 必 须 重 置 填 充 模 式, 具 体 可 使 用 下 面 命 令: DBGrid1.canvas.Brush.Style:=bsHorizontal; 另 一 种 使 用 图 像 的 目 的 是 实 现 数 据 库 图 像 数 据 的 显 示 功 能, 比 如 说 数 据 库 中 的 每 一 个 人 有 一 张 像 片, 保 存 在 多 个BMP 文 件 之 中, 而 在DrawDataCell() 事 件 中 按 照 记 录 号 分 别 在 相 应 的 表 格 中 调 出 相 应 的 图 像 文 件, 即 可 以 在DBGrid 中 显 示 出 带 有 图 片 的 数 据 库 内 容, 由 于DBGrid 缺 省 状 态 下 的 表 格 较 小, 可 通 过 调 整 显 示 图 片 用 的 表 格 字 段 长 度 及 字 号, 来 增 大 图 像 的 显 示 尺 寸; ---- 五、 相 关 命 令 简 介 ---- 实 现 上 述 操 作 过 程 需 要 一 些 特 殊 的 画 布 属 性 或 命 令, 为 方 便 理 解 简 介 如 下, 省 略 了 具 体 的 参 数 及 使 用 方 法, 可 参 考 后 面 的 程 序 或 通 过DELPHI 的 帮 助 功 能 查 找: Field[i].fieldname:指定数据库字段名称
 Table1.Fieldbyname('JT').asinteger:数据库JT字段值
 DBGrid1.canvas.stretchdraw();向TRect中填充图像
 DBGrid1.canvas.Brush.Style:置填充模式
 DBgrid1.canvas.textout():在画布上显示字符串
 DBgrid1.canvas.brush.color:置填充颜色
 DBgrid1.canvas.fillRect(t):向TRect中填充颜色
 DBGrid1.font.size:=10:置网格的字体尺寸
 DBGrid1.font.color:置网格的字体颜色
 Tbitmap.create:建立Tbitmap对象;
 loadfromfile():向Tbitmap中调入图像文件---- 六、 编 程 举 例 ---- 假 设 在 当 前 目 录 下 有 一 个 数 据 库BMP.DBF 文 件, 共 有 七 个 字 段, 分 别 为XM、XB、NY、DW、DH、SD、JT, 其 中JT 字 段 内 记 录 着 记 录 号 码, DH 字 段 内 原 为 电 话 号 码, 现 用 于 显 示 图 像, 具 体 使 用 时 可 单 独 建 立 一 个 用 于 显 示 图 像 的 字 段; 在 下 面 的 程 序 中, 实 现 把 此 数 据 库 在DBGrid 中 显 示 的 目 的, 并 在XM 字 段 用 一 固 定 图 像 做 为 背 景, 而 在DH 表 格 中 按 记 录 号 分 别 显 示 图 像 文 件 ARROW1.BMP、ARROW2.BMP、 ARROW3.BMP 等, 其 它 表 格 用 不 同 的 颜 色 背 景 填 充; ---- 1. 创 建 一 个 新 的 项 目, 在 其 上 面 分 别 安 排 下 面 三 个 控 件:Table1、DataSource1、DBGrid1; ---- 2. 使TABLE1 的Tablename 属 性 指 向BMP.DBF 文 件, 之 后 置TABLE1 的Active 属 性 为 真, 以 打 开 此 数 据 库; ---- 3. 将DataSource1 的DataSet 属 性 置 为Table1, 建 立 与 BMP.DBF 数 据 库 的 链 接; ---- 4. 定 义 变 量, 其 中 包 括 一 个 独 立 的Tbitmap 及 一 个 数 组 变 量, 用 于 处 理 多 个BMP 图 像 文 件: var
  Form1: TForm1;
  map:array[0..300] of Tbitmap;
  pic:Tbitmap;
  i:integer;---- 5. 在FormCreate() 事 件 中 填 入 如 下 代 码, 进 行 程 序 的 准 备 工 作, 其 中 包 括 建 立TBitmap 对 象, 并 分 别 在 每 个 对 象 中 装 入 图 像 文 件, 以 备 后 面 显 示 使 用: procedure TForm1.FormCreate(Sender: TObject);
var
str:string;
begin
DBGrid1.font.size:=10;       {定义字体属性}
DBGrid1.font.color:=$0000ffff;
for i:=0 to 5 do
begin
map[i]:=Tbitmap.create;  {装入6个图像文件}
str:='arrow'+inttostr(i+1)+'.bmp'; {调整文件名}
map[i].loadfromfile(str);
end;
pic:=Tbitmap.create;
pic.loadfromfile('d:\windows\256color.bmp');
end;---- 6. 在 DBGrid1DrawDataCell() 事 件 中 进 行 具 体 修 饰 操 作, 按 字 段 名 进 行 不 同 的 颜 色 填 充 或 图 像 填 充 操 作: procedure TForm1.DBGrid1DrawDataCell
(Sender:TObject;const Rect:TRect;
  Field:TField;State:TGridDrawState);
var
   ch:string;
begin
 ch:=Field.fieldname;
  if ch='DH' then   {按记录号显示指定的图像}
     begin
     i:=Table1.Fieldbyname('JT').asinteger;    {判断数值}
     DBGrid1.canvas.stretchdraw(Rect,map[i-1]);{显示图像}
   end  else
  if ch='XM' then  {相同字段使用同一图像背景}
   begin
   DBGrid1.canvas.Brush.Style:=bsHorizontal;{修改填充模式}
   DBGrid1.canvas.stretchdraw(Rect,pic);    {显示图像}
   DBgrid1.canvas.textout(Rect.left+4,Rect.top+4,field.Asstring);
   end else
  begin            {按字段进行不同颜色填充}
  if ch='XB' then DBgrid1.canvas.brush.color:=$00008000 else
  if ch='NY' then DBgrid1.canv