2012-06-25 8 views
5

utilizo VirtualStringTree de SoftGem en Delphi 7.¿Cómo se muestran líneas de cuadrícula de vista de árbol virtual para nodos que aún no existen?

¿Hay una manera de permitir líneas de cuadrícula completo (al igual que en un TListView)? Solo puedo encontrar toShowHorzGridLines, que solo muestra líneas para nodos actuales, nada en el espacio vacío a continuación, y toShowVertGridLines, que muestra solo líneas verticales.

¿Cómo los muestro en el espacio vacío antes de agregar elementos?

Respuesta

5

No creo que haya una manera fácil de implementar esto sin modificar el método PaintTree ya que ninguno de los eventos de nodo puede activarse porque los nodos cuyas líneas se deben dibujar simplemente todavía no existen.

Aquí está manera sucia cómo dibujar adicionalmente las líneas horizontales basadas en el nodo visible más bajo. De hecho, se dibuja líneas con la distancia del valor DefaultNodeHeight en el área de llenado en color naranja en esta captura de pantalla:

enter image description here

Aquí está el código:

type 
    TVirtualStringTree = class(VirtualTrees.TVirtualStringTree) 
    public 
    procedure PaintTree(TargetCanvas: TCanvas; Window: TRect; Target: TPoint; 
     PaintOptions: TVTInternalPaintOptions; PixelFormat: TPixelFormat = pfDevice); override; 
    end; 

implementation 

{ TVirtualStringTree } 

procedure TVirtualStringTree.PaintTree(TargetCanvas: TCanvas; Window: TRect; 
    Target: TPoint; PaintOptions: TVTInternalPaintOptions; 
    PixelFormat: TPixelFormat); 
var 
    I: Integer; 
    EmptyRect: TRect; 
    PaintInfo: TVTPaintInfo; 
begin 
    inherited; 
    if (poGridLines in PaintOptions) and (toShowHorzGridLines in TreeOptions.PaintOptions) and 
    (GetLastVisible <> nil) then 
    begin 
    EmptyRect := GetDisplayRect(GetLastVisible, 
     Header.Columns[Header.Columns.GetLastVisibleColumn].Index, False); 
    EmptyRect := Rect(ClientRect.Left, EmptyRect.Bottom + DefaultNodeHeight, 
     EmptyRect.Right, ClientRect.Bottom); 
    ZeroMemory(@PaintInfo, SizeOf(PaintInfo)); 
    PaintInfo.Canvas := TargetCanvas; 
    for I := 0 to ((EmptyRect.Bottom - EmptyRect.Top) div DefaultNodeHeight) do 
    begin 
     PaintInfo.Canvas.Font.Color := Colors.GridLineColor; 
     DrawDottedHLine(PaintInfo, EmptyRect.Left, EmptyRect.Right, 
     EmptyRect.Top + (I * DefaultNodeHeight)); 
    end; 
    end; 
end; 

Y aquí el resultado con constante y altura nodo variable:

enter image description here

El problema técnico (las líneas desplazadas desde el lado izquierdo) visibles en la captura de pantalla de arriba es solo una consecuencia de una representación de líneas punteadas. Si configura la propiedad LineStyle en su vista de árbol virtual en lsSolid, verá el resultado correcto.

+2

Ahora mirando el resultado, el rectángulo se desplaza. Lo arreglaré más adelante (tengo que irme ahora). Pero aún así es una solución bastante sucia. – TLama

+0

no sucio en absoluto! eso es realmente muy bueno! ¡muchas gracias! –

+2

Uf, las posiciones de las líneas eran correctas. Fue causado por la representación de líneas punteadas. Sin embargo, hubo un error. Para determinar el límite correcto de la línea, estaba usando la columna con el índice 'Header.Columns.Count - 1' que era incorrecto. Si tuviera, por ejemplo, 2 columnas y movido el segundo a la primera posición, el índice que debería usar (el índice de la columna más a la derecha) era 0, no 1 (lo que era 'Header.Columns.Count - 1'). Ahora estoy usando para esa 'GetLastVisibleColumn' cuál debería ser la manera correcta. – TLama

Cuestiones relacionadas