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);

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

最新文章

  1. AI与PS
  2. 使用自定义tld标签简化jsp的繁琐操作
  3. Python基础-函数篇
  4. Pycharm使用问题# 内部Terminal
  5. 奇怪的梦境(codevs 2833)
  6. Android真机测试 INSTALL_FAILED_INSUFFICIENT_STORAGE 解决方法[转]
  7. Navicat(连接) -1之SSL 设置
  8. Dice chrone execise
  9. Linux天天见
  10. BZOJ 2339 卡农(组合数学)
  11. 《Python核心编程》 第四章 Python对象- 课后习题
  12. zoj1873 Let it Bead
  13. UV印刷
  14. Java 23种设计模式详尽分析与实例解析之三--行为型模式
  15. Maven项目问题
  16. Linux中kettle自动化部署脚本
  17. 我的SSH框架实例(附源码)
  18. flask基础之请求钩子(十二)
  19. jquery一句话实现快速搜索功能
  20. SolrJ API 官方文档最佳实践

热门文章

  1. PHP搭建大文件切割分块上传功能
  2. SQL Server技术内幕笔记合集
  3. 为C# as 类型转换及Assembly.LoadFrom埋坑!
  4. 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录
  5. ABP文档 - 后台作业和工作者
  6. 解构C#游戏框架uFrame兼谈游戏架构设计
  7. [原]Redis主从复制各种环境下测试
  8. 【云知道】究极秒杀Loadrunner乱码
  9. 微信小程序体验(1):携程酒店机票火车票
  10. windows 7(32/64位)GHO安装指南(U盘引导篇)~