当前位置: 首页 > news >正文

回答网友的一个Delphi问题

网友想在grid 中 加一个水印,俺就给他写了个例子。先靠效果:

这个例子 包含下面几步:

1、创建背景

  dg_bmp:=Tbitmap.Create;
  w:= Image1.Picture.Bitmap.width;
  h:= Image1.Picture.Bitmap.height;
  dg_bmp.width:= w*2;
  dg_bmp.height:= h*2;
  dg_bmp.Canvas.Draw(0,0,Image1.Picture.Bitmap);
  dg_bmp.Canvas.Draw(w,0,Image1.Picture.Bitmap);
  dg_bmp.Canvas.Draw(0,h,Image1.Picture.Bitmap);
  dg_bmp.Canvas.Draw(w,h,Image1.Picture.Bitmap);

2、创建测试数据

  col_cnt:=5;
  row_cnt:=200;
  for i:=1 to col_cnt do
    ADODataSet1.FieldDefs.Add('F'+inttostr(i),ftString,36);
  ADODataSet1.CreateDataSet();
  ADODataSet1.DisableControls;
  for i:=1 to row_cnt do
  begin
    ADODataSet1.Append();
    for k:=1 to col_cnt do
      ADODataSet1.FieldByName('F'+inttostr(k)).asstring:=format('行%d 列%d',[i,k]);
    ADODataSet1.post();
  end;
  ADODataSet1.First;
  ADODataSet1.EnableControls;

3、处理重绘事件

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
var
  DG: TDBGrid;
  Source: TRect;
begin
  DG:= TDBGrid(Sender);
  Source.Left:=Rect.Left mod (dg_bmp.Width div 2);
  Source.Top:=Rect.Top mod (dg_bmp.Height div 2);
  Source.Right:=Source.Left+(Rect.Right-Rect.Left);
  Source.Bottom:=Source.Top+(Rect.Bottom-Rect.Top);
  DG.Canvas.CopyRect(Rect, dg_bmp.Canvas,Source);
  DG.Canvas.Brush.Style:=bsClear;
  DG.Canvas.font.Color:=clblue;
  DG.DefaultDrawDataCell(Rect,Field,State);
end;

unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, Grids, DBGrids, DB, ExtCtrls, ADODB;typeTForm1 = class(TForm)DBGrid1: TDBGrid;Image1: TImage;DataSource1: TDataSource;ADODataSet1: TADODataSet;procedure DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;Field: TField; State: TGridDrawState);procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);privatedg_bmp:Tbitmap;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;Field: TField; State: TGridDrawState);
varDG: TDBGrid;Source: TRect;
beginDG:= TDBGrid(Sender);Source.Left:=Rect.Left mod (dg_bmp.Width div 2);Source.Top:=Rect.Top mod (dg_bmp.Height div 2);Source.Right:=Source.Left+(Rect.Right-Rect.Left);Source.Bottom:=Source.Top+(Rect.Bottom-Rect.Top);DG.Canvas.CopyRect(Rect, dg_bmp.Canvas,Source);DG.Canvas.Brush.Style:=bsClear;DG.Canvas.font.Color:=clblue;DG.DefaultDrawDataCell(Rect,Field,State);
end;procedure TForm1.FormCreate(Sender: TObject);
varcol_cnt,row_cnt,i,k ,w,h:integer;
begindg_bmp:=Tbitmap.Create;w:= Image1.Picture.Bitmap.width;h:= Image1.Picture.Bitmap.height;dg_bmp.width:= w*2;dg_bmp.height:= h*2;dg_bmp.Canvas.Draw(0,0,Image1.Picture.Bitmap);dg_bmp.Canvas.Draw(w,0,Image1.Picture.Bitmap);dg_bmp.Canvas.Draw(0,h,Image1.Picture.Bitmap);dg_bmp.Canvas.Draw(w,h,Image1.Picture.Bitmap);col_cnt:=5;row_cnt:=200;for i:=1 to col_cnt doADODataSet1.FieldDefs.Add('F'+inttostr(i),ftString,36);ADODataSet1.CreateDataSet();ADODataSet1.DisableControls;for i:=1 to row_cnt dobeginADODataSet1.Append();for k:=1 to col_cnt doADODataSet1.FieldByName('F'+inttostr(k)).asstring:=format('行%d 列%d',[i,k]);ADODataSet1.post();end;ADODataSet1.First;ADODataSet1.EnableControls;
end;procedure TForm1.FormDestroy(Sender: TObject);
beginfreeandnil(dg_bmp);
end;end.

相关文章:

  • React@16.x(29)useRef
  • 用python把docx批量转为pdf
  • [Rust] 求Vec中的最值、统计特定值的数量和统计数组总和
  • 软设之需求分析的工具
  • C++格式化库fmt使用方法
  • win10下使用docker和VMware
  • 高考毕业季--浅谈自己感想
  • 基于PPO的强化学习超级马里奥自动通关
  • 【Python】数据处理:Matplotlib绘图
  • mysql和redis的双写一致性问题
  • Qt | QDataStream 类(数据流)
  • 敏捷=996/007?现实是……
  • 【通过新能源汽车的智慧数字底盘技术看计算机的相关技术堆栈?以后是软硬结合的全能程序员的天下,取代全栈(前后端都会的全栈程序员)】
  • 怎么做才能推动产业园区的数字化转型和升级
  • 独孤思维:每天做着自己不喜欢的工作,你不难受吗
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【EOS】Cleos基础
  • Docker容器管理
  • flask接收请求并推入栈
  • Java IO学习笔记一
  • Java-详解HashMap
  • 服务器从安装到部署全过程(二)
  • 关于for循环的简单归纳
  • 强力优化Rancher k8s中国区的使用体验
  • 如何优雅地使用 Sublime Text
  • 设计模式(12)迭代器模式(讲解+应用)
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 用element的upload组件实现多图片上传和压缩
  • 字符串匹配基础上
  • 容器镜像
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • $.ajax,axios,fetch三种ajax请求的区别
  • ()、[]、{}、(())、[[]]命令替换
  • (1)STL算法之遍历容器
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十五)使用Nexus创建Maven私服
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .bat批处理(一):@echo off
  • .NET CF命令行调试器MDbg入门(一)
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET的微型Web框架 Nancy
  • .Net面试题4
  • .NET下ASPX编程的几个小问题
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .skip() 和 .only() 的使用
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [ IO.File ] FileSystemWatcher