2011-12-06 7 views
6

Genişlet ve daralt görüntünüzü değiştirmek için standart TTreeView kullanarak mümkün mü?TTreeView - Değiştir Genişlet ve Daralt?

Ben Düğüm görüntüleri kastetmiyorum, gelecek, çocuk sahibi şöyle Düğümler küçük oklar demek:

enter image description here

İdeal oklar + gibi göstermek istiyorum - Semboller, Delphi bileşeni yapısı ağacı gibi:

o bunu değiştirmek mümkün olursa

enter image description here

, nasıl yapıyor hakkında gitmek? David'in Yanıt

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, ComCtrls, Themes, uxTheme; 

type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

type 
    TMyTreeView = class(TTreeView) 
    protected 
    procedure CreateWnd; override; 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

{ TMyTreeView } 

procedure TMyTreeView.CreateWnd; 
begin 
    inherited; 
    if ThemeServices.Enabled and CheckWin32Version(6, 0) then 
    SetWindowTheme(Handle, nil, nil); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    MyTree: TMyTreeView; 
    Node: TTreeNode; 
begin 
    MyTree := TMyTreeView.Create(nil); 
    with MyTree do 
    begin 
    Parent := Self; 
    Height := 100; 
    Width := 100; 
    Left := 30; 
    Top  := 30; 

    Node := Items.Add(nil, 'Item'); 
    Items.AddChild(Node, 'Item'); 
    Node := Items.AddChild(Node, 'Item'); 
    Items.AddChild(Node, 'Item'); 
    end; 
end; 

end. 

Sonucu dayalı

Çalışma Demosu: Post-Vista Windows

enter image description here

cevap

9

Ağaç görünümleri iki alternatif temaları var. Kaçınmak istediğiniz tema, kaşif teması olarak bilinir. Standart temayı kullanmak istersiniz. Bir kontrolün kaşif temasını alması gerekiyor. Bunu SetWindowTheme API aracılığıyla yapar. VCL ağaç görünümü kontrolü bunu etkinleştirmek için çağırır. CreateWnd yönteminin sonunda bunu yapar.

Böyle değişikliği geri alıp standart tema dönebilirsiniz:

type 
    TMyTreeView = class(TTreeView) 
    protected 
    procedure CreateWnd; override; 
    end; 

procedure TMyTreeView.CreateWnd; 
begin 
    inherited; 
    if StyleServices.Enabled and TOSVersion.Check(6) and StyleServices.IsSystemStyle then 
    SetWindowTheme(Handle, nil, nil); 
end; 

Bu kod XE2'de için yazılmıştır. Eğer daha önceki bir Delphi'niz varsa, bunu istediğiniz gibi düşünün:

if ThemeServices.Enabled and CheckWin32Version(6, 0) then 
    SetWindowTheme(Handle, nil, nil); 
+0

çok bilgili :) Gönderdiğiniz çözümün ikincisini denemek zorundayım .. –

+0

Test etmek için OnCreate formundaki işlevi çağırmanız yeterlidir. CreateWnd yaklaşımı "doğru yapmak" için ihtiyacınız olan şeydir. –

+0

müthiş çalışıyor, ben cevabınızı nasıl uygulayacağım ile en üstteki yazıyı düzenleyeceğim. –

3

Davids'e ekliyorum. Aşağıdaki kodu bazı ekstra birime koyun ve ComCtrls biriminden sonra kullanıma ekleyin. Bu şekilde standart TTreeView'ı kullanabilir ve temayı istediğiniz zaman değiştirebilirsiniz. İsterseniz isterseniz kendi paketinize kaydedin.

type 
    TTreeView = class(ComCtrls.TTreeView) 
    private 
    procedure SetExplorerTheme(const Value: Boolean); 
    public 
    property ExplorerTheme: Boolean write SetExplorerTheme; 
    end; 

procedure TTreeView.SetExplorerTheme(const Value: Boolean); 
begin 
    if ThemeServices.ThemesEnabled and CheckWin32Version(6, 0) then 
    if Value then 
     SetWindowTheme(Handle, 'Explorer', nil) 
    else 
     SetWindowTheme(Handle, nil, nil); 
end; 

asla Delphi sürümlerinde de ekstra devralma önlemek için bir sınıf yardımcı kullanabilirsiniz.

+0

Bu, CreateWnd'de yapılması önemlidir çünkü pencere tanıtıcısı yeniden oluşturulabilir. –

+1

Bu bir sınıf yardımcı değil. Sınıf yardımcıları özel kod yapısıdır (THelper yazın = THelpedClass için sınıf yardımcısı veya bazılarının burada tam olarak kullanılmadığından emin değilim). Örneğinizde yaptığınız şey genellikle “engelleyici sınıf” olarak bilinir. –

+0

@Marjan Doğru. Ve dahası, eğer bir önleme kullanacaksanız, o zaman 'CreateWnd' geçersiz kılmaya hazırdır. –