日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Delphi的单元文件详解

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi的单元文件详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Delphi的單元文件詳解

? Delphi單元文件

1.庫單元文件頭:其中聲明了庫單元的名字.
2.Interface部分:
? 由保留字interface開始,結束于保留字implementation,它用來聲明引用的單元,常量,數據類型,變量,過程和函數.在Interface部分聲明的變量,常量,數據類型,過程,函數都可以供外部引用,對整個程序而言是共有的.也就是說,對于所有引用該單元的單元來說,這些聲明都是可見和可訪問的.?在Interface部分,只需寫出過程和函數的首部,具體的定義是在下面的implementation部分給出的.Interface部分又可分為多個可選部分,分別為單元引入部分(uses),常量說明部分,類型說明部分,變量說明部分,過程和函數聲明部分.
3.Implementation部分:
? Implementation部分分為兩部分.一部分是聲明部分,包括單元引用,常量,類型,變量,過程和函數的聲明,這一點和Interface部分相似.區別有兩點:
? (1):在Implementation部分聲明的只對本單元是公共的,可見的,其他單元即使引用了該單元,也不能訪問它們.
? (2):在Implementation部分聲明的過程和函數,不需要遵循先聲明后定義的規則,而可以直接寫出過程和函數的定義.另一部分是在Interface部分聲明的過程和函數的定義.
4.Initialization部分:
? 用于初始化該庫單元,此處的代碼最先執行.如果多個庫單元中包含Initialization部分那么它們的執行順序就和Program的uses部分引用單元的出現順序是一致的.
5.Finalization部分:
? 通常用于釋放Initialization部分分配的資源.如果多個庫單元中包含Finalization部分,其執行順序和Initialization部分正好相反.

unit MainFrm; {庫單元文件頭}

interface???? {接口部分}

uses????????
? Windows, Forms, StdCtrls;

type
? TForm1 = class(TForm)
??? procedure FormCreate(Sender: TObject);
? private
??? { Private declarations }
? public
??? procedure MyButtonClick(sender:TObject);
??? { Public declarations }
? end;

var
? Form1: TForm1;

implementation? {實現部分}

//uses

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
? MyButton : TButton;
begin
? MyButton := TButton.Create(self);
? MyButton.Parent := self;
//告訴創建方法在Form1中顯示MyButton
? MyButton.Caption := '測試一';
? MyButton.OnClick := MyButtonClick;
? MyButton.Show;
end;

procedure TForm1.MyButtonClick(sender:TObject);
begin
? Application.MessageBox(PAnsiChar(TButton(sender).Caption)
??????????????????????? ,'Test Component');
? TButton(sender).Caption := '測試二';
end;

initialization? {可選的初始化部分}
? //
finalization??? {結束部分}
? //

end.??????????? {End結束符}

6.Sender參數:
? 看上面程序代碼發現事件處理程序的參數中,至少含有一個參數Sender,它代表觸發事件處理程序的組件,有了Sender參數,可以使多個組件共用相同的事件處理程序.
7.Self參數:
? Self是指所編的程序范圍是在哪一個類中,Delphi中大都在窗體范圍內編程,因此,Self即指窗體,如果在編寫一個類或是一個組件,則Self指該類或該組件.我們在過程和函數的聲明中可以看出Self是代表哪個組件,即Self代表"."號之前的組件.另外應注意,Self只能用在類方法中,而不能用在過程或函數中.如下列是錯誤的:
Function a1(B:Integer):Integer;
begin
...
Button := TButton.Create(self);
...
end;
8.Parent和Owner的區別:
? (1):Parent屬性是指組件的包容器,組件只能在此范圍內顯示和移動.
? (2):Owner屬性是指組件的所有者,它負責組件的創建和釋放.Create方法應帶有表示組件
所有者的參數.
? (3):它們都是運行階段的屬性,只能通過代碼設置.

10:12?| 寫入日志?| delphi chenju發表:

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的单元文件详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。