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:
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:
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.
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
no sucio en absoluto! eso es realmente muy bueno! ¡muchas gracias! –
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