1. 程式人生 > >Delphi中統一顯示表格字段名的高效方法

Delphi中統一顯示表格字段名的高效方法

都去 創建 objects rsquo into var font 所有 temp

問題描述:在開發數據庫程序時,我們經常要使用很多的表格顯示組件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中統一顯示表格字段名的高效方法