2012-06-25 13 views
5

Io uso VirtualStringTree di SoftGem in Delphi 7.Come visualizzare le linee della griglia con vista ad albero virtuale per nodi che non esistono ancora?

Esiste un modo per consentire linee complete di griglia (proprio come in un TListView)? Posso trovare solo toShowHorzGridLines, che mostra solo le linee per i nodi correnti, non nulla nello spazio vuoto sottostante e toShowVertGridLines, che mostra solo le linee verticali.

Come visualizzarli nello spazio vuoto prima che vengano aggiunti gli articoli?

risposta

5

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:

enter image description here

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:

enter image description here

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.

+2

Ora guardando il risultato, il rettangolo viene spostato. Lo aggiusterò più tardi (devo andare ora). Ma è ancora una soluzione abbastanza sporca. – TLama

+0

non sporco affatto! questo è davvero carino! Grazie mille! –

+2

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

Problemi correlati