Delphi中嵌入的數據庫應用開發工具如Database Form Expert具有很強大的功能,我們不需要編寫任何程序代碼便可以快速地創建一個簡單的數據庫應用程序,甚至還能創建基於多個數據庫表的主要──明細型數據庫應用程序。
本章主要介紹用Delphi開發簡單的數據庫應用程序的一般方法和步驟,首先讓讀者對Delphi強勁的數據庫應用開發工具有一個直觀的印象,然後在此基礎上進行復雜的數據庫應用程序的設計,本章主要包括以下內容:
● 創建數據庫應用窗體
包括用Database Form Expert 或手工方式創建簡單的無需編寫程序代碼的應用程序或者利用多個部件並編寫功能復雜的程序代碼創建主要──明細型數據庫應用程序。
● 在應用程序中控制字段有關的屬性
描述怎樣讀寫數據庫表中字段的值和控制字段的顯示格式等。
本章所介紹的例子中用到的窗體、數據庫表以及相關的文件都是在安裝Delphi時缺省安裝在C:\Delphi\DEMOS\DB\MASTAPP目錄中,並且用別名DBDEMOS表示這一子目錄。在本章例子中,除特殊聲明外,所有的TTable和 TQuery 部件的 DatabaseName 屬性都設置為DBDEMOS。
14.1 簡單的基於單表的據庫應用
用Decphi創建顯示一個數據庫表中的內容的應用非常簡單和方便,只需要三個部件,只要將這三個部件通過相關的屬性相互聯系起來,不需要編寫任何程序代碼便可以實現。例如,用戶想查看數據庫表Customer.DB中的內容時,可以按下面步驟來實現:
14.1.1 選擇相關的部件:
選擇菜單Project/New開始一個新工程,並修改Form1的Caption屬性為CustomerFrom1並把Name屬性設置為CustomerForm1,然後從部件選擇板上的Data Access 頁上選取一個Datasounce部件和一個Table部件放到窗體的左上角,它們是非可見的部件,在窗體中我們看到的只是部件的圖標;從Data Control頁上選取DBGrid部件放到窗體中前兩個部件的下面。完成這些工作之後,窗體如圖14.1所示。
圖在CustomerFrom1窗體中放置三個部件
14.1.2 設置部件的屬性
為了使TDBGrid部件能夠顯示數據庫表Customer.DB中的客戶信息,我們必須修改窗體三個部件相關的屬性,這些屬性的設置如表14.1所示。
表14.1 CustomerFrom1窗體中三個部件的屬性設置
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
屬 性 屬 性 值
──────────────────────────────
DataSource1.AutoEdit False
DataSource1.DataSet Table1
Table1.DatabaseName DBDEMOS
Table1.TableName CUSTOMER.DB
Table1.Active True
DBGrid1.DataSource DataSource1
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
這裡要注意的是:DBDEMOS是Delphi缺省安裝時C:\Delphi\DEMO\DB\MASTAPP目錄的別名,而且數據庫表Customer.DB存在該目錄下,用戶在使用這一例子時,請注意這兩項設置都是正確的。另外 Datasource1.Dataset,Table1.TableName和DBGrid1.Datasource屬性都有下拉式列表框允許用戶從可能的值列表中選擇它們的值,這樣能方便我們進行屬性的設置,而且不容易出錯。
Datasouuce1.AutoEdit屬性設置為False是為了防止用戶修改數據庫表中的數據,在下面的討論中我們將詳細地進行說明。
Table1.Active設置為True時,Delphi會打開Table1.TableName所指定的數據庫表。如果這個數據庫表不存在(或表中什麼也沒有,即空表), Delphi 會彈出出錯信息並且Table1.Active變成False。當Table1.Active被設置成True之後,Table1 部件的一些屬性就不能再修改了,如Table1.DatabaseName和Table1.Tablename屬性。若要修改它們,必須首先要將Table1.Active屬性設置為False,然後再進行修改,否則,Delphi會彈出錯誤信息“Cannot perform this Operation on an open database”。當看到這個錯誤信息時,只需把Table1.Active置成False,完成相關的修改後,再把 Table1. Active 屬性設置為True。
當我們把DBGrid1.DataSource的值設置成DataSource1時,Delphi會把Customer.DB中的數據填充到DBGrid1部件中,並且可以用DBGrid1中的滾動條來浏覽數據庫表中的所有記錄。
14.1.3 運行程序
保存文件,命名代碼單元為Cust.pas,命名工程名為CustPRJ.DPR,然後按F9編譯並運行程序。程序執行之後,我們可以使用滾動條或鍵盤移動鍵在字段和記錄間移動。但不能修改表中的數據,因為Datasouc1.AutoEdit1屬性已被設置為False。
Cust程序中的三個部件都有各自的特殊用途,三個部件的相關屬性在內部相互聯系生成最終的應用程序。TTable部件連接磁盤上的實際數據庫表和應用程序中其他部件的通道。TTable部件具有打開和關閉、讀取、更新以及其他處理磁盤數據庫文件的方法。
TDatasource部件是連接TTable部件和數據浏覽部件如TDBGrid部件的橋梁。 TDBGrid部件用於顯示數據庫表中的數據信息,它為應用程序提供一個直觀的界面。圖14.2闡述了這三個部件之間的關系。
Cust程序中三個部件之間的內部關系
TDBGrid 部件的奇妙之處在於它知道如何去獲取數據庫表中的下一條或前一條記錄,我們使用滾動條或箭頭鍵便可以完成這項任務。TDBGrid部件不知道如何增加、刪除和修改記錄。如果想讓 Cust 程序能夠修改數據庫表中的記錄,只要把 Datasource1 部件的AutoEdit屬性設置成True ,並重新編譯和運行程序就可以達到目的。 使用箭頭鍵, 把DBGrid的高亮度條定位到某一個字段上,然後鍵入新值,該字段中的值將被鍵入的新值所取代,並且當移動到另一條記錄時,健入的信息會自動寫入數據庫表中。如果想放棄所做的改動,只需在離開該字段前按一下Escape鍵。
如果想在表中增加新記錄,可以把高亮度條移到網格底端的空白記錄上並輸入新記錄的有關字段值。也可以在用戶指定的某一條記錄的後面插入一條新記錄,只要把高亮度條定位到指定的記錄上,按Ins鍵,使可以在該記錄的後面插入新記錄。
刪除某一條記錄時,把高亮度條定位在想刪除的記錄的任何字段上,按Ctrl+ del鍵,這時會出現保護信息,我們可以確認是否真的想刪除該項記錄。
TDBGrid為用戶提供了較完備的功能,用於控制是否編輯、增加或刪除記錄。若想禁止對數據庫表作任何修改,設置TDBGrid部件的Readonly屬性為 True , 並設置 Option.dgEDiting為False(這將為我們提供一個只讀的數據庫表浏覽器而不是數據庫編輯器,但它隱含著增加、編輯和刪除記錄的能力)。TDBGrid部件的這些屬性和Option屬性其它選項的各種不同組合可以讓我們很方便地對數據庫表進行有效的浏覽、編輯等操作。
如果我們經常使用像電子表格那樣的界面來顯示和編輯數據記錄,TDBGrid 部件便是一個很方便的工具,但那並不是最友好的用戶界面,如果想擁有更優美更直觀的界面,我們還可以使用單獨的數據浏覽部件來顯示數據庫表中各個字段的值,並利用TDBNavigator部件控制對數據庫表的存取。
14.2 利用TDBNavigator部件創建存取程序
我們可以改進一下Cust程序以便它一次只在對話框中顯示一個客戶的記錄信息,並用一個TDBNavigator部件控制對記錄存取──允許我們選擇一個記錄來顯示或編輯以及增加和刪除記錄。完成的應用窗體。
增強的Cust程序
14.2.1 創建應用程序窗體
我們可以非常迅速地創建起來,因為到目前為止我們對創建窗體的方法已經比較熟悉,我們首先把所有的部件都放到窗體中,然後再設置它們的屬性。
開始一個新工程,設置窗體Form1的Name 屬性為 Customerform2 , Caption 屬性為 CustomerForm2。然後從部件選擇板上的Data Access頁上選取一個Datasource部件和一個Table部件放在窗體的右上角。再從Data Controls頁上選取DBNatvigator部件放在窗體的左上角。
窗體中其余的部件如圖14.3所示。它們是TDBEdit和TLabel部件,按圖14.3 所示創建並布置部件,分別命名DBEdit部件為EditCustno、 Editcompany 、 EditAddr1 、EditAddr2、EditCity、EditState、EditZip、EditCountry、EditPhone 、EditFAX、EditTaxRate、EditContact。
現在我們來連接TTable部件和 TDataSource 部件, 然後連接所有的數據浏覽部件和DataSource部件。設置TBNavigator部件和TDBEdit部件的屬性,它們的DataSource屬性都設置為DataSouce1。我們最後要做的事是連接窗體中各個TDBEdit 部件和它們在數據庫表中對應的字段名,通過設置TDBEdit 部件的 DataFIEld 屬性來完成。 例如要連接命名為EditCustNo的TDBEdit部件和數據庫表中的CustNo字段,具體步驟如下:
①選中窗體中的EditCustNo部件。
②在Object Inspector窗體中,單擊DataFIEld屬性右邊的箭頭。
③從下拉列表中選中CustNo字段名。
對窗體中的其他TDBEdit部件執行以上操作連接到其對應的字段,然後保存文件。命名代碼單元名為Cust2.pas,命名工程名為Cusprj2.DPR。
14.2.2 使用TDBNavigator部件移動記錄指針
上述程序運行之後,在數據浏覽部件中會顯示數據庫表中的第一條記錄。利用Tab 鍵可以在字段之間移動,但是不能編輯字段。因為我們為了防止意外修改,設置了Table1的AutoEdit屬性值為False。如果想對數據庫表中的記錄進行編輯、插入和刪除操作或者想顯示數據庫表中另一條記錄, 需要按 TDBNvigator 部件上這些功能所對應的功能按鈕。TDBNavigator部件上的按鈕和它們的功能如圖14.4所示。
TDBNavigator中的按鈕
TDBNavigator部件的絕大多數功能都可以根據其按鈕的圖標能夠很容易地識別出來,而且TDBNavigator部件本身能感知到很多事情,如當前指針是否在數據庫表的開頭或尾部。如果用戶正在查看數據庫表中的最後一個記錄,Next和Last按鈕將會變灰成為非活動狀態。同樣,如果用戶當前正在浏覽數據庫表中的第一條記錄, TDBNavigator 上的 First 和Previous按鈕會變灰而成為非活動狀態。有關各個按鈕的作用的更詳細說明請查看聯機幫助。
如果用戶想修改當前的記錄,單擊TDBNavigator部件的Edit按鈕,然後完成需要做的修改,在做完修改之後,單擊Post按鈕以便將作的修改寫入實際的數據庫表中(更新實際的數據庫表中的記錄在數據庫術語中叫作“投寄”記錄即PostT)。如果想取消所做的修改,單擊Cancel按鈕。Cancel按鈕只取消自從上一次往數據庫表中投寄記錄以來對記錄所做的修改。例如,如果用戶曾修改了CustNo字段並單擊了Post按鈕投寄了修改,然後再修改Company字段並按Cancel,那麼只有對Company所做的修改將會被取消。也就是說,一旦修改被寫入了數據庫表中,再按Cancle按鈕是無法取消對記錄的修改的,要想恢復到以前的狀態,用戶必須要重新編輯修改記錄。值得注意的是,當用戶修改了當前的記錄,並移動到其他記錄時,TDBNavigaator部件會自動地投寄用戶對記錄的修改。例如:如果我們修改了記錄的Company字段,並沒有按Post按鈕以更新表中的記錄,而是移動到下一條記錄,這時用戶對記錄的修改也會自動地被寫入數據庫表中。
14.2.3 定制TDBNavigator部件
TDBNavigator部件中的按鈕對我們開發人員來說是很方便的,但對於程序的最終用戶來說不一定那麼一目了然。為了幫助最終用戶或初級用戶更方便有效地使用TDBNavigator部件,我們可以設置TDBNavigator部件的ShowHint屬性為True,這樣當鼠標光標停留在TDBNavigator部件上的某一個按鈕上超過大約1秒鐘,在屏幕上便會出現該按鈕的提示信息。如果我們不想使用TDBNavigator部件本身嵌入的提示信息,我們還可以設置TDBNavigtor部件的Hints屬性,為每個按鈕指定特定的提示信息,以幫助用戶使用TDBNavigator部件。
TDBNavigator部件中有多個功能按鈕,但並不是所有的按鈕對每一個數據庫應用程序都是需要的,特別是那些不允許修改表中的數據,或修改只是在很嚴格的控制下進行的數據庫應用程序。我們可以通過設置TDBNavigator部件的 VisibleButtons 屬性來確定要在TDBNavigator中顯示哪些按鈕步顯示哪些按鈕。例如,如果我們不允許用戶修改表中的記錄,我們就不需要Add、Delete、Post、Cancel 或 Refresh 按鈕, 我們設置這些按鈕的VisibleButtons屬性為False,這樣在TDBNavigator部件中將不會出現這些按鈕。
TDBNavigator部件的ConfirmDelete屬性和Delete 按鈕配合使用對用戶刪除數據庫表中的記錄是非常有用的,當ConfirmDelete屬性設置為 True (缺省設置), 當用戶單擊Delete按鈕試圖刪除當前記錄時,Delphi會彈出一個確認框,要用戶確認是否真的想刪除當前記錄。這樣,在用戶進行刪除記錄的操作時,會更安全一些。如果用戶不希望在按下Delete按鈕時出現確認框,只要把ConfirmDelete設置為False就可以了。
還有一些屬性可以用來定制TDBNavigator部件的外觀和性能,有關這方面的詳細信息請參看聯機幫助。
14.3 創建主要──明細數據庫應用
我們前面在介紹的基於單個數據庫表的數據庫應用程序只能對數據庫表進行簡單的管理,大多數只用來浏覽單個數據庫表中的記錄信息,如果我們想浏覽多個相關的數據庫表中的記錄信息,就必須要創建主要──明細型數據庫應用程序。
在主要──明細型數據庫應用程序中,一個數據庫表作為主要表,其中存放著綜合信息,其他的數據庫表和主要數據庫表相關聯,它們當中存放著更詳細的信息。例如,當數據庫表Customer.DB作為主表,它包含著客戶的綜合信息如編號、姓名、所在公司的名稱等等。而數據庫表Orders.DB中包含著每個客戶的訂貨單的詳細信息,如訂單號、發貨日期、起運日期、發貨目的地等信息,這樣當在Customer.DB表中查看某一位客戶時,利用其中的字段CustNo與Orders.DB表發生聯系,自動地從Orders.DB表中檢索出這位客戶曾經發來的所有訂貨單的詳細信息。主要──明細型數據庫體現了關系數據庫的特點,即獨立的數據庫表之間基於它們共同的字段而發生聯系。在這裡Customer.DB和Orders.DB擁有一個共同的字段CustNo。
14.3.1 一對多關系的主要──明細型數據庫應用程序
主要和明細數據庫表之間存在一對多的關系,意思是說對於主表中的一條記錄,在明細表中有多條記錄與之對應。例如,創建一個主要──明細型數據庫應用程序,其包括兩個表Customer.DB和Orders.DB,它們分別作為主表和明細表,創建好的應用如圖14.5所示,窗體中各部件的屬性設置
表14.2 主要──明細型數據庫應用中各部件的屬性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部 件 屬 性 屬 性 值 注 釋
──────────────────────────────────
Table1 Active True
(主表) DatabaseName DBDEMOS
TableName CUSTOMER.DB
──────────────────────────────────
DataSource1 DataSet Table1
AutoEdit False
──────────────────────────────────
Table2 Active True
(明細表) DatabaseName DBDEMOS
TableName ORDERS.DB
IndexFIEldNames CUSTNO 指定字段CUSTNO作為
Table2中的索引字段
MasterFIEld CUSTNO 指定與主表發生聯系
的字段
MasterSource DataSource1 說明與主表相連接的
數據源即DataSource
──────────────────────────────────
DataSource2 DataSet Table2
AutoEdit False
──────────────────────────────────
DBGrid1 DataSource DataSource1
(對應主表)
──────────────────────────────────
DBGrid2 DataSource DataSource2
(對應明細表)
TableName ORDERS.DB
──────────────────────────────────
DBNavigator1 DataSource DataSource1
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
一對多關系是非常普遍的關系。即便是簡單的名字/ 地址數據庫都有一對多的關系,因為一個人可能不止一個地址:家庭地址、工作地址、還可能有別墅地址。在本例中,公司的一個客戶常常有多個訂貨單,當我們單擊DBNavigator1中的向前、向後按鈕時,會移動DBGrid1中的記錄指針,而在DBGrid2中會自動顯示與DBGridl 中當前記錄相關的多條記錄,即顯示一個客戶的信息時,同時會顯示該客戶的所有訂貨單的詳細信息。
14.3.2 一對多──多關系的數據庫應用
前面我們介紹了基於兩個表的一對多關系的應用,下面我們介紹怎樣創建一個從三個表中浏覽數據記錄的一對多關系的應用。
例如:一個客戶也許有多張訂貨單,而每一張訂貨單中有多個訂貨項目,這樣我們在Customer.DB表和Orders.DB表之間建立一個主要──明細型關系,同時在orders.DB 表和Items.DB表之間建立一個主要──明細型關系。
窗體中各部件的屬性如表14.3所示
表14.3 一對多──多關系的應用中各部件的屬性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部 件 屬 性 屬 性 值 注 釋
──────────────────────────────────
Active True
Table1 DatabaseName DBDEMOS
TableName CUSTOMER.DB
──────────────────────────────────
DataSource1 DataSet Table1
AutoEdit False
──────────────────────────────────
Active True
DatabaseName DBDEMOS
Table2 TableName ORDERS.DB
IndexFIEldNames CUSTNO
MasterFIEld CUSTNO
MasterSource DataSource1
──────────────────────────────────
DataSource2 DataSet Table2
AutoEdit False
──────────────────────────────────
Active True
DatabaseName DBDEMOS
Table3 TableName ORDERS.DB
IndexFIEldNames ORDERNO
MasterFIEld ORDERNO
MasterSource DataSource2
──────────────────────────────────
DataSource3 DataSet Table3
AutoEdit False
──────────────────────────────────
DBGrid1 DataSource DataSource3
──────────────────────────────────
DBNavigator1 DataSource DataSource1
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
窗體中其余的部件都是TDBEdit和TLabel部件,它們用於顯示Customer.DB中的字段值和Order.DB中的字段值。在該例子中,總共連接了三個表, Customer. DB 表是主要表,Orders.DB表在窗體中起到了雙重作用,它既是Customer.Db表的明細表,同時又是Items.DB表的主要表,Items.DB表是Orders.DB表的明細表。
14.4 字段對象的使用
Ttable和TQuery部件中有一個TField類型的屬性Fiedls,Fields是TField類型的對象的列表,TFIEld對象列表是Delphi數據庫中較難以理解的一個對象,它是 TTable 部件和TQuary部件的一部分,它們是不能夠選擇到窗體中的獨立的部件,而且無論是在設計階段還是在程序運行過程中,它們都沒有可見的圖像。即使到Object Inspector窗中察看它們也很困難。
Tfield對象是在打開磁盤上的數據庫表時動態產生的,並在數據庫表被關閉時自動消失,TField對象可以控制表中的每一列是否在數據浏覽部件中顯示以及以何種格式顯示等等。通過字段編輯器(Fields Editor)我們可以建立永久性的TField 對象列表代替動態的TfIEld對象列表供Delphi應用程序使用,通過FIElds Editor建立的永久性的字段對象會自動地加入到程序庫單元的TForm類型定義中,它們保存在應用程序中,即使數據庫表的基本結構發生了改變,它也是一直保留著,當然如果修改後的表中使得原來所定義的字段對象不再存在,Delphi應用程序在運行過程中會給出現錯誤信息。
14.4.1 字段對象的類型
字段對象TFIEld對應數據庫記錄中的各個字段,因為數據庫記錄中的字段有多種數據類型,因此對記錄字段可能出現的每一種數據類型都有一個獨立的TField類型與之對應。TFIEld的類型如表14.4所示
表14.4 字段對象的類型
━━━━━━━━━━━━━━━━━━━━━━━━━
字段對象的類型 對應的數據類型
─────────────────────────
TBooleanFIEld 布爾型數據
TCurrentyFIEld 貨幣型數據
TStringFIEld 字符串數據
TIntegerFIEld 整數型數據
TBLOB 大二進制對象
━━━━━━━━━━━━━━━━━━━━━━━━━
在大多數情況下可能使用的是TStringField和TIntegerField類型的字段對象,從編程的角度來看這些TField對象的不同類型是完全相同的,應用程序是根本不必關心TFIEld對象的實際類型,它們之間的主要區別在於:它們內部保留的以及它們和數據庫表之間傳遞的數據類型不一樣。
14.4.2 創建永久性的字段對象
我們知道字段對象在設計和運行階段都是不可見的,它既可以隨著磁盤上的數據庫文件被打開時動態地生成也可以通過字段編輯器Fields Editor來創建它。 在應用程序中使用Fields Editor可以為數據庫表中的字段創建相應的永久性的TField對象,TFIEld 部件是不可見的部件,但是通過它,我們可以定義數據庫表中各字段的顯示屬性和顯示順序以及控制字段的取值范圍等。下面的例子,告訴我們如何使用FIElds Editor定義Customer.DB表中的四字段,並在網格中顯示表中的記錄信息。
操作步驟:
1、建立一個基於 customer. DB 表的數據庫應用窗體,並在窗體中用一個網格顯示customer.DB中的全部字段,詳細方法請參見14.1節,建好的窗體如圖14.1所示。
2、設置窗體中Table1的Active屬性為True,使網格顯示表中的記錄。
3、選中Table1並雙擊鼠標左鍵,打開字段編輯器FIElds Editor,缺省情況下字段列表為空。
4、單擊鼠標右鍵彈出一個彈出式菜單,然後選擇Add FIElds菜單項,缺省情況下表Customer.DB中的全部字段被選進字段列表框。從字段列表框中選擇你要在網格中顯示的字段,具體做法是:單擊Custno字段,並按住CTR鍵,再單擊Company、Phone、LastInviceDate字段,然後單擊OK按鈕,確認被選擇的四個字段,時窗體中的DBGrid1中只顯示剛才被選中的四個字段值,而不再顯示表中其它的字段值。
5、改變字段的顯示順序。單擊LastInvoiceDate 字段並將它拖放到字段列表框中的第三行,即處於Company和Phone字段之間。此時窗體中顯示Customer.DB 表中記錄的字段將按新的順序顯示。
6、選擇Close按鈕,關閉字段編輯器FIElds Editor。
7、按F9,運行上述程序。
14.4.2 字段對象的屬性設置
雖然字段對象是不可見的對象,但是它同樣具有很多的屬性。在程序設計階段,我們通過一定的方式可以設置它的有關屬性,下面是設置字段對象的屬性的方法和步驟。
1、選擇窗體中的table1。
2、雙擊table1,打開字段編輯器FIElds Editor。
3、選擇要設置屬性的字段。
4、在Object Inspector中修改字段對象的屬性。
我們可以按上述方法設置Table1中各字段對象的有關屬性,當我們選擇Custno字段並修改其屬性,窗體內會出現對話
字段對象的屬性
修改字段CustNo的Alignment屬性為taCenter,此時網格中顯示的CustNo 字段值由原來的右對齊變成了居中。
表14.5中列出了字段對象在設計階段可以修改的屬性以及屬性說明
表14.5 字段對象的重要屬性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
屬 性 注 釋
─────────────────────────────────
Alignment 說明字段值的顯示方式:左對齊、右對齊、居中
─────────────────────────────────
Calculated 當該屬性值為True時,表明該字段的值是根據其它字
段的值計算得來的。否則該字段是數據庫表中的字段
─────────────────────────────────
DisplayLabel 說明字段在網格部件中顯示時的標題,缺省情況下字
段的標題就是字段名
─────────────────────────────────
DisplayWidth 說明字段在網格中顯示時所點的列寬度,即字符數
─────────────────────────────────
DisplayFormat 說明字段在顯示和編輯狀態下的顯示格式和輸入的過
and EditMask 濾條件(限定用戶輸入字段值的范圍)。
─────────────────────────────────
FIEldName 在數據庫表中對應於該字段對象的字段名稱
─────────────────────────────────
Index 指定該字段對象在數據集部件中的邏輯位置,如Table1
中的第一個字段對象的Index值為0
─────────────────────────────────
Name 字段對象的名稱,缺省情況下,它是TTable、TQuery
部件的名稱加上字段的名稱。如上例中的CUSTNO字段
對象的Name屬性值為Table1CUSTNO,通過字段對象的
Name屬性可以訪問該字段的值,如Table1CUSTNO.Value
─────────────────────────────────
ReadOnly 說明該字段是否能被修改,當該屬性值為True時,該
字段的不能被修改
─────────────────────────────────
Visible 當該屬性值為True時,在與之相連的網格部件中將不
顯示該字段
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
根據表14.5中的屬性,我們可以修改上例中一些字段的某些屬性, 使網絡中顯示表Customer.DB中的記錄更符合我們的工作習慣。修改的屬性如表14.6所示,經過修改後的程序運行結果如圖14.10所示。
表14.6 修改後的字段對象的屬性
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字 段 屬 性 屬 性 值
─────────────────────────────
CustNo DisplayLabel 客戶編號
─────────────────────────────
Company DisplayLabel 公司名稱
─────────────────────────────
Phone DisplayLabel 電話號碼
─────────────────────────────
LastInvoiceDate DisplayLabel 購買日期
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
修改字段對象的屬性
14.4.4 字段對象的訪問
字段對象在應用程序中有動態生成的,也有通過字段編輯器FIElds Editor 創建的永久性的,它們雖然在設計和運行階段都是不可見,但是它們跟其他的對象一樣都擁有自己的屬性、方法和事件,因此我們在應用程序中是可以對字段對象進行控制和訪問的。
因為動態字段對象是沒有自己的名字的,永久性的字段對象有自己的名字,所以對這兩種字段對象的訪問方法是不一樣的。
14.4.4.1 動態字段對象的訪問
動態字段對象存在於數據集部件TTable和TQuery部件中,它們是隨著磁盤上的數據庫文件的打開而動態生成的,並且每一個字段對象對應於數據庫表中的一個字段(即記錄的一列),TTable或TQrery部件中所有的字段對象存在屬性Fields列表中,FIElds列表中的字段對象就像數組元素一樣擁有自己的索引號,我們可以用這個索引號來訪問字段對象。索引號在程序運行時賦值,從0開始,表中最左邊的一列(第一個字段)的索引號為0,緊接著右邊一個為1,以此類推。訪問這些屬性的方法和處理其他對象一樣。
Table1.FIElds[0].DisplayLabel:='標識符'
上述代碼讓我們訪問與Table1相連的數據庫表中的第一個字段,並為該字段指定一個標題,這是通過設置它的DisplayLabel屬性值為一個特定的標識符來實現的。
通過索引號來訪問Fields屬性中的字段在使用For循環對列號進行迭代時會非常有用。但是在大多數簡單應用程序中,通過列名(字段名)來訪問字段會更加明白而且易讀。在TTable部件中,提供了一個名為FIEldByName的方法以便讓我們通過列名訪問字段對象。
Table1.FIEldByName('CustNo').DisplayLabel:='標識符'
通過這種途徑同樣可以訪問CUSTOMER.DB表中的CustNo字段,並為該字段指定一個標題信息。
現在我們可以建立一個允許用戶通過字段名和索引號來訪問Customer.DB 表中的字段對象的簡單窗體。
字段對象的訪問
在該應用窗體的運行過程中,我們通過程序來訪問其中的字段對象並設置有關的屬性,這一控制過程我們放在窗體的OnCreate事件處理過程中。
例14.1 在窗體的Oncreate事件處理過程中訪問字段對象。
procedure TForm1.FormCreate(Sender:TObject);
Begin
with Table1 Do
begin
{通過索引號訪問字段對象}
FIEld[0].DisplayLabel:='客戶編號';
{通過字段名訪問字段對象}
FIEldByName('Company').DisplayLabel:='公司名稱';
FIEldByName('Phone').DisplayLabel:='電話號碼';
FIEldByName('LastInvoiceDate').DisplayLabel:='購買日期';
end;
end;
在程序運行過程中訪問字段對象
14.4.4.2 永久性字段對象的訪問
通過字段編輯器FIElds Editor 建立的永久性字段對象的訪問相對於動態字段對象的訪問要簡單得多,我們在程序中可以直接通過字段對象的名稱(即Name屬性)進行訪問。
例如:
Table1CustNo.DisplayLabel:='客戶編號';
Table1CustNo.DisplayWidth:=12;
14.4.4.3 字段對象的讀取和賦值
通過字段對象的Value屬性,我們可以讀取字段對象的值,例如在如圖14.13所示的窗體中,單擊Read按鈕便可以將Customer.DB表中當前記錄的COMPANY字段的值讀取到編輯框Edit1中。
讀取字段對象的字段值
窗體中各部件的屬性如表14.7所示
表14.7 各部件的屬性
━━━━━━━━━━━━━━━━━━━━━━━━
部件的屬性 屬 性 值
────────────────────────
Button1.Caption &Read
Button1.Name Button1
Label1.Caption 字段值
Label1.Name Label1
Edit1.Text
Edit1.Name Edit1
━━━━━━━━━━━━━━━━━━━━━━━━
其它部件的的屬性跟前面的例子一樣。
為Read按鈕編輯的OnClick事件處理過程如下:
procedure Form1.TButton1Click(Sender:TObject);
begin
Edit1.Text:=Table1Company.Value;
end;
在這裡要注意的是:從字段對象中讀取字段值時必須要將它賦給與之數據類型相匹配的變量,否則會出錯。在上面的程序代碼中,Table1Company的類型是TStringFIEld 即是字符串類型的字段,而編輯框Edit1的屬性Text的類型也是字符串型的,因而它們是匹配的。如果類型不匹配,則要經過一定的轉換才能夠相互賦值。如:
Edit1.Text:=Table1CustNo.Value
這條代碼在運行過程中將會出錯,因為TablelcustNo是TFloatFIEld 類型即是數值型數據,要在編輯框Edit1中顯示數值型數據要經過下列轉換:
Edit1.text:=Table1CustNo.AsString;
AsString是字段對象的屬性,通過字段對象的AsString屬性可以讀取字段值並且將它轉換成字符串類型。字段對象的字段值可以轉換成以下幾種類型的數據:
AsString: 將字段值轉換成字符串數據
AsBoolean: 將字段值轉換成布爾型數據
AsDateTime: 將字段值轉換成日期時間數據
AsFloat: 將字段值轉換成數值型數據
AsInteger: 將字段值轉換成整數型數據
下面的程序代碼是從字段對象中讀取字段值並將它顯示在編輯框Edit1中,或者將字段值賦給相匹配的變量。
CustNoDouble: Double;
CustNoInt: Integer;
CustNoString: String;
{在Edit1中顯示字段值}
Edit1.Text:=Table1Company;{類型相匹配,不需要轉換}
Edit1.Text:=Table1CustNo.AsString;{類型不匹配,需要轉換}
{將字段值賦給變量}
CustNoDouble:=Table1CustNo.Value;{類型相匹配,不需要轉換}
CustNoInt:=Table1CustNo.AsInteger;{類型不匹配,需要轉換}
CustNoString:=Table1CustNo.AsString;{類型不匹配,需要轉換}