Non penso che ci sia un modo semplice per implementare questo senza modificare il metodo PaintTree
poiché nessuno degli eventi del nodo non può essere attivato perché i nodi le cui linee devono essere disegnate semplicemente non esiste ancora.
Ecco un modo sporco come disegnare ulteriormente le linee orizzontali in base al nodo visibile più basso. Infatti disegna linee con la distanza del valore DefaultNodeHeight
nella zona riempito da colore arancione in questo screenshot:
Ecco il codice:
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;
Ed ecco il risultato con costante e altezza nodo variabile:
il glitch (le linee spostate dal lato sinistro) visibili sullo screenshot qui sopra sono solo una conseguenza di un rendering tratteggiato. Se si imposta la proprietà LineStyle
nella visualizzazione ad albero virtuale su lsSolid
, verrà visualizzato il risultato corretto.
Ora guardando il risultato, il rettangolo viene spostato. Lo aggiusterò più tardi (devo andare ora). Ma è ancora una soluzione abbastanza sporca. – TLama
non sporco affatto! questo è davvero carino! Grazie mille! –
Phew, le posizioni di linea erano corrette. È stato causato dal rendering a linee tratteggiate. Tuttavia c'era un bug. Per determinare il limite destro della linea stavo usando la colonna con l'indice 'Header.Columns.Count - 1' che cosa era sbagliato. Se tu avessi per es. 2 colonne e spostato il secondo nella prima posizione, l'indice che dovrei usare (l'indice della colonna più a destra) era 0, non 1 (che era 'Header.Columns.Count - 1'). Ora sto usando per 'GetLastVisibleColumn' quale dovrebbe essere la strada giusta. – TLama