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 中當前記錄相關的多條記錄,即顯示一個客戶的信息時,同時會顯示該客戶的所有訂貨單的詳細信息。