2012-10-02 4 views
13

Betrachten Sie die folgende sehr einfache Einheit:Wie kann ich eine Baumansicht neu überdenken, ob eine horizontale Bildlaufleiste benötigt wird?

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 

hinzufügen Zu einer VCL-Formular App und ausgeführt werden. Das Ergebnis sieht wie folgt aus:

enter image description here

Ich möchte mich für die horizontale Bildlaufleiste nicht angezeigt werden. Wie kann ich das erreichen?

Jetzt erkenne ich, dass ich die Codezeile entfernen konnte, die die sehr lange Zeichenfolge zuweist. Aber das ist ein reduziertes Programm für meine Frage. In the real app the text of the nodes is changing und ich möchte die Bildlaufleisten zeigen, wenn sie benötigt werden, und nicht zeigen, wenn sie nicht benötigt werden.

Ich weiß über die TVS_NOHSCROLL Art, aber ich kann das nicht verwenden. Manchmal enthält die Baumansicht Text, der breiter ist als der verfügbare Platz. Und manchmal nicht.

Ich möchte auch TTreeView verwenden und nicht virtuelle Baumansicht verwenden möchten. Nicht, dass ich etwas gegen die virtuelle Baumansicht habe, nur dass meine App gerade TTreeView verwendet.

Antwort

16

Sehr einfach, verwenden Sie TreeView1.Items.BeginUpdate/EndUpdate Methoden und die Bildlaufleiste wird entsprechend berechnet.

wie folgt aus:

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

Dank. Nur die Arbeit. Es ist das 'WM_SETREDRAW (1, 0)' in 'EndUpdate', das die Arbeit erledigt. Nicht ganz sicher, warum es die Wirkung hat. –

+1

Relavent Raymond Chen: [Es gibt eine Standardimplementierung für WM_SETREDRAW, aber möglicherweise können Sie es besser machen] (http://blogs.msdn.com/b/oldnewthing/archive/2011/01/24/10119211.aspx) –

Verwandte Themen