1. 程式人生 > >Delphi中統一顯示錶格欄位名的高效方法

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]就行了。   該方法是不是很好呢?