後一頁
前一頁
回目錄
回首頁
第十四章 簡單資料庫應用的建立及MASTAPP介紹(一)

        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

────────────────────────────── 

        這�堶n注意的是: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表中檢索出這位用戶曾經發來的所有訂貨單的詳細資訊。主要——明細型資料庫體現了關係資料庫的特點,即獨立的資料庫表之間基於它們共同的欄位而發生聯繫。在這�釮ustomer.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中只顯示剛才被選中的四個欄位值,而不再顯示表中其它的欄位值。

 


後一頁
前一頁
回目錄
回首頁