Delphi中统一显示表格字段名的高效方法
问题描述:在开发数据库程序时,我们经常要使用很多的表格显示组件DBGrid。当DBGrid显示某表格的数据时,其字段标题默认的就是后台数据库中的表格的字段名称。而为了数据库开发方便,后台数据库中的表格的字段标题通常是用英文表示的,如用Employees表中的EmployeesID表示雇员编号。但是我们开发给用户的程序必须以汉字显示字段标题,即我们要以‘雇员编号’显示给用户。假设我们是用ADOQuery组件(此处为了说明清楚只使用ADOQuery组件,实际可以是其它数据库组件)query1来加载Employees表的,则我们必须在query1组件的EmployeesID字段的DisplayLable改成‘雇员编号’。一个程序通常需要使用很多的表,且通常一个表要多次重复使用,显然表的字段也要多次被使用。每次都去修改每个字段的DisplayLable属性,这显然是一种效率低下的方法。是不是有一劳永逸的方法自动设置这些多而重复性非常大的DisplayLable属性呢?当然有。以下就以一个实例程序的方式介绍一种方法:
我们在MS SQL Server 2000 中有一表,其结构如下:
CREATE TABLE [Employees] (
[EmployeesID] [varchar] (6) NOT NULL ,
[EmployeesName] [varchar] (16) NOT NULL ,
[Sex] [char] (2) NULL ,
[Password] [varchar] (32) NULL ,
[Address] [varchar] (100) NULL ,
[Tel1] [varchar] (13) NULL ,
[Tel2] [varchar] (13) NULL ,
[Birthday] [datetime] NULL ,
[HireDate] [datetime] NULL ,
[LeaveDate] [datetime] NULL ,
[Notes] [varchar] (200) NULL ,
[CreateDate] [datetime] NOT NULL,
[CreateMan] [varchar] (6) NOT NULL ,
[ModifyDate] [datetime] NOT NULL,
[ModifyMan] [varchar] (6) NOT NULL ,
)
该表拥有众多的字段,如果由Delphi开发的前台程序要使用该表在DBGrid显示,则我们必须依次修改字段的DisplayLable属性。
我们在数据库中创建一个辅助表,结构如下:
CREATE TABLE [ColumnName] (
[ColumnName] [varchar] (20) PRIMARY KEY ,
[ChineseName] [varchar] (20) NULL ,
CONSTRAINT [PK_CN_CN] CLUSTERED
)
该表专门收集该数据库中所有视图和表格的英文字段标题和对应的中文标题。我们在MS SQL Server 2000中创建一个存储过程将所有表和视图的字段插入该表。该存储过程程序如下:
/*将本数据库中的表和视图的字段名插入ColumnName表中*/
CREATE PROCEDURE pInsertColumnName
AS
INSERT INTO ColumnName (ColumnName)
SELECT TableColumns FROM
(
SELECT DISTINCT c.name AS TableColumns
FROM dbo.sysobjects o FULL OUTER JOIN
dbo.syscolumns c ON o.id = c.id
WHERE (o.xtype = 'U' OR
o.xtype = 'V') AND (o.name <> 'dtproperties') AND (o.name <> 'sysconstraints') AND
(o.name <> 'syssegments')
)as tc
WHERE TableColumns NOT IN (SELECT ColumnName FROM ColumnName)
执行该存储过程,然后在表ColumnName中依次输入每个字段对应的中文标题。
我们知道,ADOQuery有Fields的属性,Fields又有FieldName的属性。FieldName即该字段的字段名。通过该FieldName我们就可以到ColumnName表中找到他对应的[ChineseName]。打开Delphi,在Delphi中创建一个过程,通过循环结构实现将每个字段的DisplayLable属性改成对应的[ChineseName]:
{设置表格头,其中参数ADOQuery为临时表,用于获取[ChineseName],参数ADOQueryMain为要修改字段标题的TADOQuery }
Procedure SetFieldsDisplayName(ADOQuery:TADOQuery;var ADOQueryMain:TADOQuery);
var
i: integer;
begin
with ADOQuery do
begin
Close;
SQL.Clear;
SQL.Add('SELECT ColumnName, ChineseName FROM ColumnName');
Open;
end;
try
//循环遍历每个字段
for i := 0 to ADOQueryMain.FieldCount - 1 do
ADOQueryMain.Fields[i].DisplayLabel :=
ADOQuery.Lookup('ColumnName', ADOQueryMain.Fields[i].FieldName,
'ChineseName')
except
Exit;
end;
end;
当query1组件要以中文显示每个字段头时我们在query1的AfterOpen事件中加入上面函数的调用:
SetFieldsDisplayName(qyTemp,query1);
这样就可实现一次性设置表格头。当我们运行程序再次看到DBGrid时,所有字段都成了对应当中文标题了。
该方法非常适合于使用表格很多而字段名重复性高的程序,它不但免去了开发时每次使用要设置DisplayLable的繁琐操作,更有一个重要的优点是,它避免了同一字段在不同地方因为程序员粗心使用不同的DisplayLable显示的现象。如需更改某个字段的中文标题只要到ColumnName表中更改该字段对应当[ChineseName]就行了。
该方法是不是很好呢?
Delphi中统一显示表格字段名的高效方法的更多相关文章
- DELPHI中枚举类型数据的介绍和使用方法
在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类 ...
- JS网站当前日期在IE9、Chrome和FireFox中年份显示为113年的解决方法 getFullYear();
JS网站当前日期在IE9.Chrome和FireFox中年份显示为113年的解决方法 getFullYear();
- 【转】shell脚本中echo显示内容带颜色的实现方法
shell脚本中echo显示内容带颜色的实现方法 shell脚本里使用echo输出颜色
- 转Delphi中Memo显示行号列号
http://www.alonely.com.cn/Delphi/20160814/8912.html 实例说明本例是个光标应用的简单技巧,希望通过这个例子的学习后能举一反三.Delphi中像这样简单 ...
- sql中count(*)和count(字段名)区别
数据测试:见图 sql 语句见分晓: SELECT COUNT(*) c1 ,COUNT(ADDRESS) c2 FROM test 显而易见,count(*)统计的是结果集的总条数,count(字段 ...
- DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)
DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...
- mysql 查询指定数据库中的表明和字段名
SELECT TABLE_NAME,COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_COMMENT LI ...
- sql中COUNT(*)、COUNT(字段名)的区别
数据表:其中IT002的Fname是null. 执行sql: ) FROM T_Employee 结果: 结论:COUNT(*)统计的是结果集的总条数,而COUNT(FName)统计的则是除了结果集中 ...
- Delphi中记录体做为属性的赋值方法
1. 起源 此问题源于[秋风人事档案管理系统]用Delphi XE重编译中所发现. 快十年了,当初Delphi 7所编写项目,想用Delphi XE重新编译,并打算做为Free软件发布,编译错误中发现 ...
随机推荐
- mybatis逆向工程之maven工程
maven工程与动态web工程存在差异,不过大体是相同的 注意:运行成功后记得refresh刷新下,否则看不到 一.在pom文件中进行如下配置 <project xmlns="http ...
- mac下安装nginx及相关配置
1. 安装 Homebrew 首先 homebrew是什么?它是Mac中的一款软件包管理工具,通过brew可以很方便的在Mac中安装软件或者是卸载软件.不了解的同学看以看官网(https://br ...
- Python排序算法——希尔排序(Shell’s Sort)
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10793487.html 一.希尔排序(Shel ...
- FreeRTOS创建任务
创建任务的函数如下: 第一个参数是:任务函数指针,即任务函数名. 敲黑板:创建任务和任务函数是两码事,一定要分清楚: 第二个参数是:这个参数不被FREE RTOS调用,就是辅助调试用的: 第三个参数是 ...
- Git使用—第二讲
前面我们学习了Git最基本的用法,包括安装Git.创建代码仓库,以及提交本地代码.下面我们将学习Git更多的使用技巧,在开始之前,我们先给一个项目创建代码仓库,这里选择在ProviderTest项目中 ...
- Apache Beam: 下一代的大数据处理标准
Apache Beam(原名Google DataFlow)是Google在2016年2月份贡献给Apache基金会的Apache孵化项目,被认为是继MapReduce,GFS和BigQuery等之后 ...
- C#去除字符串中的反斜杠
如下,可以使用C#的Replace()方法来替换,但有一点需要注意的是backslash(反斜杠)是特殊字符. string s = "[\"aaaaaaaaaaaaaaaaaaa ...
- NOIp2018停课刷题记录
Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...
- Python爬虫利器二之Beautiful Soup的用法
上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Be ...
- 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照
关于uFun学习板--"满满的爱和正能量" uFun是由@张进东 张工组织发起的一个开源的学习板,设计初衷是为了帮助学生更好的理解电子知识和开发技巧,同时又能对学生毕业找工作有很明 ...