2012-11-10 9 views
5

निम्न कोड का उद्देश्य ReadOnly RichTextBox में टेक्स्ट बफर को बनाए रखने का लक्ष्य है, जिसमें अधिकतम वर्णित वर्ण हैं, और हमेशा नीचे स्क्रॉल किए जाते हैं। यह एक रीयलटाइम लॉग स्ट्रीम करता है।मैं केवल पढ़ने के लिए RichTextBox से प्रोग्राम को हटा सकता हूं?

लेकिन अधिकतम वर्ण संख्या बनाए रखने के लिए मेरे प्रयास में, rtMessages.TextLength()rtMessages.SelectedText = String.Empty और इसके परिणामस्वरूप के बाद से बदल रहा है, बचाव की मुद्रा में If ब्लॉक के बिना, मैं बार-बार बफर की पहली पंक्ति को हटाने का प्रयास अनंत लूप को रखना होगा ।

जब मैं ReadOnly-RichTextBox कीता को हटा देता हूं, तो यह कार्यक्षमता सफल होती है। AppendText सफल होने के बाद से थोड़ा अजीब लगता है, लेकिन मैं समझता हूं कि चयन एक अलग जानवर है।

मैं इसे बना सकते हैं तो एक ReadOnlyRichTextBoxप्रोग्राम के रूप में परिवर्तनीय है कि?

Private Sub onNewData(ByRef data As String) Handles _server.clientSentData 

    ' Add new text 
    rtMessages.SelectionStart = rtMessages.TextLength() 
    rtMessages.AppendText(data) 

    ' Delete oldest text line-by-line until the whole buffer is shorter than MAX_TEXT_LENGTH characters 
    Const MAX_TEXT_LENGTH = 200 
    Dim textLength = rtMessages.TextLength() 
    While textLength > MAX_TEXT_LENGTH 
     Dim i As Int16 = 0 
     Do While rtMessages.GetLineFromCharIndex(i) < 1 
      i += 1 
     Loop 

     rtMessages.Select() 
     rtMessages.SelectionStart = 0 
     rtMessages.SelectionLength = i 
     rtMessages.SelectedText = String.Empty 
     rtMessages.SelectionLength = 0 

     If rtMessages.TextLength() = textLength Then 
      rtMessages.Clear() 
      rtMessages.AppendText("[buffer trimming algorithm failed]") 
      Exit While 
     End If 

     textLength = rtMessages.TextLength() 
    End While 

    ' Scroll down 
    rtMessages.SelectionStart = rtMessages.TextLength() 
    rtMessages.ScrollToCaret() 
End Sub 
+0

मैं पुष्टि कर सकता हूं कि यह 'सब' यूआई थ्रेड पर लगाया जा रहा है, कुछ कॉमम्स थ्रेड नहीं। –

+1

+1 क्योंकि समस्या उतनी आसान नहीं है जितनी दिखती है ... मैं अनुमान लगाता हूं कि किसी ने इसे पहले कभी नहीं बताया है। –

उत्तर

2

, SelectedRtf करता है का उपयोग करते हुए कार्य:

'rtMessages.Select() 
    'rtMessages.SelectionStart = 0 
    'rtMessages.SelectionLength = i 
    'rtMessages.SelectedText = String.Empty 
    'rtMessages.SelectionLength = 0 

    rtMessages.Select(0, i) 
    rtMessages.SelectedRtf = "{\rtf1\ansi}" 
+0

क्या मैं बफर की शुरुआत में '{\ rtf1 \ ansi}' कोडपॉइंट्स के एक टन के साथ समाप्त हो जाऊंगा, या वे पतन/elided हो जाएगा? –

+0

@ लाइटनेसरेसेसिन ऑर्बिट वे elided जाएगा। आरटीबी आरटीएफ दस्तावेजों को "विलय" करता है। – LarsTech

+0

वैसे हम वहां जाते हैं :) धन्यवाद –

0
rtMessages.SelectionLength = i - 1 

द्वारा

rtMessages.SelectionLength = i 

संपादित करें # 1

प्रतिस्थापित किया जाना चाहिए जोड़ने -1 SelectionLength के लिए, आप पहली पंक्ति का अंतिम वर्ण भूल रहे हैं। दूसरे भाग पर, केवल 1 वर्ण पहली पंक्ति पर होगा (जिस पर आप पहले रन पर चूक गए थे)। फिर आप 0 के चयन लम्बाई को हटाने का प्रयास करेंगे और आपको हर दूसरे रन के लिए एक ही टेक्स्ट लम्बाई मिल जाएगी और वहां आप अनंत लूप के साथ जाते हैं!

+0

आप सही हैं। हालांकि, समस्या का कारण नहीं है। –

+0

क्या आप निश्चित हैं? मैंने अपनी तरफ से अपनी बग को दोबारा बनाया और इस लाइन को बदलने के लिए मेरे लिए चाल बनाई। –

+0

जब मैं कोड बदलता हूं तब तक बग तब तक बना रहता है जब तक कि मैं 'केवल पढ़ने' को बंद नहीं करता।और हर पुनरावृत्ति ने मुझे वही टेक्स्ट लम्बाई दी, पहले को छोड़कर हर पुनरावृत्ति नहीं। –

0

आप केवल-पढ़ने वाले पैरामीटर को हटा सकते हैं, अपना एपेंडेक्स्ट कोड लिख सकते हैं और फिर समृद्ध टेक्स्टबॉक्स को फिर से पढ़ सकते हैं।

0

मैं जानता हूँ कि यह एक पुरानी धागा है, लेकिन आप ReadOnly समस्या के समाधान की जगह निम्नलिखित कोड प्राप्त कर सकते हैं:

rtMessages.Select() 
rtMessages.SelectionStart = 0 
rtMessages.SelectionLength = i 
rtMessages.SelectedText = String.Empty 
rtMessages.SelectionLength = 0 
इस के साथ

:

rtMessages.Text = rtMessages.Text.Substring(i) 

मैं इस करता है, तो यकीन नहीं है बेहतर या खराब प्रदर्शन है, लेकिन यह RichTextBox के आसपास ReadOnly

संपादित करें:

यहाँ पूरा यह परीक्षण करने के लिए इस्तेमाल किया कोड है (नोट: मैं परीक्षण के लिए एक Button.Click पर कोड जोड़ दिया) एक ReadOnly RichTextBox में SelectedText को बदलने के लिए काम नहीं करता है का प्रयास करते समय

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Static X As Integer = 0 
    X += 1 

    Dim Data As String = "Line " & X.ToString & ControlChars.NewLine 
    Me.onNewData(Data) 
End Sub 

Private Sub onNewData(ByRef data As String) 

    ' Add new text 
    rtMessages.SelectionStart = rtMessages.TextLength() 
    rtMessages.AppendText(data) 

    ' Delete oldest text line-by-line until the whole buffer is shorter than MAX_TEXT_LENGTH characters 
    Const MAX_TEXT_LENGTH As Integer = 200 
    Dim textLength As Integer = rtMessages.TextLength() 
    While textLength > MAX_TEXT_LENGTH 
     Dim i As Integer = 0 
     Do While rtMessages.GetLineFromCharIndex(i) < 1 
      i += 1 
     Loop 

     'rtMessages.Select() 
     'rtMessages.SelectionStart = 0 
     'rtMessages.SelectionLength = i 
     'rtMessages.SelectedText = String.Empty 
     'rtMessages.SelectionLength = 0 

     rtMessages.Text = rtMessages.Text.Substring(i) 

     If rtMessages.TextLength() = textLength Then 
      rtMessages.Clear() 
      rtMessages.AppendText("[buffer trimming algorithm failed]") 
      Exit While 
     End If 

     textLength = rtMessages.TextLength() 
    End While 

    ' Scroll down 
    rtMessages.SelectionStart = rtMessages.TextLength() 
    rtMessages.ScrollToCaret() 

End Sub 
+0

कुछ मामलों में एक व्यवहार्य कामकाज, मुझे लगता है, लेकिन मेरा बफर बड़ा था; यह वर्तमान स्क्रॉल स्थिति भी तोड़ता है। –

+0

@LightnessRacesinOrbit, स्क्रॉल स्थिति को 'rtMessages.SelectionStart = rtMessages.TextLength()' और 'rtMessages.ScrollToCaret()' द्वारा रीसेट नहीं किया जा रहा है? मेरे परीक्षणों में यह ठीक स्क्रॉल कर रहा था। आप किस आकार का बफर इस्तेमाल करते हैं? – Grahamvs

+0

मेरे पास वास्तव में कोड नहीं है इसलिए यह स्मृति से अनुमान है, लेकिन मेरी याददाश्त कहती है कि पूरे टेक्स्ट बफर को नए टेक्स्ट के साथ बदलना पुरानी स्क्रॉल स्थिति खो देता है। क्या ऐसा नहीं है? बफर 10 केबी तक होगा या इसलिए आईआईआरसी होगा। –

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

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