本文通過一個極簡的 TNumBox 類別,演示 Delphi 類別的基本結構:私有字段、公開方法、建構子/解構子缺省、表單建立/銷毀時的實例管理、按鈕事件驅動業務邏輯。
unit NumBox;
interface
type
TNumBox = class
private
FCount: Integer; { 內部計數器 }
public
procedure AddOne;
procedure AddFive;
procedure ZeroCount;
function GetCount: Integer;
end;
implementation
procedure TNumBox.AddOne;
begin
Inc(FCount);
end;
procedure TNumBox.AddFive;
begin
Inc(FCount, 5);
end;
procedure TNumBox.ZeroCount;
begin
FCount := 0;
end;
function TNumBox.GetCount: Integer;
begin
Result := FCount;
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton; { +1 }
Button2: TButton; { +5 }
Button3: TButton; { 歸零 }
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses NumBox;
var
NumBox1: TNumBox; { 全域變數持有實例 }
procedure TForm1.FormCreate(Sender: TObject);
begin
NumBox1 := TNumBox.Create; { 建立實例 }
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
NumBox1.AddOne;
Caption := IntToStr(NumBox1.GetCount); { 顯示於標題欄 }
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
NumBox1.AddFive;
Caption := IntToStr(NumBox1.GetCount);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
NumBox1.ZeroCount;
Caption := IntToStr(NumBox1.GetCount);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
NumBox1.Free; { 釋放實例 }
end;
end.
FCount 為 private,外部只能透過 AddOne/AddFive/ZeroCount/GetCount 存取。Create、Destroy(繼承自 TObject)。FormCreate 建立,FormDestroy 釋放,確保不洩漏。Caption(或 Text)直接顯示計數,簡化 UI。| 改進 | 代碼片段 |
|---|---|
| 屬性化存取 | property Count: Integer read GetCount; → Caption := IntToStr(NumBox1.Count); |
| 事件通知 | 加入 OnChange: TNotifyEvent,方法中 if Assigned(OnChange) then OnChange(Self); |
| 泛型計數器 | TNumBox |
| 介面抽取 | INumBox = interface ... end; 便於測試替換 |
| 線程安全 | TInterlocked.Increment(FCount) 或 TCriticalSection |
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
var Box: TNumBox; Box.AddOne; | 未實例化直接呼叫 | Box := TNumBox.Create; try ... finally Box.Free; end; |
NumBox1 := TNumBox.Create; ... NumBox1 := nil; | 僅置 nil 未釋放記憶體 | NumBox1.Free; 或 FreeAndNil(NumBox1); |
在 FormDestroy 前已 Free | 後續按鈕點擊導致 AV | 僅在 FormDestroy 統一釋放,或用 FreeAndNil 後檢查 if Assigned(NumBox1) |
這個「數字盒子」雖簡單,卻包含了 Delphi 類別設計的核心要素:封裝、實例管理、事件驅動、生命週期。以此為基礎逐步擴展,即可構建複雜的業務物件模型。