2012-04-06 12 views
6

मैंने टीवीर्टुअलस्ट्रिंग ट्री का उपयोग कैसे किया है, और मुझे यह उत्कृष्ट मिला है। मेरे पास पैकडलिस्ट नामक एक कस्टम गैर-विज़ुअल सूची है जो किसी अन्य थ्रेड से भरी हुई है। और मैं रीयलटाइम पर TVirtualStringTree में सभी सूची सामग्री दिखाना चाहता हूं। इसलिए मैंने हेक्सलोग्स (जो टीवीर्टुअलस्ट्रिंग ट्री है) रूट 500 कोड प्रत्येक 500ms अपडेट करने के लिए मुख्य प्रारूप पर एक टाइमर लगाया।टीवीर्टुअल स्ट्रिंगट्री और वर्टिकल स्क्रॉल ठीक से काम नहीं कर रहा है

मेरा सभी डेटा वर्चुअलस्ट्रिंगट्री पर दिखाई देता है, और मेरे पास कोई गति समस्या नहीं है, बहुत अच्छी है। लेकिन वर्टिकल स्क्रॉल बार के साथ एक समस्या है। जब मैं सूची के अंत तक कूदने के लिए नियंत्रण पर Ctrl + End दबाता हूं, तो यह कहीं बीच में जाता है। इसी प्रकार जब मैं अंत में स्क्रॉल बार खींचता हूं, तो यह अंत तक नहीं जाता है। लेकिन हेक्सलॉग डेटाकाउंट जानता है। यह अंत तक क्यों नहीं कूदता है? अगर मैं Ctrl + END को दो बार दबाता हूं तो यह अंत तक पहुंच जाता है।

टाइमर दिनचर्या के अंदर, मैं कोड द्वारा सूची के अंत तक कूदने के लिए हेक्सलॉग कहना चाहता हूं। मैं यह कैसे कर सकता हूं और वर्टिकल स्क्रॉल बार को सही तरीके से कैसे संभालना है?

procedure TMainForm.StatusUpdateTimerTimer(Sender: TObject); 
begin 
    if (FirpList.ComOperationCount > 0) and (PacketList.Items.Count <> FirpList.ComOperationCount) then 
    begin 
     HexLog.RootNodeCount := PacketList.Items.Count; 
    end; 
end; 

procedure TMainForm.HexLogMeasureItem(Sender: TBaseVirtualTree; 
    TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer); 
begin 
    if Sender.MultiLine[Node] then 
    begin 
    TargetCanvas.Font := Sender.Font; 
    NodeHeight := HexLog.ComputeNodeHeight(TargetCanvas, Node, 1, FirpList.ComOperations[Node^.Parent^.Index].DataAsHexString(FAppSettings.HexLogColumnCharWidth) + #13#10); 
    end; 
end; 

Appearance of HexLog

सुझाए जबाब TLama द्वारा ठीक से काम नहीं कर रहा है, विवरण के लिए छवि देखें: http://i43.tinypic.com/1445thi.png

उत्तर

6

के लिए कूद करने के लिए: TLama solution is not working

विस्तृत छवि विवरण के लिए कि लिंक देखें पेड़ के अंत, ScrollIntoView(GetLast) पर कॉल करें।

किसी विशेष नोड पर स्क्रॉल करने के लिए, नियंत्रण को सभी पूर्व नोड्स की ऊंचाइयों को जोड़ने की आवश्यकता होती है ताकि यह उचित ऑफसेट निर्धारित कर सके।

आपके नोड्स में अलग-अलग ऊंचाई हैं। यदि आप कहीं नोड्स की वास्तविक ऊंचाइयों को प्रारंभ नहीं कर रहे हैं, तो नियंत्रण किसी भी प्रारंभिक नोड्स के लिए DefaultNodeHeight संपत्ति का उपयोग करता है। ऐसा लगता है कि ऊंचाई आपके पेड़ में किसी भी वास्तविक नोड ऊंचाई से कम है, इसलिए नियंत्रण अपेक्षित से कम ऑफसेट की गणना समाप्त होता है, और जहां आप इरादा रखते हैं वहां स्क्रॉल करते हैं।

सुनिश्चित करें कि आप OnMeasureItem ईवेंट को प्रबंधित कर रहे हैं, और आपके पास Options.MiscOptions में toVariableNodeHeight विकल्प सेट है। यदि आप नहीं करते हैं, तो नियंत्रण केवल प्रत्येक नोड के लिए वर्तमान में निर्दिष्ट ऊंचाई का उपयोग करेगा, और किसी भी प्रारंभिक नोड के लिए डिफ़ॉल्ट ऊंचाई का उपयोग करेगा।

यदि आप toVariableNodeHeight को सेट करने और OnMeasureItem को संभालने के बजाय मैन्युअल रूप से NodeHeight असाइन करते हैं तो आप यहां व्यवहार कर सकते हैं।

+0

हाय रॉब, मेरे पास मल्टीलाइन बाल ऊंचाई की गणना करने के लिए MeasureItem पर हैंडलर है। ToVariableNodeHeight MiscOptions पर सेट नहीं किया गया था। मैंने इसे सच बना दिया और अब ScrollIntoView() अंत में ठीक से कूदता है। लेकिन यह थोड़ा नीचे स्क्रॉल करता है और अंत तक पहुंचने के लिए लगभग 2 सेकंड लेता है जो स्वीकार्य नहीं है:/ –

+0

सभी नए नोड्स की ऊंचाइयों की गणना के अलावा, अंतिम नोड के ऑफसेट की गणना करने में समय लगेगा, यदि नोड-स्थिति कैश मान्य नहीं था। 'GetDisplayRect' में ब्रेकपॉइंट सेट करें और देखें कि जब आप' ScrollIntoView' 'कॉल करते हैं तो आप 'tsUseCache' स्थिति में हैं या नहीं। जब कैश वैध होता है, तो पेड़ नोड्स के स्थानों को बहुत तेज़ी से पा सकता है, लेकिन नोड्स की संख्या बदलने से कैश को अमान्य कर दिया जाता है। कार्यकर्ता थ्रेड को फिर से सत्यापित करने के लिए समय की आवश्यकता होती है। –

+0

(FStates में tsUseCache) GetDisplayRect() फ़ंक्शन में स्थिति स्क्रॉलइंटव्यू() को कॉल करते समय झूठी रिटर्न देता है। अब मुझे क्या करना चाहिए? इस प्रोजेक्ट के लिए, मैं रिचएडिट नियंत्रण का उपयोग कर रहा था, क्योंकि मुझे सामना की जाने वाली गति समस्याओं के कारण, मैंने वर्चुअलस्ट्रिंग ट्री का उपयोग करने के लिए सभी डिज़ाइन बदल दिए।अब फिर मैं एक ही बिंदु पर हूं:/वास्तव में मुझे समझने में कठिनाइयों का सामना करना पड़ रहा है कि मुझे सूची के अंत तक कूदने के लिए पूरे संदेशों की ऊंचाई की गणना करने की आवश्यकता क्यों है। डेटा लेनदेन सक्रिय होने पर मैं बस हर 500ms उपयोगकर्ता को अंतिम संदेश दिखाना चाहता हूं। –

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