2014-12-03 16 views
8

Sto tentando di creare una vista in TVirtualStringTree che sarà simile a qualcosa di simile:VirtualTreeView - colore diverso di testo nello stesso nodo

Folder view with different font colors

Nell'esempio precedente ho mostrato alcuni dei possibili scenari che voglio raggiungere. FolderA ha il testo in grassetto e dopo il testo in grassetto di colore rosso appena dietro di esso nello stesso nodo. Sto cercando il modo di realizzare questo tipo di output.

Tuttavia, se questo è troppo duro o troppo problematico per creare, sarei felice con FolderB o FolderC tipo di output - che potrebbe probabilmente essere fatta con 2 colonne, una contenente il nome della cartella e un altro contenente il conteggio dei file all'interno.

FolderD è qui solo come esempio di una cartella senza file e l'output per quella cartella (il testo è non piegato e non c'è numero).

Sto cercando tutte le indicazioni su come effettuare questo effetto in quanto sembra che VirtualTreeView possa avere solo un colore o un'impostazione grassetto per un nodo. Qualsiasi suggerimento o suggerimento su come spostarsi nella direzione di FolderA o FolderB o FolderC molto apprezzato quindi ho un punto di partenza. Gli esempi di Delphi o C++ Builder sono entrambi benvenuti (il codice finale sarà comunque in C++ Builder).

+1

è possibile gestire l'evento 'OnMeasureTextWidth' per fornire la larghezza complessiva del testo e renderizza entrambi i testi nel gestore di eventi 'OnDrawText'. Ma personalmente utilizzerei 2 colonne, che consentirebbero agli utenti di vedere sempre il conteggio. – TLama

+0

@TLama Concordo sul fatto che 2 colonne abbia i suoi vantaggi ed è probabile che lo cambierò in seguito. Ma in questo momento ho bisogno di una soluzione rapida e 'toShowStaticText' fa esattamente questo. È spiacevole che io possa accettare solo una risposta in quanto entrambe le risposte sono buone soluzioni. – Coder12345

+1

I ['non vedo comunque '] (http://pastebin.com/4G9TzSHL) più complicato nel gestire il' OnPaintText' e accendere 'Column' in caso di due colonne. – TLama

risposta

12

Si potrebbe semplicemente utilizzare il toShowStaticText (StringOptions) opzione:

implementation 

type 
    PNodeRec = ^TNodeRec; 
    TNodeRec = record 
    Name: WideString; 
    Count: Integer; 
    IsBold: Boolean; 
    end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    Node: PVirtualNode; 
    NodeRec: PNodeRec; 
    I: Integer; 
begin 
    VirtualStringTree1.TreeOptions.StringOptions := 
    VirtualStringTree1.TreeOptions.StringOptions + [toShowStaticText]; 
    VirtualStringTree1.NodeDataSize := Sizeof(TNodeRec); 
    // Populate some data 
    for I := 1 to 10 do 
    begin 
    Node := VirtualStringTree1.AddChild(nil); 
    NodeRec := VirtualStringTree1.GetNodeData(Node); 
    Initialize(NodeRec^); 
    NodeRec.Name := 'Node' + IntToStr(I); 
    NodeRec.Count := I; 
    NodeRec.IsBold := I mod 2 = 0; 
    end; 
end; 

procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; 
    Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; 
    var CellText: WideString); 
var 
    NodeRec: PNodeRec; 
begin 
    NodeRec := PNodeRec(TVirtualStringTree(Sender).GetNodeData(Node)); 
    if TextType = ttNormal then 
    CellText := NodeRec^.Name 
    else // ttStatic 
    CellText := Format('(%d)', [NodeRec^.Count]); 
end; 

procedure TForm1.VirtualStringTree1PaintText(Sender: TBaseVirtualTree; 
    const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; 
    TextType: TVSTTextType); 
var 
    NodeRec: PNodeRec; 
begin 
    NodeRec := PNodeRec(TVirtualStringTree(Sender).GetNodeData(Node)); 
    if TextType = ttNormal then 
    begin 
    if NodeRec^.IsBold then 
     TargetCanvas.Font.Style := TargetCanvas.Font.Style + [fsBold]; 
    end 
    else // ttStatic 
    TargetCanvas.Font.Color := clRed; 
end; 

uscita:

enter image description here

+0

Era troppo semplice! L'ho appena provato e funziona alla grande, grazie mille! L'unico problema minore che ho ora è che la parte statica è un po 'troppo sul lato destro (come uno spazio extra o così). Anche questo margine sinistro del 'ttStatic' (o margine destro di' ttNormal') può essere regolato? – Coder12345

+1

Non sono a conoscenza di una funzione build-in come questa (ma sto anche utilizzando una versione piuttosto vecchia di VT). È possibile gestire il disegno sull'evento 'PaintText' (e non gestire' GetText' per 'ttStatic'). hai il 'Canvas' +' TargetCanvas'. posiziona il testo come desideri. – kobik

+3

+ hai la proprietà 'TextMargin'. che influirà sul testo normale e statico. – kobik

Problemi correlati