<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 第十一章 ## 程序和單元 Delphi 應用程序中的單元,或說程序模塊可謂老道精深。實際上,單元是程序模塊化的基礎,類是繼它之后才有的。在Delphi 應用程序中,每個窗體都有一個相對應的單元。用相應的工具按鈕, 或File > New Form 菜單命令,在工程中添加一個新窗體,實際上是增加了一個新單元,也就是建立了該新窗體的類。 ### 單元 雖然所有窗體都在單元中定義,但反之則不然。除窗體外,單元中還可以定義一系列能訪問的例程。選擇File > New菜單命令,然后在Object Repository的New 頁中選擇Unit 圖標,隨即當前工程中就會加入一個空白單元。單元代碼分區存放,空白單元的代碼如下: ~~~ unit Unit1; interface implementation end. ~~~ 單元的概念比較簡單,單元名與文件名相同,而且必須唯一。單元包括界面區(interface)及實現區(implementation),界面區用于聲明其它單元能看到的部分;實現區存放界面的實現代碼及外部不可見的聲明。此外還有兩個可選的區,即初始化區及結束區,其中初始化區存放初始化代碼,當程序加載到內存時執行;結束區存放程序終止時執行的代碼。 單元總體結構如下: ~~~ unit unitName; interface // other units we need to refer to uses A, B, C; // exported type definition type newType = TypeDefinition; // exported constants const Zero = 0; // global variables var Total: Integer; // list of exported functions and procedures procedure MyProc; implementation uses D, E; // hidden global variable var PartialTotal: Integer; // all the exported functions must be coded procedure MyProc; begin // ... code of procedure MyProc end; initialization // optional initialization part finalization // optional clean-up code end. ~~~ 界面區頭部的uses子句表示需要訪問的外部單元,這些外部單元中定義了你需要引用的數據類型,如自定義窗體內所用的控件。 實現區頭部的uses子句用于表示只在實現部分訪問的單元。如果例程或方法的代碼需要引用其他單元,你應該把這些單元加到實現區子句中,而不是界面區。你所引用的單元必須在工程文件目錄中能找到,或在工程選項對話框的 Directories/Conditionals 頁設定這些單元的搜索路徑。 > C++程序員應該知道uses語句和include 指令是不同的。uses語句只是用于輸入引用單元的預編譯界面部分,引用單元的實現部分在單元編譯時才考慮。你引用的單元可以是源代碼格式(PAS),也可以是編譯格式(DCU),但是必須用同一版本的Delphi進行編譯。 在單元的界面區中可以聲明許多不同的元素,包括過程、函數、全程變量及數據類型。在Delphi 應用程序中,數據類型可能用得最頻繁。每創建一個窗體,Delphi 會在單元中自動建立一個新的數據類型--類(class)。在Delphi 單元中不僅能定義窗體;還能象傳統單元一樣,只包含過程及函數;還可以定義與窗體和任何可視控件無關的類。 ### 單元的工作空間 Pascal單元是封裝性和可視性的關鍵,它很可能比類中的 private 和 public 關鍵字還要重要。(實際上,private關鍵字與類單元的工作空間有關)。一個標識符(如一個變量、過程、函數或數據類型)的工作空間是指能訪問標識符的代碼段。基本原則是:標識符在它工作空間內才有意義,也就是說,只在其聲明的代碼塊中才有意義,在工作空間外你不能訪問這些標識符。例如: * 局部變量:如果你在例程或方法代碼塊內聲明一個變量,那么單元外部不能訪問這個變量。該標識符的工作空間就是定義標識符的整個例程,其中包括嵌套例程(除非嵌套例程內有一個同名標識符覆蓋了外部定義)。當調用到例程時,其變量壓入棧內存中,例程一結束,棧中的內存就自動釋放。 * 全程隱藏變量:如果你在單元的實現部分聲明一個標識符,那么在單元外你不能使用它,但是能在單元內任一代碼塊及過程中使用它。程序一啟動就會為全程隱藏變量分配內存,程序終止內存釋放,你可以在單元初始化區給它賦初值。 * 全程變量:如果你在單元的界面部分聲明標識符,那么該標識符的工作空間就擴大了,任何Use它的單元都能訪問它。這類變量的內存分配及生命周期與上類變量相同,唯一不同的是其可見性。 只要程序單元的uses子句中列出某一單元名,那么所列單元界面區中聲明的任何標識符該程序都能訪問。窗體類的變量就是這樣聲明的,所以你可以在其他窗體代碼中訪問這個窗體以及它的公共域、方法、屬性和組件。當然把什么都聲明為全局標識這種編程習慣并不好。除了明顯的內存消耗問題外,使用全程變量使代碼維護和更新變得困難。一句話,你應該盡量少用全程變量。 ### 單元用作命名空間 uses 語句是訪問其他單元工作空間的標準技術,通過該語句你能訪問其它單元的定義內容。如果恰巧兩個單元聲明的標識符同名,也就是說你可能有兩個同名的類或例程,遇到這種情況,你可以用單元名作前綴定義類型或過程名,由此進行區分。例如用Totals.ComputeTotal訪問Totals 單元中的ComputeTotal 過程。不過這種情況最好不要經常遇到,因此強烈建議不要在同一程序中用同一名字表示兩個不同的東西。 然而,如果查閱VCL庫和Windows 文件,你會發現一些Delphi 函數和Delphi 可用的Windows API 函數同名,不過參數往往不同,下面以Beep 過程為例說明這個問題。 新建一個Delphi 程序,添加一個按鈕,然后寫入以下代碼: ~~~ procedure TForm1.Button1Click(Sender: TObject); begin Beep; end; ~~~ 執行程序,單擊按鈕,你會聽到一個短促的聲音。現在移到單元的uses語句,把原先的代碼: ~~~ uses Windows, Messages, SysUtils, Classes, ... ~~~ 改為下面的樣式,只要把SysUtils單元移到Windows之前: ~~~ uses SysUtils, Windows, Messages, Classes, ... ~~~ 現在如果重新編譯這段代碼,你會得到一個編譯錯誤:”Not enough actual parameters”(實際參數不夠)。問題在于Windows 單元定義了另一個帶兩個參數的Beep 函數。應該說uses子句中第一個單元的定義被后面單元的定義覆蓋,解決方法很簡單: ~~~ procedure TForm1.Button1Click(Sender: TObject); begin SysUtils.Beep; end; ~~~ 不管uses子句中單元順序如何排列,以上代碼都能編譯通過。在Delphi中很少有其他命名沖突的情況,因為Delphi 代碼通常放在類的方法中,如果不同類中有兩個同名的方法不會產生任何沖突,只是使用全程例程會產生沖突問題。 ### 單元和程序 Delphi 應用程序源代碼文件可分成兩類,它們是一個或多個單元文件及一個程序文件,單元文件可以看成是次一級的文件,它被應用程序的主體——程序文件——引用。理論上如此,實際上程序文件通常是自動產生的,作用有限,程序啟動并運行主窗體時才會用到它。程序文件的代碼,或說Delphi 工程文件(DPR),可用手工進行編輯,也可通過工程管理器及其與應用程序、窗體相關的選項進行編輯。 程序文件的結構通常比單元文件的結構簡單得多。下面是一個程序文件的源代碼: ~~~ program Project1; uses Forms, Unit1 in Unit1.PAS {Form1DateForm}; begin Application.Initialize; Application.CreateForm (TForm1, Form1); Application.Run; end. ~~~ 從上可見,文件中只有一個uses區和應用程序的主體代碼,主體代碼包含在begin 和 end 關鍵字之間。程序的uses子句特別重要,因為需要通過它來管理應用程序的編譯和連接。 * * * * * ### 結束語 討論完Delphi中Pascal 應用程序的結構,本書就翻過了最后一章,至少目前是這樣,歡迎來email發表你的意見和要求。 如果想進一步學習Delphi Object Pascal中面向對象的內容,你可以參考已出版的書《精通Delphi 5》(Mastering Delphi 5 ,Sybex,1999),詳細情況可訪問網址www.marcocanto.com,你也可以從該網址上下載本書的最新版本。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看