Windows 檔案總管左側樹狀結構是典型的樹形控制項應用。Delphi 內建 TreeView 位於「Win32 元件」面板,常用元件之一。雖可顯示樹狀結構與自訂圖示,但無法內嵌 CheckBox 或 RadioButton,使用者無法直觀選擇節點。
採用第二種方法,完成效果如圖:

拖放 ImageList 元件,設定 StateImages 屬性,包含選中與未選中兩種狀態圖示。
procedure ToggleTreeViewCheckBoxes(
Node: TTreeNode;
cUnChecked, // CheckBox 未選中
cChecked, // CheckBox 選中
cRadioUnchecked, // RadioButton 未選中
cRadioChecked: Integer); // RadioButton 選中
var
tmp: TTreeNode;
begin
if Assigned(Node) then
begin
// 未選中 → 選中
if Node.StateIndex = cUnChecked then
Node.StateIndex := cChecked
// 選中 → 未選中
else if Node.StateIndex = cChecked then
Node.StateIndex := cUnChecked
// RadioButton 邏輯:同層級互斥
else if Node.StateIndex = cRadioUnChecked then
begin
tmp := Node.Parent;
if not Assigned(tmp) then
tmp := TTreeView(Node.TreeView).Items.GetFirstNode
else
tmp := tmp.GetFirstChild;
while Assigned(tmp) do
begin
if tmp.StateIndex in [cRadioUnChecked, cRadioChecked] then
tmp.StateIndex := cRadioUnChecked;
tmp := tmp.GetNextSibling;
end;
Node.StateIndex := cRadioChecked;
end;
end;
end;
procedure TForm1.TreeView1Click(Sender: TObject);
var
P: TPoint;
begin
GetCursorPos(P);
P := TreeView1.ScreenToClient(P);
if htOnStateIcon in TreeView1.GetHitTestInfoAt(P.X, P.Y) then
ToggleTreeViewCheckBoxes(
TreeView1.Selected,
cFlatUnCheck, cFlatChecked,
cFlatRadioUnCheck, cFlatRadioChecked);
end;
procedure TForm1.TreeView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_SPACE) and Assigned(TreeView1.Selected) then
ToggleTreeViewCheckBoxes(
TreeView1.Selected,
cFlatUnCheck, cFlatChecked,
cFlatRadioUnCheck, cFlatRadioChecked);
end;
表單放置 TreeView、ImageList、Button、Memo。按鈕點擊事件讀取選中節點狀態:
procedure TForm1.Button1Click(Sender: TObject);
var
BoolResult: Boolean;
tn: TTreeNode;
begin
if Assigned(TreeView1.Selected) then
begin
tn := TreeView1.Selected;
BoolResult := tn.StateIndex in [cFlatChecked, cFlatRadioChecked];
Memo1.Text := tn.Text + #13#10 + 'Selected: ' + BoolToStr(BoolResult, True);
end;
end;
效果圖:


以上為最簡單情況,專業應用請發揮想像進一步擴展。