2012-10-02 6 views
13

Si consideri il seguente unità molto semplice:Come posso fare una visualizzazione ad albero ripensare se è necessaria o meno una barra di scorrimento orizzontale?

Unit1.pas

unit Unit1; 

interface 

uses 
    Windows, Classes, Controls, Forms, ComCtrls; 

type 
    TForm1 = class(TForm) 
    TreeView1: TTreeView; 
    procedure FormCreate(Sender: TObject); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

const 
    SLongString = 'blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah'; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    Node: TTreeNode; 
begin 
    TreeView1.Width := 200; 
    Node := TreeView1.Items.Add(nil, SLongString); 
    Node.Text := 'blah'; 
end; 

end. 

Unit1.dfm

object Form1: TForm1 
    ClientHeight = 137 
    ClientWidth = 216 
    OnCreate = FormCreate 
    PixelsPerInch = 96 
    TextHeight = 13 
    object TreeView1: TTreeView 
    Left = 8 
    Top = 8 
    Width = 198 
    Height = 121 
    end 
end 

Aggiungere ad un VCL forme di APP ed eseguire. Il risultato è simile al seguente:

enter image description here

Vorrei per la barra di scorrimento orizzontale per non essere visibile. Come posso raggiungere questo obiettivo?

Ora mi rendo conto che è possibile rimuovere la riga di codice che assegna la stringa molto lunga. Ma questo è un programma ridotto per lo scopo della mia domanda. In the real app the text of the nodes is changing e voglio che le barre di scorrimento mostrino se sono necessarie e non mostrano se non sono necessarie.

Conosco lo stile TVS_NOHSCROLL ma non riesco a usarlo. A volte la vista ad albero contiene del testo che è più ampio dello spazio disponibile. E a volte no.

Voglio anche utilizzare TTreeView e non voglio utilizzare la visualizzazione ad albero virtuale. Non che io abbia qualcosa contro la visualizzazione ad albero virtuale, solo che la mia app sta attualmente utilizzando TTreeView.

risposta

16

Molto semplice, utilizzare i metodi TreeView1.Items.BeginUpdate/EndUpdate e la barra di scorrimento verrà calcolata di conseguenza.

come questo:

... 
TreeView1.Items.BeginUpdate; 
// change your nodes here 
TreeView1.Items.EndUpdate 
+4

Grazie. Proprio il lavoro. È il 'WM_SETREDRAW (1, 0)' in 'EndUpdate' che fa il lavoro. Non so esattamente perché ha l'effetto. –

+1

Relavent Raymond Chen: [Esiste un'implementazione predefinita per WM_SETREDRAW, ma potresti riuscire a fare meglio] (http://blogs.msdn.com/b/oldnewthing/archive/2011/01/24/10119211.aspx) –

Problemi correlati