मैंने टीवीर्टुअलस्ट्रिंग ट्री का उपयोग कैसे किया है, और मुझे यह उत्कृष्ट मिला है। मेरे पास पैकडलिस्ट नामक एक कस्टम गैर-विज़ुअल सूची है जो किसी अन्य थ्रेड से भरी हुई है। और मैं रीयलटाइम पर 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;
सुझाए जबाब TLama द्वारा ठीक से काम नहीं कर रहा है, विवरण के लिए छवि देखें: http://i43.tinypic.com/1445thi.png
हाय रॉब, मेरे पास मल्टीलाइन बाल ऊंचाई की गणना करने के लिए MeasureItem पर हैंडलर है। ToVariableNodeHeight MiscOptions पर सेट नहीं किया गया था। मैंने इसे सच बना दिया और अब ScrollIntoView() अंत में ठीक से कूदता है। लेकिन यह थोड़ा नीचे स्क्रॉल करता है और अंत तक पहुंचने के लिए लगभग 2 सेकंड लेता है जो स्वीकार्य नहीं है:/ –
सभी नए नोड्स की ऊंचाइयों की गणना के अलावा, अंतिम नोड के ऑफसेट की गणना करने में समय लगेगा, यदि नोड-स्थिति कैश मान्य नहीं था। 'GetDisplayRect' में ब्रेकपॉइंट सेट करें और देखें कि जब आप' ScrollIntoView' 'कॉल करते हैं तो आप 'tsUseCache' स्थिति में हैं या नहीं। जब कैश वैध होता है, तो पेड़ नोड्स के स्थानों को बहुत तेज़ी से पा सकता है, लेकिन नोड्स की संख्या बदलने से कैश को अमान्य कर दिया जाता है। कार्यकर्ता थ्रेड को फिर से सत्यापित करने के लिए समय की आवश्यकता होती है। –
(FStates में tsUseCache) GetDisplayRect() फ़ंक्शन में स्थिति स्क्रॉलइंटव्यू() को कॉल करते समय झूठी रिटर्न देता है। अब मुझे क्या करना चाहिए? इस प्रोजेक्ट के लिए, मैं रिचएडिट नियंत्रण का उपयोग कर रहा था, क्योंकि मुझे सामना की जाने वाली गति समस्याओं के कारण, मैंने वर्चुअलस्ट्रिंग ट्री का उपयोग करने के लिए सभी डिज़ाइन बदल दिए।अब फिर मैं एक ही बिंदु पर हूं:/वास्तव में मुझे समझने में कठिनाइयों का सामना करना पड़ रहा है कि मुझे सूची के अंत तक कूदने के लिए पूरे संदेशों की ऊंचाई की गणना करने की आवश्यकता क्यों है। डेटा लेनदेन सक्रिय होने पर मैं बस हर 500ms उपयोगकर्ता को अंतिम संदेश दिखाना चाहता हूं। –