1. 程式人生 > >Delphi學習筆記(一)之語法基礎

Delphi學習筆記(一)之語法基礎

Delphi是基於Pascal發展而來的一種面向物件的程式語言,其特點在於豐富的第三方控制元件的支援、強大的資料庫開發功能、高效的編譯器,使得其成為開發Windows 窗體程式的最佳選擇。

  1. Delphi程式結構

    通常一個Delphi程式的原始碼由一個工程檔案(dpr)多個unit(pas)組成,unit又由:unit名稱、interface、implementation、initialization、finalization等模組和最後的“end.”組成。

    其中interface部分可以定義常量、變數、例程、型別等(只需要宣告,不需要實現),uses從句(如果有)必須緊跟interface關鍵字之後。interface部分定義識別符號可以被其他檔案通過uses引用後訪問。

    implementation部分主要是實現interface部分宣告的例程,也可以定義常量、變數、例程、型別等,uses從句(如果有)必須緊跟implementation關鍵字之後。注意在此部分定義的識別符號只能在本unit內訪問,無法被其他檔案引用到

    initialization可選,該部分程式碼在程式啟動時執行;有多個unit都含有該部分時,按照各個unit在工程檔案uses從句中的順序來執行。

    finalization部分只有在initialization部分存在時才可選,當程式正常退出時(非Halt退出)執行,執行順序initialization相反。(即先引用的unit的initialization先執行,finalization後執行)。

  2. uses從句與引用

    uses從句的作用相當於java/python中的import,c/c++中的include,單元名稱以逗號隔開,分號結尾。工程檔案(dpr)中可以使用in來指定原始檔名稱和路徑,預設在當前目錄錄中搜索。

    當多個被引用的單元中定義了同樣的識別符號時,編譯器取最後一個;

    被引用單元必須是被用到的,若是間接使用到的則不需要引用;

    Delphi中不允許使用迴圈引用,即某個單元直接或者間接地引用到了自己。實在需要使用到的時候,可以在implementation部分的uses從句中引用。

  3. 識別符號

    識別符號用於物件,可分為系統自帶的和使用者自定義的。

    系統自帶的包括:標準常量變數名稱,標準型別名稱,標準例程名稱,標準檔名稱,系統保留字和指令符;

    使用者自定義的:老老實實用字母數字下劃線,不區分大小寫。

    識別符號的作用域:定義在函式或者例程中的識別符號為區域性識別符號,只能在自己的程式碼塊中使用;

    其他的均為全域性識別符號(在var部分定義),根據是否在interface中定義又分為公有或者私有識別符號。\

  4. 常量

    直接常量:$表示十六進位制,字元和字串用單引號包圍;
    符號常量:

                    Const
                            name1 = value;
                            name2 = value + name1;
    

    型別常量:(針對常用型別,不包括陣列、記錄、過程、指標等)

                    Const
                             name1 : type1 = value1;
                             name2 : type1 = value2 +name1;          (錯誤)
                             name3 : type2 = value1 + value2;         (錯誤)
    

    資源字串:(作為資原始檔,隨時修改不需要重新編譯)

                    resourcestring
                                    str = 'xxxxxxxxxx';                   
    

    陣列常量:多維陣列、字串陣列;(圓括號包圍,逗號隔開)
    記錄常量:記錄與變體記錄(tag);(同上)
    指標常量:指標指向的物件的值可以改變,但是不能指向另外一個物件;

                Const
                        pi : ^integer = @i;
    
  5. 變數

    宣告:Var關鍵字後宣告,需要同時宣告型別;

    初始化:直接賦值(常量或表示式),注意溢位(編譯器有可能不報錯而採取截斷);對於全域性變數,系統自動初始化為0(或 nil 或 ”),對於區域性變數,若不進行初始化,系統會隨機賦值,因此必須手動初始化

    共址變數:

                name1 : type1;
                name2 : type2 absolute name1;
    
    顧名思義,兩個(或多個)變數共用一個記憶體開始地址,根據其大小不同取到不同的值;(Tips:對於delphi中的shortstring,第一個byte中儲存的就是字串的長度,可以通過共址變數的方式獲得,而不需要呼叫length函式。)
    
  6. 型別宣告

        type    
            型別名稱 = 型別表示式;
    

    當型別表示式為另一個型別名稱(系統型別或使用者自定義型別均可)時,兩種型別完全相同(任何情況下都可以使用其中任意一個),可視為定義了一個別名;
    當型別表示式為一個結構時,定義的型別名稱是唯一的,即便兩個型別的表示式完全相同,它們也是不同的型別。當使用以下格式進行宣告時也會有同樣的效果:

        type
            型別名稱 = type 型別表示式;
    
  7. 註釋

    提供三種註釋方法,巢狀時需使用不同的方式 :

     //...
     {...}
     (*...*)
    
  8. 表示式

    with表示式:避免巢狀使用;

  9. 域與命名衝突

    關於作用域可以參考前面的區域性識別符號和全域性識別符號。注意是否在函式/過程塊中、是在interface還是implementation部分,或者在記錄;內部。
    巢狀塊中出現命名衝突時,編譯器使用的是內層的識別符號;
    多個單元引用出現命名衝突時,根據uses中出現的順序(前面的為外層,當前單元為最裡層)決定,不過強烈建議加上限定符。指定來自哪一個單元。