返回文章列表

Delphi物件導向Pascal程式設計精要

本文探討 Delphi 的物件導向 Pascal 程式設計,涵蓋語言特性、程式結構、物件導向程式設計基礎、Delphi IDE 使用、表單應用程式建立與導航、單元結構解析等導向。從控制檯應用程式到表單應用程式,逐步講解程式碼範例,並提供程式碼解密與圖表說明,幫助讀者理解 Delphi 程式設計的核心概念和實務

程式語言 軟體開發

Delphi 以物件導向 Pascal 語言為基礎,提供跨平台應用程式開發能力。理解語言特性、程式結構與物件導向概念是 Delphi 開發的根本。本文從基礎語法開始,逐步介紹 Delphi 的程式設計核心,包括單元結構、表單應用程式建立、表單間導航、IDE 使用技巧等。透過程式碼範例和圖表說明,讀者能更清晰地掌握 Delphi 程式設計的精髓,並應用於實務開發。控制檯應用程式範例展示了基本輸入輸出操作,而記憶遊戲範例則涵蓋了表單應用程式建立、表單間導航、專案檔案結構解析等進階主題。此外,文章也探討瞭如何最佳化應用程式啟動時間和使用 IDE 功能提升開發效率。

物件導向 Pascal 語言的流暢運用

Delphi 使用的物件導向 Pascal(Object Pascal)語言不斷演進。每個新版本的 Delphi 都會為語言新增功能。儘管針對不同平台有不同的 Delphi 編譯器,但語言本身保持一致。差異主要取決於目標平台是 32 位元還是 64 位元,以及其他一些平台細微差別。但在大多數情況下,相同的原始碼可以在所有平台上編譯和執行。早期的 Delphi 行動編譯器並非如此,它們實作了自動參考計數(ARC)和其他在桌面版本中沒有的功能。

流暢使用物件導向 Pascal 語言的重要性

對於每位 Delphi 開發者來說,熟練使用物件導向 Pascal 語言(也稱為 Delphi 語言)是一項關鍵技能。很容易低估良好的語言知識如何能使你成為一個更好(和更快)的開發者。本章將涵蓋以下主題:

  • 你會說物件導向 Pascal 嗎?
  • 物件導向 Pascal 語言短語集

本章的目標是提高使用物件導向 Pascal 語言的流暢度。這不是對 Delphi 程式語言每個功能的權威參考,因為那需要整本文。本章旨在涵蓋大多數日常使用的結構,以便能夠理解 FireMonkey 函式庫原始碼並編寫穩健且可維護的程式碼。

你會說物件導向 Pascal 嗎?

Pascal 語言最初是為了教授良好的程式設計實踐而設計的,而其現代版本——物件導向 Pascal 語言,至今仍保持著可讀性和清晰度的核心原則。今天的 Delphi 中的物件導向 Pascal 語言是一種高階、現代、強型別的編譯語言,支援結構化和物件導向程式設計。

定義演算法與程式

要使用電腦解決問題,你需要定義一組有限的操作,這些操作對某些資料進行處理——換句話說,就是定義一個演算法。以程式語言表達的演算法就是電腦程式,其操作被描述為程式語言指令。

在物件導向 Pascal 語言中,可以將一個或多個對特定資料的操作封裝為例程或類別。在大多數程式語言中,例程被稱為函式。在物件導向 Pascal 中,如果函式不傳回任何值,則稱之為程式。類別是物件導向程式設計的根本,這是使用物件導向 Pascal 建立應用程式最重要的途徑。類別將資料和對這些資料的操作組合在一起,提供封裝和重用性。

程式結構

每個物件導向 Pascal 程式都以程式宣告開始,指定程式的名稱。接著是 uses 子句,用於參照程式中的其他原始碼檔案,然後是一塊宣告和陳述式的區塊。物件導向 Pascal 程式通常被劃分為稱為單元的原始碼模組。可選的 uses 子句包含了程式所使用的單元列表。這些單元反過來可能在其自身的 uses 子句中指定其他單元。

每個物件導向 Pascal 程式都會使用內建的 System 單元。該單元包含預先定義的常數、型別、函式和程式,例如用於從命令列寫入和讀取或處理檔案的基本函式。如果你明確地將 System 放在 uses 子句中,你會收到錯誤訊息,因為該單元已經被使用,而且不允許在一個單元中多次使用同一個單元。除了 System 單元之外,Delphi 還提供了許多不會自動使用的單元,必須在 uses 子句中包含它們。例如,System.SysUtils 單元通常用於每個 Delphi 專案,因為它提供了一些基本功能,例如用於結構化例外處理所需的異常類別宣告。單元名稱可能包含點,如 System.SysUtils 的情況。只有最後一部分是實際的單元名稱,所有前面的識別符構成了名稱空間,用於邏輯上分組單元。

program HelloWorld;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

begin
  Writeln('Hello, World!');
end.

程式碼解密:

上述範例展示了一個簡單的 Delphi 主控台應用程式。程式以 program 關鍵字開始,宣告了程式名稱。{$APPTYPE CONSOLE} 是編譯器指令,指定這是一個主控台應用程式。uses 子句引入了 System.SysUtils 單元,提供了諸如 Writeln 等函式。主程式區塊從 begin 開始,以 end. 結束,包含了程式的主要邏輯。這裡使用 Writeln 將「Hello, World!」輸出到主控台。

物件導向程式設計基礎

類別是物件導向程式設計的核心,它們將資料(屬性)和操作這些資料的方法封裝在一起。下面是一個簡單的類別定義範例:

type
  TPerson = class
  private
    FName: string;
    FAge: Integer;
  public
    constructor Create(const AName: string; AAge: Integer);
    procedure DisplayInfo;
  end;

constructor TPerson.Create(const AName: string; AAge: Integer);
begin
  FName := AName;
  FAge := AAge;
end;

procedure TPerson.DisplayInfo;
begin
  Writeln('Name: ', FName);
  Writeln('Age: ', FAge);
end;

程式碼解密:

這段程式碼定義了一個名為 TPerson 的類別,具有私有欄位 FNameFAge,以及公開的建構函式 Create 和方法 DisplayInfo。建構函式初始化了物件的名稱和年齡屬性。DisplayInfo 方法輸出這些資訊到主控台。這展示了物件導向 Pascal 中基本的封裝概念。

@startuml
note
  無法自動轉換的 Plantuml 圖表
  請手動檢查和調整
@enduml

圖表翻譯: 此圖示展示了 TPerson 類別的結構,包括其私有欄位 FNameFAge,以及公開方法 CreateDisplayInfo。這說明瞭類別如何封裝資料和操作。

Delphi 與 Object Pascal 程式設計基礎

Delphi 是一種根據 Object Pascal 語言的整合開發環境(IDE),廣泛應用於開發 Windows 桌面應用程式、移動應用程式及伺服器端軟體。Object Pascal 語言是一種強型別、結構化的程式語言,其設計注重程式碼的可讀性和可維護性。

編譯單元與專案結構

在 Delphi 中,程式碼被組織成單元(Unit)。每個單元是一個獨立的檔案,通常具有 .pas 副檔名。單元之間可以相互參照,這種參照關係在 uses 子句中定義。編譯器根據 uses 子句的順序來決定單元的初始化順序。

首次編譯專案時,編譯器會為每個單元生成一個編譯後的單元檔案(.dcu 副檔名),然後將這些檔案連結成一個可執行檔。Delphi 提供了「編譯」與「建置」兩個選項。「編譯」只會重新編譯有變更的單元,而「建置」則會重新編譯所有單元。

控制檯應用程式

控制檯應用程式是 Delphi 中最簡單的程式型別,它不包含圖形使用者介面,可以在命令提示字元下執行,並可選地接受命令列引數。以下是一個簡單的控制檯應用程式範例,用於接收使用者名稱並顯示歡迎訊息。

建立控制檯應用程式

  1. 在 Delphi IDE 中,選擇「檔案」>「新建」>「控制檯應用程式 - Delphi」。
  2. 將專案儲存到一個空資料夾中,命名為 Greeter

IDE 會生成預設的控制檯應用程式碼。將其替換為以下範例程式碼:

program Greeter;

var
  S: string;

begin
  Write('Enter your name: ');
  Readln(S);
  Writeln('Welcome ' + S + '!');
  Readln;
end.

程式碼解析

  • program Greeter;:定義程式名稱,必須與檔案名稱一致。
  • var S: string;:宣告一個名為 S 的字串變數。
  • WriteReadln:用於在控制檯輸出文字和讀取使用者輸入。
  • Writeln:輸出文字並換行。
  • Readln;:最後的 Readln 用於在程式結束前暫停,以便檢視輸出結果。

#### 內容解密:

此範例展示了 Delphi 控制檯應用程式的基本結構和輸入/輸出操作。WriteReadln 程式用於與使用者互動,Writeln 用於輸出歡迎訊息。變數 S 被宣告為 string 型別,用於儲存使用者輸入的名稱。最後的 Readln 確保程式在結束前暫停,方便使用者檢視輸出結果。

程式碼編輯與除錯

Delphi 的程式碼編輯器提供了語法高亮、程式碼完成等功能,幫助開發者高效編寫程式碼。編輯器左側的邊距區域(Gutter)顯示了程式碼的變更狀態(如未儲存的變更會以黃色標示)和可設定的斷點(以藍點表示)。

深入理解Delphi程式設計:從基礎到實踐

程式碼結構與註解的重要性

在Delphi程式設計中,程式碼的結構與註解扮演著至關重要的角色。與許多其他程式語言不同,Delphi使用beginend關鍵字作為程式區塊的起始與結束標記,而非使用大括號或其他符號。這種語法結構使得程式碼的可讀性大大提高。

程式碼縮排與可讀性

雖然Delphi編譯器並不強制要求程式碼的縮排,但適當的縮排可以顯著提升程式碼的可讀性。在Delphi中,通常使用兩個空格進行縮排,以保持程式碼的清晰與易於理解。

註解的使用

註解是程式碼中不可或缺的一部分,用於解釋程式碼的功能、邏輯或特定的實作細節。Delphi支援多行註解和單行註解。多行註解可以巢狀使用,提供了靈活的註解方式。

{ 多行註解範例 }
(* 多行註解的另一種形式 *)

{
  這是一個多行註解
  可以跨越多行
}

// 單行註解範例

特殊註解:XML檔案註解

當單行註解以三個斜線(///)開始時,它被視為XML檔案註解,用於產生檔案和在程式碼編輯器中顯示提示。

/// <summary>
/// 這是一個XML檔案註解範例
/// </summary>

建立表單應用程式:以「記憶遊戲」為例

在本章中,我們將建立一個簡單的行動應用程式——「記憶遊戲」。該應用程式包含兩個主要的表單:主表單和設定表單。

步驟一:建立新專案

  1. 關閉目前開啟的專案。
  2. 建立一個新的「Multi-Device Application - Delphi」專案。
  3. 選擇「Blank Application」範本並儲存所有檔案。
  4. 將主表單儲存為uFormMain,專案儲存為GameOfMemory

步驟二:新增第二個表單

  1. 在「File | New」選單中選擇「Multi-Device Form - Delphi」。
  2. 儲存新的表單為uFormSettings

#### 內容解密:

此步驟建立了兩個主要的表單,分別是主表單(uFormMain)和設定表單(uFormSettings)。主表單將作為遊戲的遊戲板,而設定表單將用於遊戲的設定。

瞭解專案檔案結構

我們的專案現在包含兩個表單。接下來,我們將探討專案的主程式檔案。

program GameOfMemory;

uses
  System.StartUpCopy,
  FMX.Forms,
  uFormMain in 'uFormMain.pas' {FormMain},
  uFormSettings in 'uFormSettings.pas' {FormSettings};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TFormMain, FormMain);
  Application.CreateForm(TFormSettings, FormSettings);
  Application.Run;
end.

#### 內容解密:

此程式碼是Delphi專案的主程式檔案。其中:

  • program GameOfMemory; 定義了程式的名稱。
  • uses 子句列出了專案所使用的單元。
  • {$R *.res} 編譯器指令用於連結專案的資源檔案。
  • beginend. 之間定義了程式的主要邏輯,包括應用程式的初始化、表單的建立和應用程式的執行。
  • Application.CreateForm(TFormMain, FormMain);Application.CreateForm(TFormSettings, FormSettings); 分別建立了主表單和設定表單。

最佳化應用程式啟動時間

目前我們的應用程式在啟動時會建立兩個表單。然而,設定表單並非每次啟動都需要被建立。為了最佳化應用程式的啟動時間,我們可以手動刪除建立設定表單的程式碼。

// 刪除以下這行程式碼
Application.CreateForm(TFormSettings, FormSettings);

#### 內容解密:

刪除建立設定表單的程式碼可以減少應用程式的啟動時間,因為這樣可以避免在應用程式啟動時不必要地建立資源。這種最佳化在行動裝置上尤其重要,因為它可以改善使用者的體驗。

使用Delphi IDE的功能提升開發效率

Delphi IDE提供了許多功能來提升開發效率,例如內建的超導航功能,可以快速跳轉到其他單元或符號的宣告處。

#### 內容解密:

透過使用Delphi IDE的超導航功能,開發者可以快速地在不同的程式碼部分之間導航,大大提高了開發效率。這對於理解和使用大型專案或複雜的函式庫尤其有幫助。

Object Pascal 單元結構與表單導航實作

在上一章中,我們探討瞭如何在多裝置應用程式中管理表單的自動建立。本章將深入瞭解 Object Pascal 單元的結構,並實作基本表單之間的導航功能。

變更表單自動建立設定

首先,我們需要了解如何變更表單的自動建立設定。在 Project 功能表的底部點選 Options,開啟專案選項對話方塊。選擇 Forms 節點,將 FormSettings 從自動建立的表單清單移動到可用表單清單中,如圖 2.6 所示:

此圖示顯示了專案選項對話方塊中的表單設定頁面 圖表翻譯: 此圖示呈現瞭如何透過專案選項對話方塊調整表單的自動建立設定,將 FormSettings 移至可用表單清單。

進行此變更後,負責建立 Settings 表單的原始碼行將從專案原始碼中消失。

新增工具列與導航按鈕

接下來,我們將在主表單中新增工具列和速度按鈕,以顯示 Settings 表單。同時,也會在 Settings 表單中新增傳回按鈕。

  1. 新增 TToolbar 元件

    確保 FormMain 單元在表單設計器中開啟。按下 Ctrl + . 鍵開啟 IDE Insight,並輸入 TToolbar。雙擊搜尋結果以將工具列新增至主表單。

    // 在 FormMain 中新增 TToolbar
    

    內容解密:

    • 使用 IDE Insight 快速新增元件至表單。
    • TToolbar 元件預設對齊至表單頂部。
  2. 新增 TSpeedButton 元件

    使用 IDE Insight 新增 TSpeedButton 元件至工具列。將其 Align 屬性設為 Right,並將 Name 屬性設為 SpdbtnSettings

    // 設定 SpdbtnSettings 的屬性
    SpdbtnSettings.Align := TAlignLayout.Right;
    SpdbtnSettings.StyleLookup := 'drawertoolbutton';
    

    內容解密:

    • TSpeedButtonAlign 屬性設為 Right,使其始終保持在工具列的右側。
    • 透過 StyleLookup 屬性設定按鈕樣式,此處使用 iOS 內建的 drawertoolbutton 樣式。
  3. 變更平台樣式

    將表單設計器上方的平台選擇器從 Windows 切換至 iOS,以檢視按鈕在行動裝置上的樣式。

實作表單間導航

為了實作表單間的導航,我們需要在主表單點選 Settings 按鈕時顯示 Settings 表單,並在 Settings 表單點選傳回按鈕時傳回主表單。

  1. 新增 FormSettings 至 FormMain 的 uses 子句

    uFormMain 的程式碼編輯器中,點選 File 功能表的 Use Unit 選項。選擇 FormSettings 並將其新增至實作區段的 uses 子句。

    // 在 uFormMain 的 implementation 部分新增 FormSettings
    implementation
    uses
      uFormSettings;
    

    內容解密:

    • FormSettings 新增至 uFormMain 的 uses 子句,使其能存取 FormSettings 表單。
    • 這裡將 FormSettings 新增至實作區段,以避免迴圈依賴問題。
  2. 實作按鈕點選事件

    FormMain 中,雙擊 SpdbtnSettings 按鈕並輸入以下程式碼:

    procedure TFormMain.SpdbtnSettingsClick(Sender: TObject);
    begin
      FormSettings.Show;
    end;
    

    FormSettings 中,雙擊傳回按鈕並輸入以下程式碼:

    procedure TFormSettings.SpdbtnBackClick(Sender: TObject);
    begin
      FormMain.Show;
    end;
    

    內容解密:

    • 在按鈕點選事件中呼叫對應表單的 Show 方法,以實作表單間的導航。
    • 這裡假設 FormMainFormSettings 已在專案的其他部分正確初始化。

Object Pascal 單元結構解析

每個 Object Pascal 單元檔案都由幾個主要部分組成:

  1. 介面區段(interface section)

    定義了該單元對外公開的型別、變數、程式和函式宣告。

    interface
    uses
      FMX.Forms; // 此處參照其他單元
    
    type
      TFormSettings = class(TForm)
        // 成員宣告
      end;
    
  2. 實作區段(implementation section)

    包含了實際的程式碼實作和私有成員。

    implementation
    uses
      uFormMain; // 此處可參照其他單元
    
    // 程式碼實作
    
  3. 初始化區段(initialization section)與結束區段(finalization section)

    可選部分,用於執行程式啟動或結束時的特定程式碼。