首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 為 TreeView 添加單選與複選框:以狀態圖示模擬的巧思實作

     編輯:Delphi

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

兩種解決思路

  1. 繼承重寫元件:難度大、耗時長
  2. 利用視覺錯覺:善用 TreeView 內建圖示顯示功能,以兩種狀態圖片(選中/未選中)交替顯示,簡便易行、開發快

採用第二種方法,完成效果如圖:

實作步驟

1. 準備狀態圖示

拖放 ImageList 元件,設定 StateImages 屬性,包含選中與未選中兩種狀態圖示。

2. 節點狀態切換核心程序

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;

3. 滑鼠點擊狀態圖示時切換

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;

4. 鍵盤空白鍵切換

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;

5. 驗證範例

表單放置 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;

效果圖:

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved