问题描述:在开发数据库程序时,我们经常要使用很多的表格显示组件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中统一显示表格字段名的高效方法的更多相关文章

  1. DELPHI中枚举类型数据的介绍和使用方法

    在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类 ...

  2. JS网站当前日期在IE9、Chrome和FireFox中年份显示为113年的解决方法 getFullYear();

    JS网站当前日期在IE9.Chrome和FireFox中年份显示为113年的解决方法 getFullYear();

  3. 【转】shell脚本中echo显示内容带颜色的实现方法

    shell脚本中echo显示内容带颜色的实现方法 shell脚本里使用echo输出颜色  

  4. 转Delphi中Memo显示行号列号

    http://www.alonely.com.cn/Delphi/20160814/8912.html 实例说明本例是个光标应用的简单技巧,希望通过这个例子的学习后能举一反三.Delphi中像这样简单 ...

  5. sql中count(*)和count(字段名)区别

    数据测试:见图 sql 语句见分晓: SELECT COUNT(*) c1 ,COUNT(ADDRESS) c2 FROM test 显而易见,count(*)统计的是结果集的总条数,count(字段 ...

  6. DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)

    DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...

  7. mysql 查询指定数据库中的表明和字段名

    SELECT TABLE_NAME,COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_COMMENT LI ...

  8. sql中COUNT(*)、COUNT(字段名)的区别

    数据表:其中IT002的Fname是null. 执行sql: ) FROM T_Employee 结果: 结论:COUNT(*)统计的是结果集的总条数,而COUNT(FName)统计的则是除了结果集中 ...

  9. Delphi中记录体做为属性的赋值方法

    1. 起源 此问题源于[秋风人事档案管理系统]用Delphi XE重编译中所发现. 快十年了,当初Delphi 7所编写项目,想用Delphi XE重新编译,并打算做为Free软件发布,编译错误中发现 ...

随机推荐

  1. spring+springmvc+hibernate整合实例

    最近要弄一个自动化生成表及其实体对应的增删改查的框架,于是我想到了hibernate,hibernate就有根据实体自动建表,而且增删改查,都不需要想mybatis那样在xml文件中配置. 不过怎样让 ...

  2. luogu-1563玩具谜题

    题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singersi ...

  3. java 面向对象基本知识

    1.继承 使用extends实现继承 只有单继承 子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法).  instanceof是二元 ...

  4. HashMap 的实现原理

    hashMap用了一个名字为table的数组:还有若干个名字为entry的链表.看hashMap是如何应用这些数据结构的.用插 入<key,value>举例:hashMap首先会通过key ...

  5. CF666E Forensic Examination 广义SAM、线段树合并、倍增、扫描线

    传送门 朴素想法:对\(M\)个匹配串\(T_1,...,T_M\)建立广义SAM,对于每一次询问,找到这个SAM上\(S[pl...pr]\)对应的状态,然后计算出对于每一个\(i \in [l,r ...

  6. (转)Linux的用户和用户组管理

    原文 Linux是个多用户多任务的分时操作系统,所有一个要使用系统资源的用户都必须先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面能帮助系统管理员对使用系统的用户进行跟踪,并 ...

  7. 让IIS7和IIS6识别PUT和DELETE请求

    项目组最近需要开展自动化测试,针对老的Aspx页面,这个做自动化测试的成本太高,于是我们想从老代码中封装一些ashx的Restful服务出来,Restful我们使用HTTP的GET.POST.PUT. ...

  8. ubuntu12.04安装squid

    一:简介 1.Squid:优化Web交付 Squid是支持HTTP,HTTPS,FTP等的Web的缓存代理.它通过缓存和重用经常请求的网页来减少带宽并缩短响应时间.Squid拥有广泛的访问控制,是一个 ...

  9. R实战 第十一篇:处理缺失值

    在真实的世界中,缺失数据是经常出现的,并可能对分析的结果造成影响.在R中,经常使用VIM(Visualization and Imputation of Missing values)包来对缺失值进行 ...

  10. Java各厂对外的优质博客

    1.美团:https://tech.meituan.com/ 2.极客学院:http://wiki.jikexueyuan.com/list/java/