2017-05-08 28 views
5

在Delphi VCL項目中,我創建了一個帶有兩列的簡單TVirtualStringTree。第一列將包含識別所代表數據的文本。數據記錄還包含一個狀態字段。第二列旨在表示使用圖像(16x16像素)不帶文本的記錄狀態。如何在TVirtualStringTree的列中顯示圖標或圖像?

我已經搜索了演示,但還沒有掌握VTV如何顯示節點的完整過程,並且沒有成功獲取圖標以顯示在指定列的節點中。

所以我有三個相關的問題:

  1. 我看到的文字是如何在OnGetText事件分配的,但在那裏我應該指定或更改圖像,以反映我的紀錄的現狀如何?

  2. 如何讓圖像實際顯示在列中?

  3. 我是否限制圖像尺寸,還是可以比圖標大?如果是這樣,是否需要更改任何設置以調整每一行的高度(如果可能)?

+0

我的問題可能不是很清楚。我希望節點在特定列內的節點級顯示。我編輯了這個問題來反映這一點。 – Ashlar

+0

已添加程序代碼 – Ashlar

+0

我嘗試添加if kind ...行,但仍未看到圖標。我還在GIMIMageIndex的開頭部署了一個showmessage,發現它在創建節點期間沒有被調用,只有當程序運行時我將鼠標移動到節點中。 – Ashlar

回答

5

您需要分配(16×16你的情況)TImageListTVirtualStringTree.Images屬性,那麼處理事件OnGetImageIndex例如:

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; 

上午我在尺寸有限的圖片,也可以是不是圖標更大? 如果是的話,我是否需要更改任何設置調整每個 行的高度(如果可能)

不知道你的什麼意思,因爲你說你需要一個16×16的圖像。您可以使用OnGetImageIndexEx,如果您需要不同的圖像列表可能具有不同的尺寸。對於可變高度,您可以在TreeOptions.MiscOptions中設置toVariableNodeHeight並處理OnMeasureItem事件。另一種將圖形繪製到VTV畫布上的方法是例如處理OnBeforeItemPaint/OnAfterItemPaint

+1

我同意並且這樣做。 – Ashlar

0

創建圖像列表16×16(圖像),並使用如下代碼:

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

使用組件編輯器並選擇樹視圖組件,我可以生成「onDrawText」,但不生成「onDrawTextEx」事件。從組件中選擇事件會爲MyForm1生成事件,而不是MyTreeView,我正在使用VitrualStringTree組件。代碼中顯示的活動所有者是否正確? – Ashlar

+0

TMyTreeView是虛擬樹視圖的後代類。但是您使用的是組件編輯器,所以在這種情況下,只需將OnDrawTextEx的內容複製/粘貼到OnDrawText事件處理程序中即可。 我的示例與上面的OnGetImageIndex示例不同,因爲它將圖像居中在列中。 – dwrbudr

相關問題