2017-05-08 4 views
5

In einem Delphi VCL-Projekt habe ich eine einfache TVirtualStringTree mit zwei Spalten erstellt. Die erste Spalte enthält einen Text, der die Name der dargestellten Daten identifiziert. Der Datensatz enthält auch ein Statusfeld. Die zweite Spalte soll den Status des Datensatzes mit einem Bild (16x16 Pixel) ohne Text darstellen.Wie wird ein Symbol oder Bild in einer Spalte von TVirtualStringTree angezeigt?

Ich habe Demos gesucht, aber nicht den vollständigen Prozess dafür beherrscht, wie VTV einen Knoten anzeigt, und war nicht erfolgreich, ein Symbol zu erhalten, um im Knoten einer bestimmten Spalte anzuzeigen.

So habe ich drei miteinander verbundene Fragen:

  1. Ich sehe, wie der Text in dem OnGetText Ereignisse zugeordnet ist, aber wo soll ich zuweisen oder das Bild ändern, um den aktuellen Status in meinem Rekord zu reflektieren?

  2. Wie bekomme ich das Bild tatsächlich in der Spalte angezeigt?

  3. Bin ich in der Größe für die Bilder begrenzt, oder können sie größer als Symbole sein? Wenn ja, muss ich die Einstellungen ändern, um die Höhe jeder Zeile anzupassen (wenn möglich)?

+0

Ich war vielleicht nicht klar in meiner Frage. Ich möchte, dass der Knoten in einer bestimmten Spalte auf Knotenebene angezeigt wird. Ich habe die Frage bearbeitet, um das zu reflektieren. – Ashlar

+0

Hinzugefügt Programmcode – Ashlar

+0

Ich habe versucht, die if kind ... Zeile hinzufügen und immer noch nicht die Symbole zu sehen. Ich habe auch eine showmessage am Anfang von GetimageIndex platziert und festgestellt, dass es nicht während der Erstellung der Knoten aufgerufen wird, nur wenn ich die Maus in den Knoten bewegen, sobald das Programm läuft. – Ashlar

Antwort

5

Sie benötigen (16x16 in Ihrem Fall) zuweisen TImageList zum TVirtualStringTree.Images Eigenschaft, behandeln dann das Ereignis OnGetImageIndex zB:

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; 

Bin ich in der Größe für die Bilder beschränkt, oder sie können als Symbole größer sein? Wenn ja, muss ich die Einstellungen ändern, um die Höhe der einzelnen Reihe (wenn möglich)

nicht sicher, was du damit gemeint einzustellen, da Sie angegeben Sie ein 16x16 Bilder benötigen. Sie könnten OnGetImageIndexEx verwenden, wenn Sie verschiedene Bildlisten mit möglicherweise anderen Dimensionen benötigen. Für variable Höhe könnten Sie toVariableNodeHeight in TreeOptions.MiscOptions setzen und das OnMeasureItem Ereignis behandeln. Eine andere Möglichkeit, Grafiken in die VTV-Leinwand zu zeichnen, besteht darin, zum Beispiel die OnBeforeItemPaint/OnAfterItemPaint zu handhaben.

+1

Ich stimme zu und tat es. – Ashlar

0

Eine Bildliste 16x16 (Bilder) und verwenden Sie Code wie:

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

Mit dem Komponenten-Editor und der Auswahl der TreeView-Komponente kann ich ein "onDrawText" -Ereignis, aber kein "onDrawTextEx" -Ereignis erzeugen. Das Auswählen des Ereignisses von der Komponente generiert ein Ereignis für MyForm1, nicht MyTreeView, ich verwende eine VitrualStringTree-Komponente. Ist Ihr Veranstaltungsbesitzer wie im Code gezeigt korrekt? – Ashlar

+0

TMyTreeView ist eine abgeleitete Klasse der virtuellen Baumansicht. Aber Sie verwenden den Komponenteneditor, kopieren Sie also in diesem Fall den Inhalt von OnDrawTextEx in Ihren OnDrawText-Event-Handler. Mein Beispiel unterscheidet sich von OnGetImageIndex oben, weil es das Bild in der Spalte zentriert. – dwrbudr

Verwandte Themen