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 的類別,具有私有欄位 FName 和 FAge,以及公開的建構函式 Create 和方法 DisplayInfo。建構函式初始化了物件的名稱和年齡屬性。DisplayInfo 方法輸出這些資訊到主控台。這展示了物件導向 Pascal 中基本的封裝概念。
@startuml
note
無法自動轉換的 Plantuml 圖表
請手動檢查和調整
@enduml
圖表翻譯:
此圖示展示了 TPerson 類別的結構,包括其私有欄位 FName 和 FAge,以及公開方法 Create 和 DisplayInfo。這說明瞭類別如何封裝資料和操作。
Delphi 與 Object Pascal 程式設計基礎
Delphi 是一種根據 Object Pascal 語言的整合開發環境(IDE),廣泛應用於開發 Windows 桌面應用程式、移動應用程式及伺服器端軟體。Object Pascal 語言是一種強型別、結構化的程式語言,其設計注重程式碼的可讀性和可維護性。
編譯單元與專案結構
在 Delphi 中,程式碼被組織成單元(Unit)。每個單元是一個獨立的檔案,通常具有 .pas 副檔名。單元之間可以相互參照,這種參照關係在 uses 子句中定義。編譯器根據 uses 子句的順序來決定單元的初始化順序。
首次編譯專案時,編譯器會為每個單元生成一個編譯後的單元檔案(.dcu 副檔名),然後將這些檔案連結成一個可執行檔。Delphi 提供了「編譯」與「建置」兩個選項。「編譯」只會重新編譯有變更的單元,而「建置」則會重新編譯所有單元。
控制檯應用程式
控制檯應用程式是 Delphi 中最簡單的程式型別,它不包含圖形使用者介面,可以在命令提示字元下執行,並可選地接受命令列引數。以下是一個簡單的控制檯應用程式範例,用於接收使用者名稱並顯示歡迎訊息。
建立控制檯應用程式
- 在 Delphi IDE 中,選擇「檔案」>「新建」>「控制檯應用程式 - Delphi」。
- 將專案儲存到一個空資料夾中,命名為
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的字串變數。Write和Readln:用於在控制檯輸出文字和讀取使用者輸入。Writeln:輸出文字並換行。Readln;:最後的Readln用於在程式結束前暫停,以便檢視輸出結果。
#### 內容解密:
此範例展示了 Delphi 控制檯應用程式的基本結構和輸入/輸出操作。Write 和 Readln 程式用於與使用者互動,Writeln 用於輸出歡迎訊息。變數 S 被宣告為 string 型別,用於儲存使用者輸入的名稱。最後的 Readln 確保程式在結束前暫停,方便使用者檢視輸出結果。
程式碼編輯與除錯
Delphi 的程式碼編輯器提供了語法高亮、程式碼完成等功能,幫助開發者高效編寫程式碼。編輯器左側的邊距區域(Gutter)顯示了程式碼的變更狀態(如未儲存的變更會以黃色標示)和可設定的斷點(以藍點表示)。
深入理解Delphi程式設計:從基礎到實踐
程式碼結構與註解的重要性
在Delphi程式設計中,程式碼的結構與註解扮演著至關重要的角色。與許多其他程式語言不同,Delphi使用begin和end關鍵字作為程式區塊的起始與結束標記,而非使用大括號或其他符號。這種語法結構使得程式碼的可讀性大大提高。
程式碼縮排與可讀性
雖然Delphi編譯器並不強制要求程式碼的縮排,但適當的縮排可以顯著提升程式碼的可讀性。在Delphi中,通常使用兩個空格進行縮排,以保持程式碼的清晰與易於理解。
註解的使用
註解是程式碼中不可或缺的一部分,用於解釋程式碼的功能、邏輯或特定的實作細節。Delphi支援多行註解和單行註解。多行註解可以巢狀使用,提供了靈活的註解方式。
{ 多行註解範例 }
(* 多行註解的另一種形式 *)
{
這是一個多行註解
可以跨越多行
}
// 單行註解範例
特殊註解:XML檔案註解
當單行註解以三個斜線(///)開始時,它被視為XML檔案註解,用於產生檔案和在程式碼編輯器中顯示提示。
/// <summary>
/// 這是一個XML檔案註解範例
/// </summary>
建立表單應用程式:以「記憶遊戲」為例
在本章中,我們將建立一個簡單的行動應用程式——「記憶遊戲」。該應用程式包含兩個主要的表單:主表單和設定表單。
步驟一:建立新專案
- 關閉目前開啟的專案。
- 建立一個新的「Multi-Device Application - Delphi」專案。
- 選擇「Blank Application」範本並儲存所有檔案。
- 將主表單儲存為
uFormMain,專案儲存為GameOfMemory。
步驟二:新增第二個表單
- 在「File | New」選單中選擇「Multi-Device Form - Delphi」。
- 儲存新的表單為
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}編譯器指令用於連結專案的資源檔案。- 在
begin和end.之間定義了程式的主要邏輯,包括應用程式的初始化、表單的建立和應用程式的執行。 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 表單中新增傳回按鈕。
新增 TToolbar 元件
確保
FormMain單元在表單設計器中開啟。按下Ctrl + .鍵開啟 IDE Insight,並輸入TToolbar。雙擊搜尋結果以將工具列新增至主表單。// 在 FormMain 中新增 TToolbar內容解密:
- 使用 IDE Insight 快速新增元件至表單。
TToolbar元件預設對齊至表單頂部。
新增 TSpeedButton 元件
使用 IDE Insight 新增
TSpeedButton元件至工具列。將其Align屬性設為Right,並將Name屬性設為SpdbtnSettings。// 設定 SpdbtnSettings 的屬性 SpdbtnSettings.Align := TAlignLayout.Right; SpdbtnSettings.StyleLookup := 'drawertoolbutton';內容解密:
- 將
TSpeedButton的Align屬性設為Right,使其始終保持在工具列的右側。 - 透過
StyleLookup屬性設定按鈕樣式,此處使用 iOS 內建的drawertoolbutton樣式。
- 將
變更平台樣式
將表單設計器上方的平台選擇器從 Windows 切換至 iOS,以檢視按鈕在行動裝置上的樣式。
實作表單間導航
為了實作表單間的導航,我們需要在主表單點選 Settings 按鈕時顯示 Settings 表單,並在 Settings 表單點選傳回按鈕時傳回主表單。
新增 FormSettings 至 FormMain 的 uses 子句
在
uFormMain的程式碼編輯器中,點選 File 功能表的 Use Unit 選項。選擇FormSettings並將其新增至實作區段的 uses 子句。// 在 uFormMain 的 implementation 部分新增 FormSettings implementation uses uFormSettings;內容解密:
- 將
FormSettings新增至uFormMain的 uses 子句,使其能存取FormSettings表單。 - 這裡將
FormSettings新增至實作區段,以避免迴圈依賴問題。
- 將
實作按鈕點選事件
在
FormMain中,雙擊SpdbtnSettings按鈕並輸入以下程式碼:procedure TFormMain.SpdbtnSettingsClick(Sender: TObject); begin FormSettings.Show; end;在
FormSettings中,雙擊傳回按鈕並輸入以下程式碼:procedure TFormSettings.SpdbtnBackClick(Sender: TObject); begin FormMain.Show; end;內容解密:
- 在按鈕點選事件中呼叫對應表單的
Show方法,以實作表單間的導航。 - 這裡假設
FormMain和FormSettings已在專案的其他部分正確初始化。
- 在按鈕點選事件中呼叫對應表單的
Object Pascal 單元結構解析
每個 Object Pascal 單元檔案都由幾個主要部分組成:
介面區段(interface section)
定義了該單元對外公開的型別、變數、程式和函式宣告。
interface uses FMX.Forms; // 此處參照其他單元 type TFormSettings = class(TForm) // 成員宣告 end;實作區段(implementation section)
包含了實際的程式碼實作和私有成員。
implementation uses uFormMain; // 此處可參照其他單元 // 程式碼實作初始化區段(initialization section)與結束區段(finalization section)
可選部分,用於執行程式啟動或結束時的特定程式碼。