学习笔记:delphi之TStringGrid

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 + 10;

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

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

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

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

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

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

时间: 2024-09-30 05:30:21

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

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

学习笔记:delphi多线程知识 最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处. Delphi的线程同步方法: 1.临界区 申明一个临界资源 FLock : TRTLCriticalSection; 先初化一个临界资源对象 InitializeCriticalSection(FLock) 销毁临界资源对象 DeleteCriticalSection(FLock) proced

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

学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时间. TThread-简单的开始 在Delphi的VCL中封装了一个TThread类用于多线程的开发,这样比较符合面向对象的思想,同时又可以提

Delphi 学习笔记

1.赋值语句“:=” :“=”不是赋值,是对比 2.注释:单行注释“//”:多行注释“{}”. 3.灰鸽子软件的作者是葛军,采用delphi编写:上兴远控也是用deiphi写的. 4.project-->options-->Application 设置exe文件名称.图标. 5..dfm 文件保存的是窗体及其控件位置文件..pas 文件保存窗体的代码:.dpr 工程文件. 6.Object Inspector 对象观察器 :properties 属性:events 事件. 7.Delphi语法

thrift学习笔记

Thrift学习笔记 一:thrift介绍 Thrift是facebook开发的用来处理各不同系统之间数据通讯的rpc服务框架,后来成为apche的开源项目.thrift支持多种程序语言,包括Java,Python,Ruby,JavaScript,Node.js,Go,C,C++,C#,Erlang,Delphi,Perl,Php,SmallTalk,OCaml,Haxe,Haskell,D语言.Thrift采用IDL(Interface Defination Language)描述性语言来定义

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

java/android 设计模式学习笔记(16)---命令模式

这篇博客我们来介绍一下命令模式(Command Pattern),它是行为型设计模式之一.命令模式相对于其他的设计模式更为灵活多变,我们接触比较多的命令模式个例无非就是程序菜单命令,如在操作系统中,我们点击关机命令,系统就会执行一系列的操作,如先是暂停处理事件,保存系统的一些配置,然后结束程序进程,最后调用内核命令关闭计算机等,对于这一系列的命令,用户不用去管,用户只需点击系统的关机按钮即可完成如上一系列的命令.而我们的命令模式其实也与之相同,将一系列的方法调用封装,用户只需调用一个方法执行,那

开源的人工神经网络计算库 FANN 学习笔记 1

开源的人工神经网络计算库 FANN 学习笔记 1 这年头机器学习非常的火,神经网络算是机器学习算法中的比较重要的一种.这段时间我也花了些功夫,学了点皮毛,顺便做点学习笔记. 介绍人工神经网络的基本理论的教科书很多.我正在看的是蒋宗礼教授写的<人工神经网络导论>,之所以选这本书,主要是这本比较薄,太厚的书实在是啃不动.这本书写的也比较浅显,用来入门正合适. 看书的同时也在网上找了找人工神经网络的库代码.感觉 FANN 这个库还不错,就顺道学了学这个库的使用方法. FANN 是个开源的 C 语言实

初探swift语言的学习笔记(类对象,函数)

swift扩展了很多功能和属性,有些也比较奇P.只有慢慢学习,通过经验慢慢总结了. 下面将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // Created by apple on 14-6-8. // Copyright (c) 2014年 fengsh. All rights reserved. /* 写本例子的目的在于快速学习swift类的写法,包括知识点: 1.属性设置 2.构造.释构 3.

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu