2009-05-06 36 views
5

TTreeNode không có thuộc tính Hiển thị, do đó, tùy chọn hiển thị không tồn tại. Có cách nào khác để làm cho một TTreeNode và tất cả các nút con của nó vô hình? Tất nhiên tôi muốn để có thể làm cho nó có thể nhìn thấy một lần nữa sau này.Tôi có thể vô hiệu hóa TTreeNode không?

Đây là với Delphi 2007.

Lưu ý # 1: Tôi nhận thức được TVirtualTreeView thay thế, và tôi sẽ kiểm tra xem nó ra nếu không có cách nào dễ dàng để thực hiện điều này với TTreeView.

Lưu ý # 2: Tôi chỉ cần tùy chọn cho các nút cấp cao nhất. Những người tôi muốn ẩn thường không có con.

Trả lời

7

Đó là một ý tưởng tốt để dữ liệu tách biệt với giao diện người dùng, và vấn đề này với tầm cây là một ví dụ điển hình - không lưu trữ dữ liệu trong một cái nhìn cây. Tôi thường có một đơn vị không trực quan có chứa một lớp có cấu trúc lưu trữ dữ liệu. Một đơn vị giao diện người dùng có thể có một số lần xem trang có thể hiển thị (một tập con có thể cấu hình) từ lớp đó. Có nhiều cách để di chuyển dữ liệu giữa hai. Kiểu cách ly này đòi hỏi một chút quy hoạch, nhưng cung cấp sự linh hoạt và ổn định hơn nhiều.

+1

Trong khi đó không phải là câu trả lời tôi muốn nghe, tôi đoán đó là giải pháp duy nhất có thể vì vậy tôi sẽ chấp nhận nó. – dummzeuch

3

TTreeView là trình bao bọc cho chế độ xem dạng cây Windows chuẩn, (xem xét từ documentation on MSDN) không cho phép ẩn các nút cây. Nó cũng có ý nghĩa, vì khung nhìn cây được biết là không mở rộng đến một số lượng lớn các nút, vì vậy việc ẩn các nút cây thay vì xóa mọi thứ không cần thiết sẽ là một ý tưởng tồi.

Bạn có thể làm cho cuộc sống của mình dễ dàng hơn một chút nếu bạn xóa và chỉ chèn nút cấp cao nhất (nút bạn muốn ẩn) và tạo tất cả các nút con trong sự kiện OnExpanding của nút được thêm lại. Để làm được điều đó, bạn chỉ cần đặt thuộc tính HasChildren của nút thành true.

5

nếu bạn muốn sử dụng thành phần cây tốt hơn, tại sao không sử dụng Virtualtreeview. Nó là một trong những thành phần tốt nhất từng được phát triển cho Delphi và nó hoàn toàn miễn phí để sử dụng với nguồn! Nhưng có thể có một vấn đề hợp lý với việc ẩn một ttreenode! Nếu cây hiển thị dấu + khi không có nút nào hiển thị?

http://wiki.lazarus.freepascal.org/VirtualTreeview

2

Cách duy nhất để "ẩn" một nút trong TTreeView là thực sự xóa nó. Sau đó, để "hiển thị" nút, bạn chỉ cần chèn lại nó một lần nữa.

2

Cách tôi tạo trong DXE5 với tiêu chuẩn TTreeView. Tôi nghĩ nó sẽ hữu ích cho một số người. Tôi đã làm cho nó đơn giản ví dụ:

1. Mục phải được ẩn. Tôi đặt ImageIndex của nó để 2.

var 
    Node:TTreeNode; 
    begin 
    ... 
    Node:=Tree.Items.AddChild(ParentNode,'Text'); 
    Node.ImageIndex:=2; 

2. Bây giờ tôi đặt onAdvancedCustomDrawItem trường hợp TTreeView.

if Node.ImageIndex=2 then 
    begin 
    DefaultDraw:=false; 
    Node.Parent.HasChildren:=false; 
    end; 

3. Kiểm tra nó với onClick trường hợp TTreeView:

var 
Tree:TTreeView; 
Node:TTreeNode; 
begin 
    Tree:=Sender as TTreeView; 
    if Tree.Selected.Index>-1 then 
    if Tree.Selected.HasChildren then 
    if Tree.Selected.getFirstChild.ImageIndex=2 then 
    showmessage(Tree.Selected.getFirstChild.Text); 

Xong. Tôi hy vọng nó sẽ giúp bạn.

1

Tôi giải quyết vấn đề này bằng cách di chuyển nút đến nút không mở rộng khác và ngược lại. Tôi đã thực hiện nó trong trình xử lý sự kiện đang mở rộng.

Các vấn đề liên quan