視覺化程式設計在現代軟體開發中扮演著關鍵角色,而Delphi作為一個強大的快速應用開發(RAD)工具,多年來一直是開發者的首選之一。作為根據Pascal的高階程式語言,Delphi結合了強大的編譯器與直覺的視覺化設計環境,讓開發過程變得更加高效與直觀。

視覺化程式設計的優勢

在個人電腦與多工作業系統(如Microsoft Windows)蓬勃發展的時代,軟體開發過程變得日益複雜。視覺化整合開發環境(IDE)應運而生,旨在簡化與作業系統的互動、減少編碼時間並提升程式碼品質。

視覺化程式設計的核心在於將兩個互相關聯的過程結合起來:

  1. 以視覺方式設計應用程式視窗
  2. 撰寫對應的程式碼

這種開發模式帶來了諸多好處:

  • 在開始實際程式設計前,就能直觀地設定應用程式並看到結果
  • 無需編寫多行程式碼來設定控制項屬性,只需在屬性視窗中更改值
  • 屬性變更會自動生成或更新程式碼

Delphi的歷史與定位

Delphi首次發布於1996年,它是一個強大的Pascal編譯器,加入了許多針對Windows應用開發的重要改進。作為高階軟體開發系統,Delphi整合了完整的工具集,特別適合快速應用開發。

Delphi的核心理念建立在視覺設計和事件驅動程式設計的概念上。這些概念顯著改善了應用設計過程,大幅縮短了開發時間。

初識Delphi開發環境

Delphi的整合開發環境是一個可設定的多視窗系統。當開發者在視窗中執行任何動作時,Delphi會自動在底層程式碼中做出相應變更。

Delphi主要介面元素

開啟Delphi後,我們首先會看到以下關鍵元素:

  • 主選單(MainMenu):包含管理專案所需的所有選項
  • 工具列(ToolBar):提供快速存取主選單中常用選項的按鈕
  • 工具面板(Tool Palette):展示各種可用的元件
  • 表單設計器(Form Designer):設計應用程式視窗的主要區域
  • 物件檢視器(Object Inspector):檢視和修改選定元件的屬性
  • 結構檢視(Structure View):顯示專案結構的層次檢視

建立新專案

要開始一個新程式,需要:

  1. 選擇「File」選單中的「New」選項
  2. 在開啟的清單中選擇「VLC Forms Application — Delphi」

這將建立一個新的Delphi專案,預設包含一個空白表單(Form1)。這個表單將成為我們應用程式的主視窗。

理解物件導向概念

Delphi是一種物件導向程式語言,在這種正規化中:

  • 物件是具有屬性(特徵或特殊標誌)和一組行為的自包含實體
  • 建立的物件可以從一個程式移動到另一個程式
  • Delphi包含數百個現成可用的物件(元件),這些元件在工具面板中展示

Delphi元件函式庫

工具面板(Tool Palette)是Delphi中最常用的功能之一,它包含了各種預先定義好的元件,這些元件按功能分組在不同的標籤頁中。

主要標籤頁

工具面板的主要標籤頁包括:

  1. Standard:包含大多數程式不可或缺的標準介面元素
  2. Additional:提供額外的介面元件
  3. System:系統相關元件
  4. Data Access:資料存取相關元件
  5. Data Controls:資料控制元件
  6. Dialogs:對話方塊元件

初學者通常會從Standard標籤頁開始,因為它包含了最基本與常用的介面元素。

表單與元件

在Delphi中,開發應用程式的過程主要涉及:

  • 將元件從工具面板拖曳到表單上
  • 設定這些元件的屬性
  • 為元件增加事件處理程式

表單(Form)是應用程式的主視窗,包含基本視窗元素如標題、最小化、最大化和關閉按鈕等。文字方塊、命令按鈕和其他表單控制項在Delphi中被稱為元件(components)。

在程式中,表單和元件都被視為物件具有:

  • 屬性:定義物件外觀和行為的特徵
  • 方法:物件可以執行的動作
  • 事件:物件可以回應的外部行為

表單設計基礎

當我們在Delphi中建立新專案時,系統會自動生成一個名為Form1的空白表單。這是應用程式的主視窗,我們可以在其中增加各種介面元素。

表單屬性

每個表單都有一系列可以調整的屬性,這些屬性可以透過物件檢視器(Object Inspector)進行修改。常見的表單屬性包括:

  • Name:表單的名稱,用於在程式碼中參照
  • Caption:顯示在表單標題欄中的文字
  • Height:表單高度
  • Width:表單寬度
  • Color:表單背景顏色
  • BorderStyle:表單邊框樣式
  • Position:表單在螢幕上的初始位置

物件檢視器顯示了所選元件的所有可用屬性,並允許我們直接修改這些屬性的值。

增加元件到表單

要將元件增加到表單中,只需:

  1. 在工具面板中選擇所需元件
  2. 點選表單上想要放置元件的位置,或者
  3. 在表單上拖動以建立特定大小的元件

增加元件後,可以透過物件檢視器設定其屬性。例如,對於按鈕(TButton)元件,我們可以設定其Caption屬性來更改按鈕上顯示的文字。

元件的事件處理

Delphi的強大之處在於其事件驅動的程式設計模型。每個元件都可以回應各種事件,如點選、滑鼠移動、按鍵等。

要為元件增加事件處理程式:

  1. 在物件檢視器中切換到Events(事件)標籤頁
  2. 找到想要處理的事件(如OnClick)
  3. 雙擊該事件旁邊的空白區域

這將自動建立事件處理程式的框架,並將您帶到程式碼編輯器,您可以在那裡增加程式碼來回應事件。

執行與測試應用程式

一旦我們設計好表單並增加了必要的程式碼,就可以執行應用程式來測試其功能。在Delphi中,有多種方式可以執行程式:

  • 按F9鍵
  • 點選工具列上的綠色三角形按鈕
  • 在Run選單中選擇Run選項

執行應用程式時,Delphi會編譯程式碼並啟動應用程式。如果有任何編譯錯誤,Delphi會顯示錯誤訊息並將您帶到相關的程式碼位置。

深入理解Delphi程式設計

學習Delphi程式設計不僅是瞭解如何使用IDE和設計表單,還包括掌握其底層的Pascal程式語言和物件導向概念。隨著學習的深入,我們將探索更多高階主題,如:

  • 變數和資料類別
  • 條件陳述式和迴圈
  • 函式和過程
  • 字串處理
  • 陣列和記錄
  • 檔案操作
  • 圖形和多媒體
  • 資料函式庫

Delphi的強大之處在於它將視覺化開發的便捷性與完整程式語言的功能相結合,使開發者能夠建立從簡單工具到複雜企業應用的各種軟體。

透過實踐和探索,你將逐漸掌握Delphi的各種功能,並能夠開發出專業級的Windows應用程式。視覺化程式設計的世界正等待著你的探索和創造。

按鈕事件處理入門

在Delphi中,事件處理是應用程式互動的核心。當使用者與應用程式介面元素(如按鈕)互動時,會觸發相應的事件。開發者可以編寫程式碼來回應這些事件,實作所需的功能。

事件驅動程式設計基礎

事件驅動程式設計是一種程式設計正規化,其中程式流程由事件(如使用者操作、感測器輸出或來自其他程式的訊息)決定。在Delphi中,最常見的事件包括:

  • OnClick:當使用者點選元件時觸發
  • OnChange:當元件的內容發生變化時觸發
  • OnMouseMove:當滑鼠在元件上移動時觸發
  • OnKeyPress:當使用者在元件上按下鍵盤按鍵時觸發

建立簡單的按鈕事件處理

讓我們透過一個簡單的例子來瞭解如何處理按鈕點選事件:

  1. 在表單上放置一個按鈕(TButton)元件
  2. 在物件檢視器中,將按鈕的Caption屬性設為"點選我"
  3. 在物件檢視器的Events標籤頁中,找到OnClick事件並雙擊
  4. 在開啟的程式碼編輯器中,增加以下程式碼:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('你好,Delphi世界!');
end;

這段程式碼定義了一個名為Button1Click的過程,當使用者點選Button1時會執行此過程。Sender引數是一個TObject類別,代表觸發事件的元件。在過程的主體中,我們使用ShowMessage函式顯示一個簡單的訊息框,內容為"你好,Delphi世界!"。

變數與資料類別

在開發更複雜的應用程式時,我們需要使用變數來儲存和處理資料。Delphi支援多種資料類別,包括:

  • 整數類別(Integer, Int64)
  • 浮點數類別(Single, Double, Extended)
  • 字元和字串類別(Char, String)
  • 布林類別(Boolean)
  • 日期和時間類別(TDateTime)

要在Delphi中宣告變數,我們使用var關鍵字,後跟變數名和類別:

var
  i: Integer;
  x: Double;
  s: String;
  b: Boolean;

類別轉換

在程式設計中,我們經常需要在不同的資料類別之間進行轉換。Delphi提供了多種函式來實作這一點:

  • StrToInt:將字串轉換為整數
  • IntToStr:將整數轉換為字串
  • StrToFloat:將字串轉換為浮點數
  • FloatToStr:將浮點數轉換為字串

例如,要將使用者在編輯框中輸入的文字轉換為數字進行計算:

var
  userInput: String;
  number: Integer;
begin
  userInput := Edit1.Text;
  number := StrToInt(userInput);
  // 現在可以對number進行數學運算
end;

數學函式應用

Delphi內建了豐富的數學函式,可用於各種計算:

  • Abs:計算絕對值
  • Sqrt:計算平方根
  • Sin, Cos, Tan:三角函式
  • Ln, Log10:自然對數和以10為底的對數
  • Power:冪運算

讓我們建立一個簡單的計算器應用來展示這些函式的使用:

procedure TForm1.CalculateButtonClick(Sender: TObject);
var
  x: Double;
begin
  x := StrToFloat(InputEdit.

## Delphi開發環境的基本功能

在開始使用Delphi進行視覺化開發前,我們需要先了解其核心介面元素。物件檢查器(Object Inspector)是Delphi中最重要的工具之一,它讓開發者能夠直觀地管理和設定各種元件屬性。

### 物件檢查器深度解析

物件檢查器視窗包含兩個主要頁籤:

1. **屬性頁籤**:顯示所選元件的所有可用屬性,左側欄位列出屬性名稱,右側欄位則包含當前的預設值。這裡你可以調整元件的外觀、行為和其他特性。

2. **事件頁籤**:列出所選元件可能的事件處理程式。左側欄位包含事件名稱,右側則有相關的屬性或程式。這是設計元件互動行為的關鍵區域。

除了物件檢查器,結構檢視(Structure View)也是不可或缺的工具,它以樹狀結構顯示所有放置在表單上的物件(元件),幫助開發者直觀地瞭解專案結構。

### 停止執行應用程式的方法

當我在測試Delphi應用程式時,通常會使用以下幾種方式來停止程式執行:

- 點選應用程式視窗的關閉按鈕
- 從選單中選擇「Run」→「Program Reset」(快捷鍵:Ctrl+F2

這些方法在開發過程中非常實用,特別是當我需要測試程式邏輯或介面設計時。

## Delphi專案的儲存管理

### 專案檔案結構與命名規範

任何Delphi程式都由多個不同檔案組成,包括專案檔、一個或多個單元檔等。專案檔是由Delphi環境自動產生的,不提供手動編輯功能。這就是為什麼它有一個獨特的副檔名(*.dpr),與不會在程式碼編輯器中顯示。

在儲存專案時,我建議遵循以下規則:

1. 使用「Save All」指令儲存整個專案
2. 每個專案應儲存在單獨的資料夾中
3. 為專案資料夾和檔案命名適當的名稱,不要接受預設名稱
4. 檔案名稱只能包含拉丁字元,數字可以從第二個字元開始使用,其他符號在命名時無效

更重要的是,必須為Project1.dpr和Unit1.pas(它們是不同的)指定唯一名稱。

### Delphi程式碼命名標準

重新命名Project1.dpr和Unit1.pas檔案時,遵循Delphi程式碼標準非常重要。根據此標準,所有檔案必須有一個XXX字首。例如:

- Project1.dpr  prjMyTask1.dprprj代表Project
- Unit1.pas  untMyTask1.pasunt代表Unit

這個規則在重新命名簡單元件時也適用。這樣的命名方式有助於保持程式碼的組織性和可讀性,特別是在大型專案中。

## Delphi基礎元件詳解

Delphi環境中有許多簡單但功能強大的元件。這些元件被視為「簡單」並非因為它們使用起來比其他元件容易,而是因為在建立圖形使用者介面時,它們經常與其他元件結合使用,形成複雜的互動。

### 表單(Form)元件

表單是Delphi中唯一不在工具面板中的物件。在建立新應用程式時,系統會自動產生一個表單。如果需要在應用程式中使用多個表單,可以增加更多表單到專案中。

在使用Delphi時,可以將自己想像成一位藝術家,表單就是畫布。透過在表單上放置元件,開發者「繪製」應用程式的圖形使用者介面。然後,透過改變元件的屬性,改變它們的外觀。

接下來,開發者會處理元件與使用者的互動。使用者互動意味著表單元件會對使用者的動作做出反應。元件的屬性是它們的特徵,例如名稱、標題、大小或顏色等。

表單物件有一些獨特的屬性,其中最基本的是Name屬性。所有元件都必須有這個屬性,因為需要在程式中呼叫元件時使用名稱。對於表單,我們通常使用描述元件類別的三字母字首,例如frmForm的縮寫)。如果想將表單命名為"My",應該將"frmMy"指派給Name屬性

### 標籤(TLabel)元件

TLabel元件用於顯示可以由使用者或程式更改的文字。以下是使用TLabel的步驟

1. 建立新專案
2. TLabel放在表單上(雙擊工具面板中的TLabel圖示,或單擊圖示然後在表單上單擊)
3. 透過拖曳移動TLabel
4. TLabel的Name屬性更改為lblMyLabel
5. 檢查TLabel的標題是否已更改為lblMyLabel(因為預設情況下,TLabel的標題是其名稱
6. 更改標題為「It's my first label!」
7. 更改TLabel背景顏色為黃色
8. 更改字型和文字顏色(Arial、粗斜體、20號、紅色)
9. 增加另一個TLabel並設定其屬性
10. 選擇表單並更改其屬性(Name:frmLabelExample,Caption:Example of Label)
11. 執行應用程式並測試


TLabel元件看似簡單,但它在介面設計中扮演著重要角色。當我們設定Name屬性時,這個名稱將用於程式碼中參照該元件;而Caption屬性則決定了使用者看到的文字內容。這兩個屬性的分離設計允許開發者在不影響程式碼的情況下變更使用者介面文字,這在多語言應用程式開發中特別有用。

Font和Color屬性的組合可以創造出視覺上吸引人的介面元素,特別是用於提示、警告或強調重要訊息時。在實際應用中,我通常會為不同功能的標籤設定統一的視覺風格,以提高介面的一致性和可用性。

### 文字方塊(TEdit)元件

TEdit元件儲存可以在應用程式建立過程中或執行過程中輸入的文字方塊中顯示的文字來自Text屬性。MaxLength屬性定義文字方塊中的最大符號數,值為0表示沒有字元限制。

文字型透過Font屬性設定。如果將Readonly屬性值設定為True,使用者將無法更改TEdit的文字。這在需要顯示但不允許修改的資訊場景中特別有用。


TEdit是使用者輸入的主要介面元素之一,它看似簡單,但在功能上非常強大。MaxLength屬性在表單驗證中特別重要,可以防止使用者輸入過長的資料導致後端處理問題。

Readonly屬性的巧妙運用可以建立動態顯示資訊的介面元素,例如計算結果或系統狀態顯示。在我的開發實踐中,經常將TEdit與其他元件(如按鈕或下拉選單)組合使用,建立複雜的資料輸入和驗證機制。

對於需要特定格式輸入的場景(如日期、電話號碼),TEdit可以透過事件處理程式進行實時驗證和格式化,提供更好的使用者經驗。

## Delphi元件的命名與組織策略

在開發複雜應用程式時,良好的元件命名和組織策略至關重要。我發現以下方法特別有效:

1. **使用一致的命名字首**:為每種元件類別使用標準化字首(如lblForLabel、edtForEdit)
2. **功能性命名**:元件名稱應反映其功能而非位置或外觀
3. **分層組織**:相關元件可以透過父子關係或命名慣例組織在一起
4. **註解檔案化**:在複雜表單中,增加註解說明元件組的功能和互動關係

這些策略可以大幅提高程式碼的可維護性,特別是當多名開發者在同一專案上工作時。

## 元件屬性設定的最佳實踐

多年的Delphi開發經驗讓我總結出一些元件屬性設定的最佳實踐:

1. **設計時vs執行時**:某些屬性最好在設計時設定(如Name、Align),而其他屬性(如Text、Enabled)可能需要在執行時動態調整
2. **一致的視覺風格**:為相似功能的元件設定一致的視覺屬性,提高介面的專業性和可用性
3. **適當的預設值**:為使用者輸入欄位設定合理的預設值,減少錯誤並提高使用者經驗
4. **考慮可存取性**:選擇適當的字型大小、顏色對比度和標籤位置,確保應用程式對所有使用者都易於使用

遵循這些實踐不僅可以提高應用程式的品質,還能簡化開發和維護過程。

## 從簡單元件到複雜介面

雖然我們討論的是基本元件,但理解這些元素如何組合成複雜介面是至關重要的。在實際應用中,表單、標籤和文字方塊只是構建塊,真正的力量在於它們的組合和互動。

透過掌握這些基礎元件的屬性和行為,開發者可以建立起理解更複雜元件和介面設計的基礎。隨著經驗的增長,你會發現這些簡單元件的創造性組合可以實作各種複雜的使用者介面需求。

Delphi的視覺化開發環境使這個過程變得直觀和高效,讓開發者能夠專注於解決實際問題,而不是被技術細節所困擾。這正是Delphi多年來在企業應用開發領域保持受歡迎的原因之一。

在掌握了這些基礎知識後,下一步就是探索更複雜的元件和事件處理,這將使你能夠建立功能豐富、反應靈敏的應用程式。記住,即使是最複雜的應用程式也是由這些基本構建塊組成的。

Delphi開發的旅程始於理解這些基本元素,但其潛力遠不止於此。透過實踐和探索,你將能夠充分利用Delphi強大的視覺化開發環境,建立專業、高效的應用程式。

## Delphi視窗元件:基礎操作與實戰應用

在視窗應用程式開發中,掌握基本元件的使用是成功的第一步。Delphi提供了豐富的視覺化元件,讓開發者能夠快速構建功能完整的應用程式介面。本文將探討幾個最常用的元件操作技巧,並示範如何有效處理使用者互動事件。

### 文字編輯框(TEdit)的進階操作

TEdit元件是Delphi中最常用的文字輸入控制項之一。透過以下步驟,我們可以充分掌握它的操作方法:

#### 調整大小與位置

要調整TEdit的大小,只需將滑鼠指標放在其邊緣的黑色小方塊上,按住左鍵並拖曳至所需大小。如果沒有看到這些黑色方塊,表示元件尚未被選中,此時需先點選元件進行選取。

若要移動TEdit的位置,則將滑鼠放在元件上,按住左鍵拖曳至新位置後釋放即可。這種直覺的操作方式讓介面設計變得極為靈活。

#### 關鍵屬性設定

為了讓元件在程式中易於識別和操作,我們應該設定其Name屬性:

1. 在物件檢視器中點選Name屬性
2. 輸入有意義的名稱,如`edtMyText`
3. 此時在結構檢視中,原本的`Edit1: TEdit`會變更為`edtMyText: TEdit`

元件的顯示文字可透過Text屬性設定:

在物件檢視器中選擇Text屬性 輸入所需文字,如"This is a text edit control" 按Enter確認,此時表單上的文字將立即更新


#### 外觀自訂

TEdit的文字顏色可透過Font屬性進行更改

1. 點選Font屬性旁的+號展開子屬性
2. 選擇Color屬性並點選箭頭顯示顏色清單
3. 選擇所需顏色,如藍色

#### 唯讀模式的應用

TEdit設為唯讀模式是一個實用功能

1. ReadOnly屬性設為True
2. 執行應用程式後,將無法修改文字框中的內容



唯讀模式看似限制了文字框的基本功能,但在實際應用中非常有用。在程式執行過程中,我們可以根據特定條件動態切換ReadOnly屬性,控制使用者何時可以編輯內容。例如,在資料驗證前禁止編輯,驗證後再開放編輯許可權;或在特定操作完成前鎖定某些欄位,避免使用者輸入造成邏輯錯誤。

### 按鈕元件(TButton)的實作技巧

TButton是應用程式中最常用的互動元件,通常用於觸發特定程式碼的執行。讓我們看如何有效使用它:

#### 基礎設定與熱鍵指定

建立按鈕元件的步驟如下:

1. 在工具面板中雙擊TButton圖示,或點選圖示後再點選表單的任意位置
2. Name屬性設為有意義的名稱,如`btnMyButton`
3. Caption屬性設為`&Run`



Caption屬性中使用&符號有特殊意義 - 它會將緊跟的字母設為熱鍵,在介面上表現為帶下劃線的字母。使用者可以透過按下Alt+該字母來觸發按鈕,而無需使用滑鼠點選。這大幅提升了應用程式的可用性,特別是對於經常使用鍵盤操作的使用者。

若需在Caption中顯示&符號本身,則需連續使用兩個&(即`&&`)。例如,若要顯示"This & That"文字,Caption屬性應設為"This && That"

#### 熱鍵的使用

設定Caption為`&Run`後,執行應用程式時:

1. 按鈕上的"R"字母會顯示下劃線
2. 可以透過按下Alt+R鍵來觸發按鈕
3. 使用熱鍵觸發時,按鈕不會顯示被按下的視覺效果,但功能仍會執行

這種設計為使用者提供了多種操作選擇,同時也符合視窗應用程式的標準設計模式。

## 事件處理:按鈕點選事件的實作

視覺化元件能夠產生並處理數十種不同的事件,如滑鼠點選、按鈕按下、鍵盤按鍵等。瞭解如何正確處理這些事件是開發互動應用程式的關鍵。

### 事件處理機制解析

當使用者點選滑鼠按鈕時,Windows會向應用程式傳送"滑鼠按鈕被點選"的訊息。應用程式會根據開發者編寫的事件處理程式來回應這個事件。

事件處理程式是一段回應特定事件的程式碼,通常在程式碼編輯器視窗中撰寫。對於按鈕點選事件,處理流程如下:

### 程式碼編輯器視窗

程式碼編輯器視窗最初標題為Unit1。可以在編輯器視窗中開啟多個原始碼檔案,每個開啟的檔案都有自己的標籤,標籤顯示其原始碼檔案名稱。

### 簡單事件與複雜事件

簡單事件只包含事件來源,在事件處理程式中由Sender引數指向。而複雜事件的處理程式需要額外的引數,例如滑鼠指標的座標。

### 實作按鈕點選事件處理

OnClick事件(也稱為Press Event)是開發應用程式中最常用的事件之一,通常源於滑鼠點選某個元件。以下是為表單frmMy上的命令按鈕btnMy寫入按鍵事件處理程式的步驟

1. 在設計檢視中雙擊該按鈕
2. Delphi會自動生成事件處理程式的框架程式碼

```delphi
procedure TfrmMy.btnMyClick(Sender: TObject);
begin
end;
  1. 遊標會位於begin和end關鍵字之間,我們可以在此處編寫程式碼

在此事件處理程式中,Sender: TObject引數表示觸發事件的物件。這設計允許多個元件共用同一個事件處理程式,透過檢查Sender引數來確定是哪個元件觸發了事件。

當我們在程式碼編輯器中輸入元件名稱並加上點號(如frmMy.)時,Delphi會顯示程式碼完成選項,列出該元件可用的所有方法和屬性。這大提高了開發效率,減少了輸入錯誤。

完整的表單關閉範例

如果我們想在按鈕點選時關閉表單,可以使用以下程式碼:

procedure TfrmMy.btnMyClick(Sender: TObject);
begin
  frmMy.Close;
end;

上述程式碼呼叫表單的Close方法,這是關閉視窗的程式化方式,效果等同於點選視窗標題欄上的關閉按鈕。由於這個表單是應用程式的主要與唯一視窗,關閉它也會終止整個應用程式。

在實際開發中,我們可能會在關閉表單前執行一些清理工作,如儲存設定、關閉資料連線等。這些操作可以增加到Close方法呼叫之前。

深入理解Delphi的事件驅動模型

Delphi應用程式是根據事件驅動模型設計的,這意味著應用程式大部分時間處於等待狀態,直到發生某個事件(如使用者點選按鈕)。當事件發生時,對應的事件處理程式會被執行。

事件處理程式的引數

事件處理程式通常包含一個或多個引數,最常見的是Sender引數,它指向觸發事件的物件。某些事件可能包含額外引數,例如:

  1. 滑鼠事件可能包含X、Y座標引數
  2. 鍵盤事件可能包含按鍵程式碼和修飾鍵狀態
  3. 拖曳事件可能包含被拖動的資料訊息

程式碼輔助功能

Delphi提供多種程式碼輔助功能,幫助開發者更高效地編寫程式碼:

  1. 程式碼完成:輸入物件名稱和點號後,顯示可用的屬性和方法
  2. 引數提示:輸入方法名稱和左括號後,顯示該方法所需的引數
  3. 程式碼範本:提供常用程式碼片段的快速插入
  4. 錯誤提示:在程式碼編輯過程中即時顯示潛在問題

這些功能大降低了程式設計的難度,特別是對於初學者。

多元件使用同一事件處理程式

在實際應用中,我們可能希望多個元件分享同一個事件處理程式。例如,一組相關按鈕可能執行類別似的操作,只是處理的資料不同。此時可以:

  1. 為一個按鈕建立事件處理程式
  2. 在物件檢視器中,將其他按鈕的OnClick事件設定為同一個處理程式
  3. 在處理程式中透過檢查Sender引數來區分不同的按鈕
procedure TForm1.ButtonClick(Sender: TObject);
begin
  if Sender = Button1 then
    ShowMessage('Button1 clicked')
  else if Sender = Button2 then
    ShowMessage('Button2 clicked');
end;

上述程式碼展示瞭如何在一個事件處理程式中處理多個按鈕的點選事件。透過檢查Sender引數,我們可以確定是哪個按鈕被點選,並執行相應的操作。這種方法不僅減少了程式碼量,還使程式邏輯更加集中,便於維護。

設計更直覺的使用者介面

設計良好的使用者介面不僅美觀,更應該直覺易用。以下是幾點設計建議:

元件命名規範

採用一致的命名規範有助於程式碼的可讀性和維護:

  • 使用字首表示元件類別,如btn表示按鈕,edt表示編輯框
  • 名稱應該反映元件的用途,如btnSaveedtUserName
  • 避免使用非描述性名稱,如Button1Edit1

熱鍵與快捷鍵的合理分配

  • 為常用功能分配熱鍵,如儲存(S)、取消(C)
  • 確保熱鍵不衝突
  • 遵循常見應用程式的熱鍵慣例,如Ctrl+S儲存,Ctrl+Z復原

元件佈局考量

  • 相關元件應該分組放置
  • 遵循從上到下,從左到右的閱讀順序
  • 保持適當的間距,避免介面過於擁擠
  • 考慮不同螢幕解析度下的顯示效果

元件狀態的視覺反饋

  • 停用不可用的元件
  • 為當前焦點元件提供明確的視覺指示
  • 錯誤輸入應有即時反饋
  • 長時間操作應顯示進度指示

透過這些技巧,可以建立既美觀又實用的Delphi應用程式介面,提升使用者經驗。

Delphi開發效率提升技巧

除了基本的元件操作和事件處理,掌握一些開發技巧可以大幅提高Delphi開發效率:

鍵盤快捷鍵

熟練使用鍵盤快捷鍵可以減少滑鼠操作,提高開發速度:

  • F9:執行應用程式

Delphi按鈕事件處理機制

在Delphi視窗程式設計中,事件處理是構建互動式應用程式的核心。當使用者與介面元件互動時,程式需要做出適當回應,而這正是事件處理機制的作用所在。

按鈕點選事件的基本結構

當我們在Delphi中處理按鈕點選事件時,程式碼通常遵循以下結構:

procedure TfrmMy.btnMyClick(Sender: TObject);
begin
  frmMy.Close;
end;

這段程式碼定義了一個名為btnMyClick的過程(procedure),它屬於TfrmMy表單類別。當使用者點選名為btnMy的按鈕時,這個過程會被呼叫。Sender: TObject引數代表觸發事件的元件,在此例中是按鈕本身。在過程內部,frmMy.Close指令會關閉表單,導致程式結束。這種結構是Delphi中事件處理的典型模式。

元件方法的使用方式

在Delphi中,所有視窗元件都有各自的方法(methods)集合。方法是能對元件執行的操作。呼叫方法的語法結構為:

<元件名稱>.<方法名稱>;

例如,Clear方法可用於清空特定元件的內容:

Edit1.Clear;

這行程式碼會清空名為Edit1的文字方塊內容。不同元件可能擁有相同的方法,但其行為可能因元件類別而異。

元件屬性的操作

除了方法外,元件還擁有屬性(properties),這些屬性定義了元件的特徵。我們可以透過以下語法讀取或修改屬性:

<元件名稱>.<屬性名稱> := <值>;

例如,要將表單背景改為白色:

procedure TfrmMy.btnMyClick(Sender: TObject);
begin
  frmMy.Сolor := clWhite;
end;

這段程式碼修改表單的Color屬性值為clWhite(預定義的白色常數)。執行後,整個表單背景會變成白色。Color屬性控制元件的背景顏色,而clWhite是Delphi內建的顏色常數之一。

屬性值的讀取與傳遞

我們不僅能設定屬性值,還能讀取屬性並將其值傳遞給其他元件的屬性:

<元件1名稱>.<屬性1> := <元件2名稱>.<屬性2>;

例如,將文字方塊的內容顯示在標籤上:

lblMy.Caption := edtMy.Text;

這行程式碼讀取名為edtMy的文字方塊中的Text屬性值(使用者輸入的文字),然後將這個值指派給名為lblMy的標籤的Caption屬性。這樣,使用者在文字方塊中輸入的內容就會顯示在標籤上。

多重操作的執行

在一個事件處理過程中,我們可以執行多個操作,只需用分號分隔:

procedure TfrmMy.btnMyClick(Sender: TObject);
begin
  edit1.Clear;
  edit1.Color := clBlue;
end;

當按鈕被點選時,這段程式碼會執行兩個操作:首先清空edit1文字方塊的內容,然後將其背景色設為藍色(clBlue)。操作會按照程式碼的順序依次執行。分號在Pascal語言中作為陳述式分隔符,允許在同一個程式區塊中執行多個指令。

實用練習:元件互動基礎

為了鞏固對Delphi元件互動的理解,以下提供幾個實用練習:

練習1:標籤啟用與停用

建立一個含有標籤和兩個按鈕的表單。第一個按鈕啟用標籤,第二個按鈕停用標籤。

// 第一個按鈕的點選事件
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Enabled := True;
end;

// 第二個按鈕的點選事件
procedure TForm1.Button2Click(Sender: TObject);
begin
  Label1.Enabled := False;
end;

這兩個過程分別處理兩個按鈕的點選事件。Button1Click將標籤的Enabled屬性設為True,使標籤處於啟用狀態(可見與可互動)。Button2Click則將標籤的Enabled屬性設為False,使標籤處於停用狀態(通常會變灰顯示)。Enabled屬性控制元件是否可以回應使用者操作。

練習2:文字傳遞與清空

建立一個含有標籤、文字方塊和按鈕的表單。按下按鈕後,將文字方塊中的文字移至標籤,並清空文字方塊。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := Edit1.Text;
  Edit1.Clear;
end;

這段程式碼首先讀取Edit1文字方塊中的Text屬性值,並將它指派給Label1標籤的Caption屬性,使標籤顯示文字方塊中的內容。然後呼叫Edit1.Clear()方法清空文字方塊。這種模式在表單驗證和資料輸入中非常見,可以讓使用者看到剛輸入的內容同時準備下一次輸入。

練習3:“交通訊號燈"模擬

建立一個含有三個標籤和三個按鈕的表單。每個按鈕應該啟用對應的標籤並停用其他標籤。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Enabled := True;
  Label2.Enabled := False;
  Label3.Enabled := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Label1.Enabled := False;
  Label2.Enabled := True;
  Label3.Enabled := False;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Label1.Enabled := False;
  Label2.Enabled := False;
  Label3.Enabled := True;
end;

這三個過程模擬交通訊號燈的行為。每個按鈕點選事件處理程式會啟用一個特定的標籤(代表紅、黃、綠燈中的一個),同時停用其他兩個標籤。這種互斥性啟用/停用的模式在許多介面設計中很常見,可以確保在任何時候只有一個元件處於活動狀態。

練習4:標籤樣式多重控制

建立一個含有標籤和四組按鈕的表單,每組三個按鈕。第一組改變標籤的背景色,第二組改變標籤的字型顏色,第三組改變標籤的字型大小,第四組改變標籤的字型家族。

// 背景色按鈕(範例)
procedure TForm1.btnBackRed(Sender: TObject);
begin
  Label1.Color := clRed;
end;

// 字型顏色按鈕(範例)
procedure TForm1.btnFontBlue(Sender: TObject);
begin
  Label1.Font.Color := clBlue;
end;

// 字型大小按鈕(範例)
procedure TForm1.btnSize12(Sender: TObject);
begin
  Label1.Font.Size := 12;
end;

// 字型家族按鈕(範例)
procedure TForm1.btnFontArial(Sender: TObject);
begin
  Label1.Font.Name := 'Arial';
end;

這些程式碼展示瞭如何操作標籤的不同視覺屬性。注意Font屬性本身包含多個子屬性,如ColorSizeName。這種層次化的屬性結構在Delphi中很常見,允許精確控制元件的外觀。每個按鈕點選都會修改標籤的一個特定視覺屬性,讓使用者可以看到即時的變化效果。

Delphi變數與變數類別

在程式設計中,變數是儲存資料的基本單位。理解變數及其類別是掌握任何程式語言的關鍵。

指派運算元的基本用法

在Delphi中,指派運算元(:=)用於將值指派給變數:

RAD := (DEGR * 3.14) / 180;

指派運算元的工作方式是先計算右側的表示式值,然後將結果指派給左側的變數。指派的基本格式為:

<變數名稱> := <表示式>;

變數的定義與命名規則

變數是具有名稱的記憶體位置。在Delphi中,變數需要在使用前定義,通常在procedure定義之後、begin關鍵字之前,使用var關鍵字開始:

procedure TfrmMy.btnMyClick(Sender: TObject);
var
  k: Integer;
begin
  // 程式碼使用變數k
end;

這段程式碼在按鈕點選事件處理程式中定義了一個名為k的整數變數。var關鍵字開始變數宣告區段,而Integer指定變數的資料類別。在beginend之間的程式碼區塊中可以使用這個變數命名規則:

  • 可包含字母、數字和底線
  • 必須以字母開頭
  • 不區分大小寫
  • 長度不限

雖然可以使用單字元變數名(如迴圈計數器ij),但建議使用更有意義的名稱以增加程式可讀性。單字元變數名應使用大寫,但避免使用字母l,以免與數字1混淆。

整數資料類別

Delphi支援多種整數資料類別,每種類別有不同的範圍和記憶體需求:

資料類別範圍表示法
Integer-2,147,483,648 到 2,147,483,64732位元,有符號
Cardinal0 到 4,294,967,29532位元,正整數
ShortInt-128 到 1278位元,有符號
SmallInt-32,768 到 32,76716位元,有符號
LongInt-2,147,483,648 到 2,147,483,64732位元,有符號
Int64-2^63 到 2^63-164位元,有符號
Byte0 到 2558位元,無符號
Word0 到 6553516位元,無符號
LongWord0 到 4,294,967,29532位元,無符號

在大多數情況下,Integer類別足以滿足一般需求。選擇適當的資料類別可以最佳化記憶體使用並確保資料完整性。

實數資料類別

Delphi也提供多種實數資料類別,適用於需要小數點的計算:

資料類別範圍有效位數(精確度)位元組
Real48±2.9 × 10^-39 到 ±1.7 × 10^3811-126
Real±5.0 × 10^-324 到 ±1.7 × 10^30815-168
Single±1.5 × 10^-45 到 ±3.4 × 10^387-84
Double±5.0 × 10^-324 到 ±1.7 × 10^30815-168
Extended±3.6 × 10^-4951 到 ±1.1 × 10^493219-20

理解算術表示式的本質

算術表示式是程式設計中最基本也最重要的元素之一。在實際開發過程中,我發現許多初學者常低估了對算術表示式的理解深度。一個算術表示式由常數、變數、函式、算術運算元(如 +、-、*、/、冪)以及括號所組成,形成一個合法的數學表示式。

常見算術運算元及其行為

在設計系統時,準確理解每個運算元的行為是至關重要的。以下是常見運算元及其特性:

運算元名稱運算元資料類別結果類別
+加法至少一個為實數實數
兩個整數整數
-減法至少一個為實數實數
兩個整數整數
*乘法至少一個為實數實數
兩個整數整數
/除法實數、整數實數
Div整數除法整數整數
Mod整數除法餘數整數整數

特別值得注意的是整數除法(Div)和取餘數運算(Mod)的行為。這些運算在處理負數時可能產生令人意外的結果:

// 整數除法與餘數範例
13 div 4 = 3     13 mod 4 = 1
-13 div 4 = –3   -13 mod 4 = –1
13 div –4 = –3   13 mod –4 = 1
-13 div –4 = 3   -13 mod –4 = –1
0 div 2 = 0      1 mod 2 = 1
2 div 5 = 0      2 mod 5 = 2

上面的例子展示了整數除法和取餘運算的特殊行為,尤其是在處理負數時。這裡有個規律:對於 a div b,結果的符號取決於 a 和 b 的符號,結果的絕對值是 |a| 除以 |b| 的商。而對於 a mod b,結果的符號則與 a 的符號相同,值為 |a| 除以 |b| 的餘數。這在處理週期性問題或陣列索引計算時特別重要。

型別轉換的重要性

在處理不同類別的資料時,型別轉換是不可避免的。我觀察到一個重要規則:若表示式的值為整數,它可以被指派給實數型別的變數,但反之則不行。這是因為整數可以無損地轉換為實數,而實數轉換為整數則可能丟失精確度。

實作:基本的數字運算應用

讓我們透過一個簡單的加法計算器來實踐這些概念。以下是使用 Delphi 建立一個加法計算器的步驟:

// 加法計算器的事件處理程式
Var
  a, b, c: Single;
Begin
  a := StrToFloat(edtA.Text); // 取得第一個數字
  b := StrToFloat(edtB.Text); // 取得第二個數字
  c := a + b;                 // 計算兩數之和
  
  lblResult.Visible := true;   // 顯示結果標籤
  lblResult.Caption := FloatToStr(c); // 設定結果值
end;

這段程式碼展示了基本的類別轉換操作。首先,從文字框取得的輸入是字串型別,必須使用 StrToFloat 函式轉換為實數才能進行算術運算。計算完成後,結果必須再次使用 FloatToStr 轉換回字串才能顯示在標籤上。這種類別轉換在使用者介面與程式邏輯之間的資料交換中極為常見。

為了讓輸出更加友好,我們可以進一步改進:

lblAnswer.Caption := edtA.Text + '+' + edtB.Text + '=' + FloatToStr(c);

數值格式與區域設定

在處理實數轉換時,需要特別注意小數點分隔符號的問題。在 Delphi 程式內部,僅接受點號(”.")作為小數分隔符。然而,在表單的輸入輸出視窗中,小數分隔符取決於 Windows 的區域設定。例如,許多歐洲國家使用逗號來分隔整數部分和小數部分。

對於整數型別,則可以使用 IntToStr(integer)StrToInt(string) 函式進行轉換。

標準數學函式的應用

在實際開發中,除了基本算術運算外,標準數學函式也是不可或缺的工具。以下是 Delphi 中常用的數學函式:

函式功能引數類別結果類別範例
ABS(X)回傳絕對值實數或整數與引數相同ABS(2.0) = 2.0
SQR(X)回傳平方值實數或整數與引數相同SQR(3) = 9
SQRT(X)回傳平方根實數或整數實數SQRT(16) = 4.0
EXР(X)回傳 e 的 X 次方實數或整數實數EXР(0) = 1.0
LN(X)回傳自然對數實數或整數實數LN(1) = 0.0
SIN(X)回傳正弦值弧度(實數或整數)實數SIN(0) = 0.0
COS(X)回傳餘弦值弧度(實數或整數)實數COS(0) = 1.0
ARCTAN(X)回傳反正切值實數或整數實數ARCTAN(0) = 0.0
ROUND(X)四捨五入至最接近的整數實數整數ROUND(3.1) = 3
TRUNC(X)截斷小數部分實數整數TRUNC(3.8) = 3
INT(X)回傳整數部分實數實數INT(3.1) = 3.0

ROUND函式的特別行為

值得注意的是,ROUND函式在處理正好為0.5的小數部分時,會向最接近的偶數取整。例如:

ROUND(3.5) = 4;  // 向上取整到偶數4
ROUND(2.5) = 2;  // 向下取整到偶數2

這種取整方式稱為"銀行家取整法",它在統計學和金融計算中很常見,因為它能減少因取整導致的累計誤差。與總是向上或總是向下取整相比,這種方法在長期計算中不會產生系統性偏差。

實用演練:數學函式應用

分離整數和小數部分

給定一個實數,如何分離其整數和小數部分?這是一個常見的需求,尤其是在格式化輸出或特定演算法中。

var
  num, fracPart: Real;
  intPart: Integer;
begin
  num := 12.345;
  
  // 方法1:使用TRUNC和減法
  intPart := TRUNC(num);
  fracPart := num - intPart;
  
  // 方法2:使用INT函式
  intPart := TRUNC(num);
  fracPart := num - INT(num);
  
  // 顯示結果
  ShowMessage('整數部分: ' + IntToStr(intPart) + 
              ',小數部分: ' + FloatToStr(fracPart));
end;

這個範例展示了兩種分離數字整數和小數部分的方法。第一種方法使用TRUNC函式取得整數部分,然後用原始數減去整數部分得到小數部分。第二種方法使用INT函式,效果類別似。這種技術在需要不同處理整數和小數部分的場景中非常有用,例如貨幣格式化或科學計算。

視距計算

假設地球是半徑R=6350公里的理想球體,如何計算從地表給定高度的點到地平線的距離?

var
  height, distance: Real;
  earthRadius: Real;
begin
  // 設定地球半徑(公里)
  earthRadius := 6350;
  
  // 取得高度(公里)
  height := StrToFloat(edtHeight.Text);
  
  // 計算到地平線的距離
  // 使用畢氏定理:distance = sqrt((R+h)² - R²)
  distance := Sqrt(Sqr(earthRadius + height) - Sqr(earthRadius));
  
  // 顯示結果
  lblResult.Caption := '到地平線的距離: ' + 
                       FloatToStr(distance) + ' 公里';
end;

這個計算根據幾何學原理。從觀察者到地平線的距離可以透過直角三角形來計算,其中一邊是地球半徑,斜邊是地球半徑加上觀察者高度,而另一邊就是我們要求的距離。使用畢氏定理,我們可以計算出這個距離。這種計算在航海、航空和通訊領域中非常實用。

三角形面積計算

三角形由其頂點坐標指定,如何計算其周長和麵積?

var
  x1, y1, x2, y2, x3, y3: Real; // 三個頂點的坐標
  a, b, c: Real;                // 三邊長度
  perimeter, area, s: Real;     // 周長、面積和半周長
begin
  // 取得頂點坐標
  x1 := StrToFloat(edtX1.Text); y1 := StrToFloat(edtY1.Text);
  x2 := StrToFloat(edtX2.Text); y2 := StrToFloat(edtY2.Text);
  x3 := StrToFloat(edtX3.Text); y3 := StrToFloat(edtY3.Text);
  
  // 計算三邊長度
  a := Sqrt(Sqr(x2-x1) + Sqr(y2-y1));
  b := Sqrt(Sqr(x3-x2) + Sqr(y3-y2));
  c := Sqrt(Sqr(x1-x3) + Sqr(y1-y3));
  
  // 計算周長
  perimeter := a + b + c;
  
  // 計算面積(使用海倫公式)
  s := perimeter / 2; // 半周長
  area := Sqrt(s * (s-a) * (s-b) * (s-c));
  
  // 顯示結果
  lblPerimeter.Caption := '三角形周長: ' + FloatToStr(perimeter);
  lblArea.Caption := '三角形面積: ' + FloatToStr(area);
end;

這個範例使用兩個重要的幾何公式:

  1. 兩點間距離公式計算三角形的三邊長度
  2. 海倫公式(Heron’s formula)計算三角形面積

海倫公式是計算三角形面積的有力工具,它只需要知道三邊長度,不需要角度或高度。這種方法在電腦圖形學、GIS系統和物理模擬中都有廣泛應用。

邏輯表示式與布林型別

除了算術表示式外,邏輯表示式也是程式設計中的基本元素。邏輯表示式的結果只有TRUE或FALSE兩種可能,對應到布林(Boolean)型別。

布林型別變數

布林型別以英國數學家喬治·布林(George Boole)命名,他奠定了數理邏輯的基礎。布林型別變數的宣告如下:

var
  Exist: Boolean; // 布林型別變數

關係運算元

關係運算元用於比較兩個值,結果是TRUE或FALSE。常見的關係運算元包括:

  • = — 等於
  • <>

邏輯運算與布林表示式:程式流程控制的基礎

程式設計的核心在於控制程式的執行流程。當我們開發應用時,經常需要根據不同條件執行不同的操作。這種能力依賴於邏輯表示式和布林運算,它們是構建人工智慧、有彈性程式的根本。

讓我們先理解邏輯表示式的運作方式。邏輯表示式會評估為真(True)或假(False),這種二元結果使電腦能夠「做決定」。

複合邏輯表示式的求值順序

當處理複合邏輯表示式時,理解運算元的優先順序至關重要。讓我們透過一個範例來解析:

假設我們有以下表達式:(a*2>b) or not (c=7) and (d-1<=3),與 a=2, b=4, c=6, d=4

解析過程如下:

(2*2>4) or not (6=7) and (4-1<=3)
(4>4) or not (6=7) and (3<=3)
false or not false and true
false or true and true
false or true
True
__CODE_BLOCK_31__pascal
(x > -4) and (x <= 18.3)
__CODE_BLOCK_32__pascal
procedure TForm1.btnToggleClick(Sender: TObject);
begin
  if lblStatus.Visible = True then
    lblStatus.Visible := False
  else
    lblStatus.Visible := True;
end;
__CODE_BLOCK_33__pascal
procedure TForm1.btnToggleClick(Sender: TObject);
begin
  lblStatus.Visible := not lblStatus.Visible;
end;
__CODE_BLOCK_34__pascal
procedure TForm1.btnRedClick(Sender: TObject);
begin
  lblRed.Visible := True;
  lblYellow.Visible := False;
  lblGreen.Visible := False;
end;

procedure TForm1.btnYellowClick(Sender: TObject);
begin
  lblRed.Visible := False;
  lblYellow.Visible := True;
  lblGreen.Visible := False;
end;

procedure TForm1.btnGreenClick(Sender: TObject);
begin
  lblRed.Visible := False;
  lblYellow.Visible := False;
  lblGreen.Visible := True;
end;
__CODE_BLOCK_35__pascal
procedure TForm1.btnCompareClick(Sender: TObject);
var
  num1, num2: Integer;
begin
  num1 := StrToInt(edtNum1.Text);
  num2 := StrToInt(edtNum2.Text);
  
  if num1 > num2 then
    lblResult.Caption := 'True'
  else
    lblResult.Caption := 'False';
end;

這段程式碼:

  1. 從兩個文字方塊讀取數值
  2. 比較第一個數是否大於第二個數
  3. 根據比較結果顯示「True」或「False」 這種比較模式是條件邏輯的基礎應用。

複雜條件判斷:三位數中位數之和

這個範例展示了更複雜的條件邏輯:

procedure TForm1.btnCheckClick(Sender: TObject);
var
  num, digit1, digit2, digit3: Integer;
begin
  num := StrToInt(edtNumber.Text);
  
  // 提取三個位數
  digit1 := num div 100;
  digit2 := (num div 10) mod 10;
  digit3 := num mod 10;
  
  // 檢查任意兩位數之和是否等於第三位數
  if (digit1 + digit2 = digit3) or 
     (digit1 + digit3 = digit2) or 
     (digit2 + digit3 = digit1) then
    lblResult.Caption := 'True'
  else
    lblResult.Caption := 'False';
end;

這個程式示範瞭如何處理更複雜的條件判斷:

  1. 從輸入中提取三位數的每一位
  2. 檢查是否存在任意兩位數之和等於第三位數的情況
  3. 使用邏輯OR連線多個條件,只要其中一個條件為真,整個表示式就為真 這種技巧在需要檢查多種可能情況的程式中非常有用。

程式中的條件執行:IF…THEN…ELSE 結構

到目前為止,我們主要編寫了順序執行的程式,即按照撰寫順序一個接一個執行動作。這種結構稱為線性程式結構。然而,現實生活中我們經常面臨各種選擇。

分支結構基礎

分支結構允許程式根據條件執行不同的程式片段。在Delphi中,這主要透過IF…THEN…ELSE陳述式實作。

其語法為:

If <邏輯表示式> Then
  <陳述式1>
Else
  <陳述式2>;

執行順序:

  1. 先計算邏輯表示式
  2. 如果表示式為True,則執行陳述式1
  3. 如果表示式為False,則執行陳述式2

例項:求兩整數中的最大值

procedure TfrmMy.btnMaxClick(Sender: TObject);
var
  a, b, m: integer;
begin
  a := StrToInt(edtA.Text);
  b := StrToInt(edtB.Text);
  if a > b then
    m := a
  else
    m := b;
  lblMax.Caption := IntToStr(m);
end;

這個範例展示了IF…THEN…ELSE的基本用法:

  1. 從介面讀取兩個整數
  2. 比較它們的大小
  3. 將較大的值賦給變數m
  4. 顯示最大值

需要注意的是,IF…THEN…ELSE是一個完整的複合陳述式,因此在ELSE關鍵字前不需要分號。

複合陳述式的使用

當需要在THEN或ELSE分支中執行多個操作時,可以使用複合陳述式。複合陳述式由BEGIN…END包圍的多個陳述式組成:

If x < 0 Then
begin
  y := 1;
  k := k + 1;
end
Else
begin
  y := 2 * x;
  k := x;
end;

這個範例顯示瞭如何在條件分支中執行多個操作:

  • 當x小於0時,執行兩個操作:設定y為1,並增加k的值
  • 當x大於或等於0時,執行兩個不同的操作:設定y為x的兩倍,並將k設為x

簡化版條件陳述式:IF…THEN

有時我們只需要在條件為真時執行操作,而條件為假時不需要任何操作。這種情況可以使用簡化版的IF…THEN陳述式:

If <邏輯表示式> Then
  <陳述式1>;

如果邏輯表示式評估為True,則執行陳述式1。否則不執行任何陳述式。

條件陳述式的實務應用

讓我們透過一些實際例子來掌握條件陳述式的應用:

數字整除判斷

procedure TForm1.btnCheckDivisionClick(Sender: TObject);
var
  m, n: Integer;
begin
  m := StrToInt(edtM.Text);
  n := StrToInt(edtN.Text);
  
  if n mod m = 0 then
    lblResult.Caption := IntToStr(n div m)
  else
    lblResult.Caption := 'n cannot be divided by m';
end;

這個程式檢查一個數是否能被另一個數整除:

  1. 使用mod運算元檢查n除以m的餘數是否為0
  2. 如果能整除,顯示除法結果
  3. 如果不能整除,顯示提示訊息 這種模式在需要進行數學運算前檢查條件的場景中很常見。

判斷迴文數

procedure TForm1.btnCheckPalindromeClick(Sender: TObject);
var
  num, digit1, digit3: Integer;
begin
  num := StrToInt(edtNumber.Text);
  
  digit1 := num div 100;       // 取得百位數
  digit3 := num mod 10;        // 取得個位數
  
  if digit1 = digit3 then
    lblResult.Caption := 'Is a palindrome'
  else
    lblResult.Caption := 'Not a palindrome';
end;

這段程式判斷一個三位數是否為迴文數(從左到右和從右到左讀都相同):

  1. 提取數字的第一位和最後一位
  2. 比較這兩個數字是否相等
  3. 根據比較結果顯示適當的訊息 這是字元串處理和數字操作的結合應用。

求三個數的最大值和最小值

procedure TForm1.btnFindMinMaxClick(Sender: TObject);
var
  a, b, c, min, max: Real;
begin
  a := StrToFloat(edtA.Text);
  b := StrToFloat(edtB.Text);
  c := StrToFloat(edtC.Text);
  
  // 找最大值
  if (a > b) and (a > c) then
    max := a
  else if (b > a) and (b > c) then
    max := b
  else
    max := c;
    
  // 找最小值
  if (a < b) and (a < c) then
    min := a
  else if (b < a) and (b < c) then
    min := b
  else
    min := c;
    
  lblMax.Caption := FloatToStr(max);
  lblMin.Caption := FloatToStr(min);
end;

這個範例展示瞭如何找出三個數中的最大值和最小值:

  1. 使用多個條件判斷找出最大值
  2. 使用類別似的邏輯找出最小值
  3. 顯示結果 這種模式可以擴充套件到處理更多的數值,但在數量增加時,使用迴圈和陣列會更有效率。