2012-06-25 10 views
5

मैं डेल्फी 7.मैं उन नोड्स के लिए वर्चुअल ट्री-व्यू ग्रिड लाइन कैसे दिखा सकता हूं जो अभी तक मौजूद नहीं हैं?

में SoftGem के VirtualStringTree का उपयोग वहाँ पूर्ण ग्रिड लाइन (सिर्फ एक TListView के रूप में) सक्षम करने के लिए कोई तरीका है? मुझे केवल toShowHorzGridLines मिल सकता है, जो केवल वर्तमान नोड्स के लिए लाइन दिखाता है, नीचे खाली जगह में कुछ भी नहीं, और toShowVertGridLines, जो केवल लंबवत रेखाएं दिखाता है।

आइटम जोड़े जाने से पहले मैं उन्हें खाली स्थान में कैसे दिखा सकता हूं?

उत्तर

5

मुझे नहीं लगता कि PaintTree विधि को संशोधित किए बिना इसे कार्यान्वित करने का एक आसान तरीका है क्योंकि नोड घटनाओं में से कोई भी नहीं निकालया जा सकता है क्योंकि नोड जिनकी रेखाएं खींची जानी चाहिए, अभी तक मौजूद नहीं है।

यहां गंदे तरीके निम्नतम दृश्यमान नोड के आधार पर क्षैतिज रेखाओं को अतिरिक्त रूप से आकर्षित करने के लिए कैसे है। वास्तव में यह इस स्क्रीनशॉट में नारंगी रंग से भरा क्षेत्र में DefaultNodeHeight मूल्य की दूरी के साथ लाइनों ड्रॉ:

enter image description here

यहाँ कोड है:

type 
    TVirtualStringTree = class(VirtualTrees.TVirtualStringTree) 
    public 
    procedure PaintTree(TargetCanvas: TCanvas; Window: TRect; Target: TPoint; 
     PaintOptions: TVTInternalPaintOptions; PixelFormat: TPixelFormat = pfDevice); override; 
    end; 

implementation 

{ TVirtualStringTree } 

procedure TVirtualStringTree.PaintTree(TargetCanvas: TCanvas; Window: TRect; 
    Target: TPoint; PaintOptions: TVTInternalPaintOptions; 
    PixelFormat: TPixelFormat); 
var 
    I: Integer; 
    EmptyRect: TRect; 
    PaintInfo: TVTPaintInfo; 
begin 
    inherited; 
    if (poGridLines in PaintOptions) and (toShowHorzGridLines in TreeOptions.PaintOptions) and 
    (GetLastVisible <> nil) then 
    begin 
    EmptyRect := GetDisplayRect(GetLastVisible, 
     Header.Columns[Header.Columns.GetLastVisibleColumn].Index, False); 
    EmptyRect := Rect(ClientRect.Left, EmptyRect.Bottom + DefaultNodeHeight, 
     EmptyRect.Right, ClientRect.Bottom); 
    ZeroMemory(@PaintInfo, SizeOf(PaintInfo)); 
    PaintInfo.Canvas := TargetCanvas; 
    for I := 0 to ((EmptyRect.Bottom - EmptyRect.Top) div DefaultNodeHeight) do 
    begin 
     PaintInfo.Canvas.Font.Color := Colors.GridLineColor; 
     DrawDottedHLine(PaintInfo, EmptyRect.Left, EmptyRect.Right, 
     EmptyRect.Top + (I * DefaultNodeHeight)); 
    end; 
    end; 
end; 

और यहाँ निरंतर साथ परिणाम और चर नोड ऊंचाई:

enter image description here

गड़बड़ (बाईं तरफ से स्थानांतरित लाइनें) ऊपर स्क्रीनशॉट पर दिखाई देने वाली एक बिंदीदार रेखा प्रतिपादन का एक परिणाम है। यदि आप प्रॉपर्टी को अपने वर्चुअल ट्री व्यू पर lsSolid पर सेट करते हैं तो आपको सही परिणाम दिखाई देगा।

+2

अब परिणाम देखकर आयताकार स्थानांतरित हो गया है। मैं इसे बाद में ठीक कर दूंगा (मुझे अभी जाना है)। लेकिन फिर भी यह काफी गंदे समाधान है। – TLama

+0

बिलकुल गंदा नहीं! वास्तव में बहुत अच्छा है! आपका बहुत बहुत धन्यवाद! –

+2

पुhew, रेखा की स्थिति सही थी। यह बिंदीदार रेखा प्रतिपादन के कारण हुआ था। हालांकि एक बग था। लाइन के दाएं बाउंड को निर्धारित करने के लिए मैं इंडेक्स 'हेडर' कॉलम के साथ कॉलम का उपयोग कर रहा था। गणना - 1' क्या गलत था। यदि आप उदा। 2 कॉलम और दूसरे स्थान को पहली स्थिति में ले जाया गया, इंडेक्स मुझे उपयोग करना चाहिए (सबसे सही कॉलम का सूचकांक) 0 था, 1 नहीं ('हेडर। कॉलम। काउंटर - 1' क्या था)। अब मैं उस 'GetLastVisibleColumn' के लिए उपयोग कर रहा हूं, सही तरीका क्या होना चाहिए। – TLama

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

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