1、说明

最近加入了一个项目组,使用的开发工具是delphi6,想想又要开始搞这个工具有点小忧伤,但没办法谁让咱就是个打杂的尼。。。

的需求是显示一个类似于Word/excel的那种表格,可以合并列等。。本来想用DBGridEh去解决,只是试了半天发现不能合并列,我了个去。。然后想到了网页来处理,但是尝试了一下马上就放弃,最后各种搜索后没得办法哦。。想了想就用TStringGrid来试试,毕竟也是个表格,可定制性也大的多,好吧。就用它试试。

2、技术点

最核心的功能还是由TStringGrid提供,一方面它已经具备了显示一个二维表格的能力,另一方面提供了灵活的设定来开启各种自定义的功能,比如是否显示网格线,行、列是否可以改变大小等。作了基本的设置,加载上数据就能显示出来。接下来要做的就是让表格内容显示的和我预期的一样。

因为表格需要类似于word中那种表格,主要是合并单元格之类的,样式方面可以按要求画就是了。所以主要的技术点:

1、自绘方法,直接就用OnDrawCell事件处理

2、表头,可以使用FixCol和FixRow的属性

3、文本换行

3、开发

3.1、属性设置

DefaultDrawing:设置为False,这样就不会在OnDrawCell之前进行绘制,否则会先进行父类的绘图功能,再调用OnDrawCell,由于许多内容我都是自己画的所以把它设置为False

RowCount:默认的初始行数,必须为大于等于2,否则会把FixedRows清为0,这样就没有表格头了。可以通过这个属性来增减行数,+1就多一行。

FixedRows:固定的行数,设置为1,因为一行是表格头

FixedCols:固定的列数,设置1,用一个固定的列可以显示序号,同时也可以用于鼠标调整行的高度

Options.goVertLine:数据区域的垂直网格线,默认为true,会默认显示cell的垂直边框。我在绘图的时候遇到了些麻烦就把它改成false,自己来画框

Options.goHorzLine:数据区域的水平风格线。同样设置为false

Options.goRowSizing:行高可调整,在运行时时可以通过鼠标来调整行高

Options.goColSizing:列宽可调整,在运行时可以通过鼠标来调整列的宽度

3.2、计算每行的文本高度

这个我找了半天也没找到比较简单好用的方法,最后就用TLabel这个控件来完成的。有点绕路,但感觉挺实用的。。呵呵。。。。呵呵。。

    label1.Caption := sData;
StringGrid1.RowHeights[iRow] := Label1.Height + ;

将文本赋值给label,然后再使用label的高度设置为StringGrid的行高,这样就能显示多行的文本了。但有一个问题,AutoSize为true时没法自动换行,醉了。这个问题后面再找办法解决吧。

后来使用的另一种方法挺好的:

    rect.Left := ;
rect.Top := ;
rect.Right := ;
rect.Bottom := ;
iHeight := DrawText(Self.Label1.Canvas.Handle, PChar(sData), Length(sData), rect, DT_WORDBREAK or DT_CALCRECT);

设定一个固定的矩形框,然后使用DrawText方法来绘制一次就能得到高度了,哈哈,不错的。。这样就得到了实际的文本高度。

DT_CALCRECT 就是用于计算文本的矩形宽高哦。

调用上面那句代码后,cellRect就会计算出文本显示的矩形大小了。同样就得到了宽高。

3.3、OnDrawCell事件

DrawCell事件里就是对每个单元格的绘图功能:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);

参数很实用:

ACol,ARow:就是列、行

Rect:就是Cell的矩形

State:指的是当前cell的状态,选择、焦点、固定

有了这些内容就可以进行想要的做操作了:

画边框:

sg.Canvas.Rectangle(Rect);

画文本:

DrawText(sg.Canvas.Handle,PChar(sData),Length(sData), Rect, DT_WORDBREAK or DT_VCENTER or DT_LEFT or DT_SINGLELINE);

差不多就这些功能。也就是画个框,再画个文本。。

学习笔记:delphi之TStringGrid的更多相关文章

  1. 转:学习笔记: Delphi之线程类TThread

    学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...

  2. 转:学习笔记:delphi多线程学识

    学习笔记:delphi多线程知识 最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处 ...

  3. Delphi 对象模型学习笔记(转)

    摘要     Borland Object Pascal 对象模型(现在已经正是命名为 Delphi 语言)与其他 OOP 语言一样,都提供了一些基础服务: 如对象创建服务.对象释放服务.对象识别服务 ...

  4. delphi操作xml学习笔记 之一 入门必读

    Delphi 对XML的支持---TXMLDocument类       Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...

  5. 转)delphi chrome cef3 控件学习笔记 (二)

    (转)delphi chrome cef3 控件学习笔记 (二) https://blog.csdn.net/risesoft2012/article/details/51260832 原创 2016 ...

  6. thrift学习笔记

    Thrift学习笔记 一:thrift介绍 Thrift是facebook开发的用来处理各不同系统之间数据通讯的rpc服务框架,后来成为apche的开源项目.thrift支持多种程序语言,包括Java ...

  7. MySQL存储过程学习笔记

    MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.MySQL 5.0终于开始支持存储过程了. MySQL的关键字大小写通用.该学习笔记对关键字使用大写:变量名,表名使用小写. ...

  8. 公共语言运行库(CLR)开发系列课程(1):Pinvoke 简介 学习笔记

    前言 让拖管代码对象和非托管对象协同工作的过程称为互用性(Interoperability),通常简称为 Interop. P/Invoke在托管代码与非托管代码交互式时产生一个事务(Transiti ...

  9. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  10. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

随机推荐

  1. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  2. Xamarin+Prism开发详解六:DependencyService与IPlatformInitializer的关系

    祝各位2017年事业辉煌!开年第一篇博客,继续探索Xamarin.Forms… 为什么我做Xamarin开发的时候中意于Prism.Forms框架?本章为你揭晓. 实例代码地址:https://git ...

  3. C语言 · 数位分离

    问题描述 编写一个程序,输入一个1000 以内的正整数,然后把这个整数的每一位数字都分离出来,并逐一地显示. 输入格式:输入只有一行,即一个1000以内的正整数. 输出格式:输出只有一行,即该整数的每 ...

  4. MySQL碎碎念

    1. 如何修改Mysql的用户密码 mysql> update mysql.user set password=password('hello') where user='root'; mysq ...

  5. 深入理解CSS六种颜色模式

    前面的话 赏心悦目的颜色搭配让人感到舒服,修改元素颜色的功能让人趋之若鹜.但颜色规划不当,会让网站用户无所适从.颜色从<font color="">发展至今,保留了很多 ...

  6. 调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法

    我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...

  7. Postman - 功能强大的 API 接口请求调试和管理工具

    Postman 是一款功能强大的的 Chrome 应用,可以便捷的调试接口.前端开发人员在开发或者调试 Web 程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的 Fi ...

  8. jQuery可拖拽3D万花筒旋转特效

    这是一个使用了CSS3立体效果的强大特效,本特效使用jQuery跟CSS3 transform来实现在用户鼠标按下拖动时,环形图片墙可以跟随鼠标进行3D旋转动画. 效果体验:http://hovert ...

  9. Android—万能ListView适配器

    ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...

  10. sqlServer去除字符串空格

    说起去除字符串首尾空格大家肯定第一个想到trim()函数,不过在sqlserver中是没有这个函数的,却而代之的是ltrim()和rtrim()两个函数.看到名字所有人都 知道做什么用的了,ltrim ...