2011-12-06 15 views
6

क्या विस्तार और संकुचित छवि को बदलने के लिए मानक TTreeView का उपयोग करना संभव है?TTreeView - बदलें विस्तृत करें और छवि को संकुचित करें?

मैं नोड छवियों मतलब नहीं है, मैं नोड्स कि, बच्चे हैं तो तरह के बगल में छोटे ऐरो का अर्थ है:

enter image description here

आदर्श रूप में मैं तीर के रूप में + और दिखाना चाहते हैं - चिह्न, डेल्फी घटक संरचना वृक्ष की तरह:

enter image description here

यदि यह इस बदलना संभव है, मैं इसे कैसे करने के बारे में जाना होगा?

कार्य डेमो डेविड के जवाब

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. 

परिणाम के आधार पर:

बाद विस्टा Windows में

enter image description here

उत्तर

9

ट्री विचारों दो वैकल्पिक विषयों की है। जिस थीम को आप टालना चाहते हैं उसे एक्सप्लोरर थीम के रूप में जाना जाता है। आप मानक विषय का उपयोग करना चाहते हैं। एक्सप्लोरर थीम प्राप्त करने के लिए एक नियंत्रण को ऑप्ट-इन करना पड़ता है। यह SetWindowTheme एपीआई के माध्यम से ऐसा करता है। वीसीएल ट्री व्यू कंट्रोल इसे ऑप्ट-इन करने के लिए कहता है। यह CreateWnd विधि के अंत में ऐसा करता है।

आप इस तरह परिवर्तन नाश द्वारा मानक विषय पर वापस लौटने कर सकते हैं:

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; 

इस कोड XE2 के लिए लिखा है। यदि आपके पास पहले डेल्फी है तो मुझे लगता है कि आप इसे इस तरह चाहते हैं:

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

बहुत जानकार :) मुझे आपके पोस्ट किए गए समाधान के उत्तरार्द्ध का प्रयास करना होगा .. –

+0

आप इसे परीक्षण करने के लिए केवल ऑनक्रेट फॉर्म से फ़ंक्शन को कॉल कर सकते हैं। CreateWnd दृष्टिकोण वह है जिसे आपको "इसे सही करने" की आवश्यकता होती है। –

+0

बहुत अच्छा काम करता है, मैं शीर्ष पोस्ट को संपादित करूंगा कि मैंने आपका जवाब कैसे कार्यान्वित किया। –

3

मैं डेविड्स के उत्तर के अलावा। निम्नलिखित कोड को कुछ अतिरिक्त इकाई में रखें और इसे कॉमक्रिट यूनिट के बाद उपयोग में जोड़ें। इस तरह आप मानक TTreeView का उपयोग कर सकते हैं और जब भी चाहें थीम बदल सकते हैं। या यदि आप चाहें तो इसे अपने पैकेज में पंजीकृत करें।

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; 

कभी डेल्फी संस्करणों में आप अतिरिक्त विरासत से बचने के लिए कक्षा सहायक का उपयोग भी कर सकते हैं।

+0

CreateWnd में ऐसा करना महत्वपूर्ण है क्योंकि विंडो हैंडल को फिर से बनाया जा सकता है। –

+1

यह एक वर्ग सहायक नहीं है। क्लास हेल्पर्स विशिष्ट कोड निर्माण होते हैं (थेलप्लेक्लास के लिए थेलपर = क्लास हेल्पर टाइप करें या कुछ ऐसे, मुझे यहां सटीक सिंटैक्स का यकीन नहीं है, क्योंकि मैं उनका अधिक उपयोग नहीं करता हूं)। आप अपने उदाहरण में क्या कर रहे हैं आम तौर पर 'इंटरसेप्टर क्लास' के रूप में जाना जाता है। –

+0

@ मारजन सही। और क्या अधिक है, यदि आप एक इंटरसेप्टर का उपयोग करने जा रहे हैं तो 'CreateWnd' ओवरराइड के लिए आसानी से उपलब्ध है। –

संबंधित मुद्दे