2012-10-02 13 views
13

Rozważmy następujący bardzo proste urządzenie:Jak mogę przywrócić widok drzewa, czy potrzebny jest poziomy pasek przewijania?

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 

Dodaj to do VCL Forms aplikację i uruchomić. Wynik wygląda tak:

enter image description here

chciałbym do poziomego paska przewijania, aby nie być wyświetlane. Jak mogę to osiągnąć?

Teraz zdaję sobie sprawę, że mogę usunąć linię kodu, która przypisuje bardzo długi ciąg. Ale jest to uproszczony program na potrzeby mojego pytania. W the real app the text of the nodes is changing i chcę, aby paski przewijania pokazywały, czy są potrzebne i nie pokazują, czy nie są potrzebne.

Wiem o stylu TVS_NOHSCROLL, ale nie mogę tego użyć. Czasami widok drzewa zawiera tekst, który jest szerszy niż dostępna przestrzeń. A czasami nie.

Chcę również użyć TTreeView i nie chcę używać widoku drzewa wirtualnego. Nie chodzi o to, że mam coś przeciwko wirtualnemu widokowi drzewa, tylko że moja aplikacja używa obecnie TTreeView.

Odpowiedz

16

Bardzo proste, użyj metod i paska przewijania zostanie odpowiednio obliczona.

tak:

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

Dzięki. Poprostu praca. To 'WM_SETREDRAW (1, 0)' w 'EndUpdate', który wykonuje pracę. Nie do końca wiem, dlaczego ma to wpływ. –

+1

Relavent Raymond Chen: [Istnieje domyślna implementacja WM_SETREDRAW, ale możesz być w stanie zrobić to lepiej] (http://blogs.msdn.com/b/oldnewthing/archive/2011/01/24/10119211.aspx) –

Powiązane problemy