程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> delphi程序設計.1

delphi程序設計.1

編輯:Delphi

Delphi應用程序框架和設計

第4章 應用程序框架和設計

本章內容:
1. 理解Delphi環境和項目的體系結構
2. 構成Delphi5項目的文件
3. 項目管理提示
4. Delphi5項目的框架類
5. 定義公共體系結構----使用對象庫
6. 一些項目管理的功能
本章主要介紹Delphi的項目管理和體系結構,將告訴你怎樣正確使用窗體(Form)以及怎樣運用它們的功能和可視化特征。本章將討論應用程序啟動/初始化過程、窗體重用/繼承以及增強的用戶界面等技術。本章還要介紹下列構成Delphi5應用程序的類:TApplication、TForm、TFrame和TScreen。我們將向你證明掌握這些概念有助於正確建立應用程序。

4.1理解Delphi環境和項目的體系結構
要正確建立和管理Delphi5項目,至少有兩個重要因素。第一是要了解創建項目的開發環境的細節,第二是要知道構成Delphi5項目的體系結構。這一章並不帶你深入了解Delphi5的開發環境(Delphi文檔介紹了怎樣使用這個環境);相反,這一章只講述Delphi5 IDE的特點,以幫助你更有效地管理項目。本章還要解釋Delphi應用程序的體系結構。這不但使你能夠充分發揮開發環境的特點,而且使你能夠正確使用其固有的體系結構。
我們的第一個建議是:熟練掌握Delphi5開發環境。本書假設你已經熟悉Delphi5的IDE。其次,本書假設你已經讀過Delphi5的文檔。但是,你仍然應該把Delphi5的菜單和對話框都打開一遍。如果遇到什麼不清楚的選項、設置或操作,應該打開在線幫助從中找到答案。在這裡所花費的時間將被證明是值得的(更不用說還學會了如何有效地使用在線幫助)。
提示:在所有參考工具裡面,Delphi5的幫助系統無疑是最有價值和最快的。學會如何利用它在數千頁的幫助主題中進行浏覽是非常有用的。
Delphi5的幫助包括了從怎樣使用Delphi5的環境到Win32 API的細節以及復雜的Win32結構等內容。要快速獲得幫助,可以在編輯器中鍵入幫助主題,並使光標落在該主題上,然後按下Ctrl+F1鍵,幫助信息屏幕就會立即顯示出來。也可以在對話框中單擊Help按鈕,或者在一個組件上按下F1鍵來獲得幫助信息。還可以選擇Delphi的Help菜單來浏覽幫助系統。

4.2構成Delphi5項目的文件
一個Delphi5項目由若干個相關的文件構成。一些文件是在設計時(如定義主窗體)創建的。其他文件是在編譯項目的時候生成的。要有效地管理Delphi5的項目,必須知道其中每一個文件的用途。
Delphi5的文檔和在線幫助都詳細介紹了項目中的文件。讓我們先回顧一下這些文檔,以確保你已經熟悉了這些文件。

4.2.1項目文件
項目文件是在設計時創建的,它的擴展名是.dpr。這個文件也是主程序文件。項目文件是主窗體以及其他自動創建的窗體實例化的地方。一般不需要編輯項目文件,除非要執行程序初始化例程、顯示啟動畫面或執行其他必須在程序啟動時運行的例程。下面的代碼是一個典型的項目文件:

Pascal程序員會把項目文件看作是標准的Pascal源文件。注意uses子句列出了主窗體單元Unit1。項目文件以同樣的方式列出項目的所有窗體單元。下面這行代碼用於引用項目的資源文件:

這一行告訴編譯器去鏈接一個資源文件,該資源文件名與項目文件相同,但擴展名是.res。項目的資源文件中包含了程序圖標和版本信息。
最後,begin..end之間的語句是應用程序要執行的主代碼。在這個例子中,創建了主窗體即Form1。當Application.Run這條語句執行後,Form1作為主窗體顯示出來。後面將會介紹,可以在begin..end之間加入自己的代碼。

4.2.2單元文件
單元文件是Pascal源文件,它的擴展名是.pas。有三種類型的單元文件:窗體/數據模塊和框架的單元文件、組件的單元文件和通用的單元文件。
1. 窗體/數據模塊和框架單元文件是由Delphi5自動生成的。每個窗體/數據模塊或框架都有一個對應的單元文件。例如,不能讓兩個窗體共用一個單元文件。為了解釋窗體文件,我們不在窗體、數據模塊和框架之間進行區分。
2. 組件的單元文件是由程序員或Delphi5創建新的組件時生成的。
3. 通用的單元文件是由程序員創建的,用於聲明在應用程序中要訪問的數據類型、變量、過程、類等。
後面將詳細介紹這些單元的細節。

4.2.3窗體文件
窗體文件存儲了窗體的二進制信息。當創建一個窗體時,Delphi5將同時創建一個窗體文件(擴展名為.dfm)和一個Pascal單元文件(擴展名為.pas)。如果打開一個窗體的單元文件,會看到下面這行語句:

這一行告訴編譯器去鏈接對應的窗體文件(名稱與單元文件相同,但擴展名是.dfm)到項目中。
一般不用直接編輯窗體文件(盡管可以這麼做)。可以用Delphi5編輯器打開一個窗體文件,這樣就能夠查看或編輯文本形式的窗體文件了。要打開一個窗體文件,先選擇File|Open菜單命令,然後選擇只打開窗體文件(.dfm)的選項。也可以在窗體設計器上單擊鼠標右鍵,在彈出的菜單中選擇View as Text命令。當打開文件後,會看到窗體的文本形式。
查看窗體的文本形式會帶來一些方便,因為可以從中看出非缺省的屬性設置以及窗體上有那些組件。編輯窗體文件是修改組件類型的方法之一。例如,假設一個窗體上有一個TButton組件:

如果把objectButton1:TButton這一行改為"objectButton1:TLabel",那麼組件的類型就被改為TLabel。當打開這個窗體時,將會看到一個標簽而不是一個按鈕。
注意:在窗體文件中修改組件類型可能會導致錯誤。例如,TButton原來有TabOrder屬性,如果把TButton改為TLabel,由於TLabel沒有TabOrder屬性,這就會導致錯誤。不過,不用手工去更正它,因為當保存這個窗體時,Delphi會自動進行更正。
警告:編輯窗體文件時要特別小心。如果操作失誤,可能會導致Delphi5無法打開這個窗體文件。
注意:Delphi5的新功能允許以文本文件格式保存窗體。這樣就可以利用其他像記事本這樣的通用工具來編輯窗體。只要在窗體上單擊右鍵打開關聯菜單,然後選擇Text DFM命令。

4.2.4資源文件
資源文件(.res)中包含了二進制數據,也稱為資源,這些資源將鏈接到應用程序的可執行文件中。.res文件是Delphi5自動創建的,包含應用程序的圖標、應用程序版本信息及其他信息。要把資源加入到應用程序中,可以先創建一個單獨的資源文件,然後把它鏈接到項目中。要創建資源文件,可以使用專門的資源編輯器,例如Delphi5提供的ImageEditor或ResourceWorkshop等。
警告:不要編輯由Delphi在編譯時自動生成的資源文件。如果那樣的話,下次編譯時所做的修改有可能丟失。如果要在應用程序中加入其他資源,應當創建另外一個和項目文件不同名的資源文件,然後參照下面這一行把資源鏈接到項目中:{$R MYRESFIL.RES}

4.2.5項目選項及桌面設置文件
項目選項文件(擴展名為.dof)存儲了Project|Options菜單命令所設置的項目選項。它是在第一次保存項目時創建的,以後每次保存項目時都會保存這個文件。
桌面設置文件(擴展名為.dsk)存儲了Tools|Options菜單命令所設置的桌面選項。桌面設置與項目選項不同,項目選項與具體項目有關,而桌面設置作用於Delphi5環境。
提示:錯誤的.dsk或.dof文件在編譯時可能導致像GPF這樣不可預測的錯誤。如果真的出現這種情況,應當把.dof和.dsk文件都刪除掉。當保存項目或退出Delphi5時會重新生成這兩個文件。IDE和項目又恢復到默認設置。

4.2.6備份文件
自第二次保存開始,Delphi5為項目文件和PAS單元文件生成備份文件。備份文件是上次保存的文件的副本。項目文件的備份文件的擴展名是.~dp。單元文件的備份文件的擴展名是.~pa。
窗體文件的二進制備份文件也是在第二次保存時創建的。窗體文件的備份文件的擴展名是.~df。
刪除備份文件一般不會有什麼問題。如果不想生成備份文件,可以在Editor Properties對話框的Display頁上不選中Create Backup File選項。

4.2.7包文件
包類似於動態鏈接庫,它的代碼可以被幾個應用程序共享。不過,包是Delphi特有的,用於共享組件、類、數據和代碼。把組件放到包中,而不是直接鏈接到應用程序中,可以大大減少應用程序的長度。後面的章節將進一步介紹包。包的源文件的擴展名是.dpk(Delphi Package的縮寫),編譯後就會生成一個.bpl文件(一個.bpl文件類似於一個動態鏈接庫)。這個.bpl文件由若干個單元或.dcu(Delphi Compiled Units的縮寫)文件組成。與源文件對應的中間文件其擴展名是.dcp(Delphi Compiled Package的縮寫)。這些內容如果一時搞不清楚就先不要管它,我們會在後面詳細介紹。

4.3項目管理提示
通過良好的組織和代碼重用,可以優化開發過程。下面提供一些有關項目管理的建議。

4.3.1一個項目一個目錄
應當把一個項目中的文件與另一個項目中的文件分開。這樣可以避免一個項目的文件覆蓋另一個項目的文件。
你最好也把一個項目放在一個單獨的目錄中。同時,應當規劃好一個項目中文件的命名約定。 (參見第6章"代碼標准文檔")。

4.3.2共享代碼的單元
最好把那些需要被其他應用程序共享的例程,放到一個單獨的單元中。一般地,先在磁盤中創建一個目錄,然後把需要共享的單元放到這個目錄中。當一個項目要共享其中的某個單元時,只要把那個單元的名稱加到uses子句中就行了。
另外,必須把共享單元所在的目錄加到Project|Options對話框的Directories/Conditionals頁上的SearchPath框中。這樣,Delphi5就知道到哪裡找這個單元。
提示:通過項目管理器,可以把其他目錄中的單元加到當前項目中,Delphi會自動添加搜索路徑中。
為了解釋如何使用共享單元,清單4-1列出了一個短小的單元文件StrUtils.pas,其中定義了一個簡單的字符串處理函數。實際上,一個單元可能要包含多個例程,這裡僅僅用來舉個例子。注釋部分解釋了函數的用途。
清單4-1StrUtils.pas單元

假設有一個單元SomeUnit.pas,需要使用這個ShortStringAsPChar()函數。
那麼只要把StrUtils加到這個單元的uses子句。例如:

還要使用Project|Option菜單命令把StrUtils單元所在的目錄加到搜索路徑中,以確保Delphi5能夠找到這個單元。
這樣,就可以在SomeUnit.pas單元的Implementation部分使用ShortStringAsPChar()函數。必須把StrUtils加到所有需要使用ShortStringAsPChar()函數的單元的uses子句中。如果要想在整個應用程序中都能使用這個函數,只把StrUtils加到一個項目的一個單元甚至項目文件中是不夠的。
提示:因為ShortStringAsPChar()函數比較實用,值得把它放到一個共享單元中,以便其他應用程序重用,這樣就不必記住曾經在哪裡使用過它。

4.3.2.1.全局標識符單元
一個單元可以專門用來聲明全局標識符。前面提到過,一個項目通常由若干個單元組成,包括窗體的單元文件、組件的單元文件和通用的單元文件。如果需要聲明一個所有單元都可以訪問的變量,該怎麼辦?按照下面的步驟可以建立一個專門聲明全局標識符的單元:
1. 在Delphi5中創建一個單元(通用的單元文件)。
2. 給這個單元起一個能夠體現出它是用來聲明全局標識符的名字,例如Globals.pas或者ProjGlob.pas。
3. 在這個單元的Interface部分聲明變量、類型等。這些標識符將可被所有單元訪問。
4. 為了使這些標識符能夠被其他單元訪問,把這個單元名稱加到那些需要訪問這個單元的uses子句(就像本章前面關於共享代碼中介紹的那樣)。

4.3.2.2.使一個窗體能夠被其他窗體調用
每一個窗體都包含在一個單元文件中,這並不意味著它不能訪問其他窗體的變量、屬性和方法。Delphi會在窗體的單元文件中生成代碼,聲明窗體的一個全局變量實例。所有需要訪問另一個窗體的單元,都要把該窗體的單元加到uses子句中。例如,假設窗體1的單元文件是Unit1.pas,它需要訪問窗體2,對應的單元文件是Unit2.pas,只要把Unit2加到Unit1的uses子句。如下所示:

現在,Unit1的Implementation部分就可以引用Form2了。
注意:如果在Unit1中引用了Unit2的窗體(就叫它Form2),那麼編譯項目時會問是否把Unit2加到Unit1的uses子句中;對於Unit1引用Form2這種情況,這是必須的。

4.3.3多項目管理
通常,一個產品由幾個項目組成(這些項目可能互相依賴)。典型的例子是多層應用程序中的每一層,或者被其他項目調用的DLL,因為DLL本身也可能是一個獨立的項目。
Delphi5提供了管理項目組的功能。項目管理器允許把幾個項目組織在一起,形成一個項目組。這裡不想詳細介紹項目管理器的使用,因為Delphi的文檔已經詳細介紹過它。這裡主要強調組織項目組是非常重要的,以及項目管理器是如何幫你實現項目組的。
在一個項目組中,每個項目的文件最好放在一個單獨的目錄中。所有需要共享的單元、窗體等都應當放在一個公共的目錄中,以便被所有的項目共享。例如,下面是一個典型的目錄結構:

根據上面的結構可以看出,有兩個專門的目錄各自存放一個項目:BugReportProject和BugAdminTool。這兩個項目可能需要共享一些單元和窗體,這些單元和窗體應當放在CommonFiles目錄中。
項目管理在開發過程中是至關重要的,尤其是在一個團隊開發環境中。強烈建議在整個小組投入開發之前建立一個標准,否則,以後的管理將很困難。可以使用項目管理器來建立項目組的結構。

4.4Delphi5項目的框架類
大多數Delphi5應用程序至少有一個TForm的實例。Delphi5 VCL應用程序也只能有一個TApplication的實例和一個TScreen的實例。這三個類在Delphi5中扮演著重要的角色。下面幾節就介紹這幾個類,掌握了這些知識後就可以根據需要修改它們的缺省功能。

4.4.1TForm類
TForm類是Delphi5應用程序的焦點。大多數情況下,整個應用程序都是圍繞著主窗體轉的。從主窗體,可以打開其他窗體,通常要通過菜單命令或按鈕。也可以讓Delphi5自動創建窗體,這樣就不用操心什麼時候創建、什麼時候刪除窗體。也可以選擇在運行期間動態創建窗體。
注意:Delphi可以創建不使用窗體的程序(例如控制台程序、服務和COM服務器)。這種情況下,TForm就不再是應用程序的焦點。
顯示給用戶的窗體有兩種:有模式的和無模式的。具體使用哪一種窗體,取決於是否希望用戶能夠同時與這個窗體和其他窗體交互。

4.4.1.1.顯示一個模式窗體
當打開一個模式窗體後,用戶無法與應用程序的其他部分交互,直到用戶關閉了這個窗體。模式窗體通常是對話框,就好像Delphi5本身的對話框一樣。事實上,大多數情況下應當使用模式窗體。
要顯示一個模式窗體,只要調用ShowModal()就可以了。下面的代碼演示了怎樣創建TmodalForm的實例,並把它作為模式窗體打開:

上面的代碼演示了怎樣動態創建TModalForm的實例以及把實例賦值給ModalForm變量。注意:如果需要動態創建一個窗體的實例,就要把這個窗體從Project|Options對話框的Auto-Create框中去掉。如果窗體的實例已經存在,可以調用ShowModal()函數打開它,其他代碼可以刪掉,變成下面這樣:

ShowModal()函數的返回值是ModalForm的ModalResult屬性值。缺省情況下,ModalResult屬性的值為0,相當於預定義的常量mrNone。如果ModalResult屬性被賦值為其他非零值,則窗體將關閉。
可以在運行時對窗體的ModalResult屬性進行賦值:

表4-1列出了預定義的ModalResult值。
表4-1ModalResult值

 

 

第4章 應用程序框架和設計

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved