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]就行了。

该方法是不是很好呢?

原文地址:https://www.cnblogs.com/jijm123/p/10125448.html

时间: 2024-08-24 07:59:52

Delphi中统一显示表格字段名的高效方法的相关文章

sql中count(*)和count(字段名)区别详解及用途

文章详细利用实例来介绍了关于sql中count(*)和count(字段名)区别有需要的同学可以参考一下下. 以前没有注意两者的区别,看博客园的文章,还真引起了我的注意. 数据测试:见图 sql 语句见分晓: SELECT COUNT(*) c1 ,COUNT(ADDRESS) c2 FROM test 显而易见,count(*)统计的是结果集的总条数,count(字段名)统计的是该字段值不为null的总条数

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

在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类型数据的介绍和使用方法.见笑..------------------------------------------------------枚举类型 Pascal程序不仅用于数值处理,还更广泛地用于处理非数值的数据.例如,性别.月份.星期几.颜色.单位名.学历.职业等.1.枚举类型的定义格式: ty

Delphi中Twebbrowser的document 对象的属性、方法、事件一览(转)

Delphi中Twebbrowser的document 对象的属性.方法.事件一览(转) 2012-12-07 10:19:39|  分类: Delphi 零碎 |  标签:webbrowser  属性  方法  事件  delphi   |举报 |字号大中小 订阅 {ihtmldocument2 方法:}write //写入writeln //写入并换行open //打开一个流,以收集 document.write 或 document.writeln 的输出close //关闭并输出用 do

转Delphi中Memo显示行号列号

http://www.alonely.com.cn/Delphi/20160814/8912.html 实例说明本例是个光标应用的简单技巧,希望通过这个例子的学习后能举一反三.Delphi中像这样简单而又实用的例子还有很多,只要平时多注意积累就能写出简洁.执行效率高的代码.编程思路直接向Memo组件发送消息EM_LineFromChar并检测返回值,即可获知此组件中光标所在的行号,向Memo组件发送消息EM_LineIndex并检测返回值即可获知此组件中光标所在的列号 实例说明 本例是个光标应用

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

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

C#中的类:字段、属性、方法

C++的类中可以有三种内容:成员变量.成员函数和友元. 一般来说,成员变量描述类的属性,成员函数描述类的操作,友元则是一种特殊的声明,被声明为友元的函数或类可以操作自己的私有成员变量和成员方法. 在Java中,类的成员有两类:属性,相当于C++的成员变量:方法,相当于C++的成员函数. 而在C#中,类的成员有四种:字段.属性.方法和事件(事件还没学到,暂缓解释). 字段相当于C++中的成员变量和Java中的属性,就是在类中定义的变量(可以是基本类型或引用类型),一般来说,字段都被定义为私有. 方

MB51升级后输入框的名字显示数据字段名

1.显示异常,如图: 解决方法: 1.se80中打开mb51 的源代码,进入文本元素 在文本元素界面可以看到有很多字段都是取自数据字典的字段文本,如图: 点分析按钮进人说明: 然后返回,菜单GOTO->TRANSACTION进入到翻译,如图: 比较完成后,界面的就能正常显示了

c#读取access中指定表的字段名及其描述

/// <summary> /// 获取指定表名的列名与描述注释 /// </summary> /// <param name="mdbFilePath"></param> /// <param name="tableName"></param> /// <returns></returns> public static Hashtable GetTableFieldsD

Delphi中拖动无边框窗口的5种方法

1.MouseMove事件中加入: // ReleaseCapture;// Perform(WM_SYSCOMMAND, $F017 , 0); 2.MouseDown事件中加入: // POSTMESSAGE(Self.Handle,WM_LBUTTONUP,0,0);// POSTMESSAGE(Self.Handle,274,61458,0); 3.MouseDown事件中加入: // ReleaseCapture;// Perform(WM_SYSCOMMAND, $F012, 0);