2017-05-08 30 views
5

Trong dự án VCL Delphi, tôi đã tạo một đơn giản TVirtualStringTree với hai cột. Cột đầu tiên sẽ chứa văn bản xác định số Name của dữ liệu được trình bày. Bản ghi dữ liệu cũng chứa trường trạng thái. Cột thứ hai được dùng để biểu diễn trạng thái của bản ghi bằng văn bản hình ảnh (16x16 pixel) w/o.Làm thế nào để hiển thị một biểu tượng hoặc hình ảnh trong một cột của TVirtualStringTree?

Tôi đã tìm kiếm bản trình diễn nhưng chưa nắm vững toàn bộ quá trình cho cách VTV hiển thị nút và chưa thành công trong việc hiển thị biểu tượng trong nút của cột được chỉ định.

Vì vậy, tôi có ba câu hỏi liên quan:

  1. tôi thấy cách các văn bản được gán trong trường hợp OnGetText, nhưng nơi tôi nên gán hoặc thay đổi hình ảnh để phản ánh tình trạng hiện tại trong hồ sơ của tôi?

  2. Làm cách nào để hiển thị hình ảnh trong cột?

  3. Tôi có giới hạn kích thước cho hình ảnh không hoặc chúng có lớn hơn biểu tượng không? Nếu vậy, tôi có cần phải thay đổi bất kỳ cài đặt nào để điều chỉnh chiều cao của mỗi hàng (nếu có thể) không?

+0

Tôi có thể không rõ ràng trong câu hỏi của mình. Tôi muốn nút hiển thị ở cấp độ nút trong một cột cụ thể. Tôi đã chỉnh sửa câu hỏi để phản ánh điều đó. – Ashlar

+0

Nhập mã chương trình – Ashlar

+0

Tôi đã thử thêm dòng nếu ... loại và vẫn không thấy biểu tượng. Tôi cũng đặt một showmessage vào đầu củaGetIMageIndex và thấy rằng nó không được gọi trong quá trình tạo các nút, chỉ khi tôi di chuyển chuột vào nút khi chương trình đang chạy. – Ashlar

Trả lời

5

Bạn cần phải gán (16x16 trong trường hợp của bạn) TImageList đến TVirtualStringTree.Images tài sản, sau đó xử lý các sự kiện OnGetImageIndex ví dụ như:

procedure TForm1.VirtualStringTree1GetImageIndex(Sender: TBaseVirtualTree; 
    Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex; 
    var Ghosted: Boolean; var ImageIndex: Integer); 
var 
    NodeRec: PNodeRec; 
begin 
    NodeRec := Sender.GetNodeData(Node); 
    if Assigned(NodeRec) then 
    begin 
    if (Column = 1) then 
    begin 
     if Kind in [ikNormal, ikSelected] then 
     begin 
     case NodeRec.Status of // check the needed status(es) 
      1: ImageIndex := 1; // whichever image you need 
      2: ImageIndex := 2; // whichever image you need 
      // ... 
     end; 
     end; 
    end; 
    end; 
end; 

Am I giới hạn về kích thước cho hình ảnh, hoặc họ có thể lớn hơn so với các biểu tượng? Nếu vậy, tôi cần phải thay đổi bất kỳ cài đặt để điều chỉnh chiều cao của mỗi hàng (nếu có thể)

Không chắc chắn những gì bạn có nghĩa là bằng cách đó, bởi vì bạn đã nêu bạn cần một hình ảnh 16x16. Bạn có thể sử dụng OnGetImageIndexEx nếu bạn cần khác nhau danh sách hình ảnh có thể có các thứ nguyên khác nhau. cho chiều cao biến, bạn có thể đặt toVariableNodeHeight trong TreeOptions.MiscOptions và xử lý sự kiện OnMeasureItem. một cách khác để vẽ đồ họa vào vải VTV là để xử lý ví dụ OnBeforeItemPaint/OnAfterItemPaint.

+1

Tôi đồng ý và đã làm như vậy. – Ashlar

0

Tạo một 16x16 danh sách hình ảnh (Images) và sử dụng mã như:

procedure TMyTreeView.OnDrawTextEx(Sender: TBaseVirtualTree; 
    TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; 
    const Text: string; const CellRect: TRect; var DefaultDraw: Boolean); 
var i: integer; 
begin 
    if (Node <> nil) then 
    begin 
     case Column of 
     cStatusColumn: 
     begin 
      DefaultDraw := false; 

      i := 0; // assign the image index from Images list here 

      if (i <> -1) then 
      begin 
       Images.Draw(TargetCanvas, CellRect.Left + 
        ((CellRect.Width - Images.Width) div 2), CellRect.Top, i); 
      end; 
     end 
     else 
     begin 
      DefaultDraw := true; 
     end; 
     end; 
    end 
    else 
    begin 
     DefaultDraw := true; 
    end; 
end; 
+1

Sử dụng trình chỉnh sửa thành phần và chọn thành phần treeview tôi có thể tạo "onDrawText" chứ không phải sự kiện "onDrawTextEx". Chọn sự kiện từ thành phần tạo ra một sự kiện cho MyForm1, không phải MyTreeView, tôi đang sử dụng một thành phần VitrualStringTree. Chủ sở hữu sự kiện của bạn có được hiển thị đúng mã không? – Ashlar

+0

TMyTreeView là một lớp hậu duệ của chế độ xem dạng cây ảo. Nhưng bạn đang sử dụng trình soạn thảo thành phần, vì vậy trong trường hợp đó chỉ cần sao chép/dán nội dung của OnDrawTextEx vào trình xử lý sự kiện OnDrawText của bạn. Mẫu của tôi khác với mẫu OnGetImageIndex ở trên, vì nó tập trung hình ảnh bên trong cột. – dwrbudr

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