2009-11-23 12 views
5

मैंने एक लाइब्रेरी बनाई है जो कंसोल.WriteLine() का उपयोग करके अपने अधिकांश डीबग टेक्स्ट को डंप करता है;Winforms को कंसोल आउटपुट को पुनर्निर्देशित करना ListBox

अब मैं विंडोज़ फॉर्म एप्लिकेशन में लाइब्रेरी का उपयोग करने की प्रक्रिया हूं, और अभी भी कंसोल आउटपुट तक पहुंच की आवश्यकता है। (एक सूची/रिचटेक्स्ट बॉक्स में प्रदर्शित करने के लिए)

मैंने नोट किया कि मैं कंसोल के मानक को टेक्स्टवाइटर पर ओवरराइड कर सकता हूं, लेकिन फिर मैं इस डेटा को डिस्प्ले में कैसे प्राप्त करूंगा।

मैं

public partial class Form1 : Form 
    { 
    Timer T; 
    MemoryStream mem; 
    StreamWriter writer; 


    public Form1() 
    { 

     InitializeComponent(); 
     mem = new MemoryStream(1000); 
     writer = new StreamWriter(mem); 
     Console.SetOut(writer); 

     T = new Timer(); 
     T.Interval = 250; // yes this probally is to short. 
     T.Tick += new EventHandler(T_Tick); 
     T.Start(); 


     Console.WriteLine("output"); 
     Console.WriteLine("AnotherLine"); 
    } 

    void T_Tick(object sender, EventArgs e) 
    { 
     string s = Encoding.Default.GetString(mem.ToArray()); 
     string[] Lines = s.Split(Environment.NewLine.ToCharArray()); 
     Output.Items.Clear(); // Output is a listbox 
     foreach (string str in Lines) 
      Output.Items.Add(str); 
    } 
} 

की तर्ज पर लेकिन कोई लाभ नहीं हुआ कुछ कर की कोशिश की। कोई विचार?

अनइडेड कोड हटा दिया गया।

उत्तर

12

ऐसा करने का एक और संभवतः क्लीनर तरीका टेक्स्टवाइटर को अपने आप के साथ विस्तारित करना है, जहां कहीं भी आप इसे चाहते हैं।

नोट: मैंने इसका परीक्षण नहीं किया है।

public class ListBoxWriter : TextWriter 
{ 
    private ListBox list; 
    private StringBuilder content = new StringBuilder(); 

    public ListBoxWriter(ListBox list) 
    { 
     this.list = list; 
    } 

    public override void Write(char value) 
    { 
     base.Write(value); 
     content.Append(value); 
     if (value == '\n') 
     { 
      list.Items.Add(content.ToString()); 
      content = new StringBuilder(); 
     } 
    } 

    public override Encoding Encoding 
    { 
     get { return System.Text.Encoding.UTF8; } 
    } 
} 
+0

यह ठीक है जो बाद में करता है: डी धन्यवाद – Fusspawn

3

कंसोल पर भेजे गए पाठ को "कैप्चर" करने की कोशिश करने के बजाय, मैं एक नई कक्षा तैयार करूंगा जो आपके लिए आउटपुट लिखने को संभालती है। तब वह नई कक्षा कंसोल को लिख सकती है, साथ ही साथ कहीं भी आप इसे जाना चाहते हैं।

यदि आप .NET की डीबग क्लास का उपयोग कर रहे हैं, तो बस दो श्रोताओं का उपयोग करें: एक कंसोलट्रेस लिस्टनर और टेक्स्टवाइटरट्रेस लिस्टनर।

अपने मौजूदा कोड काम करने के लिए, जोड़ें:

writer.Flush(); 

अपने Console.WriteLine के बाद() कहते हैं।

+0

अगर मुझे इसका कोई समाधान नहीं मिल रहा है तो मैं इसे इस तरह से करने की संभावना अधिक कर दूंगा। लेकिन मैं वास्तव में कंसोल आउट तक पहुंचने के माध्यम से ऐसा करता हूं, (मुख्य रूप से उपयोग की आसानी के रूप में,) लेकिन एक शैक्षिक टुकड़ा के रूप में भी। यह कुछ मुझे यकीन है कि मैं भविष्य में कई प्रयोगों को पा सकता हूं ताकि सीखना कि अब यह कैसे करना आसान होगा। – Fusspawn

+0

जबकि मैं डीबग क्लास का उपयोग नहीं कर रहा हूं (इसकी सभी डीबग जानकारी नहीं है)। मैं उस डीबग कक्षा के अस्तित्व के बारे में भूल गया था, मैं बस इसका उपयोग करने के लिए बिट्स को परिवर्तित कर सकता हूं। – Fusspawn

+0

ठीक है। उस स्थिति में अपना कोड काम करने के लिए, बस जोड़ें: लेखक। फ्लश(); आपके कंसोल के बाद । राइटलाइन() कॉल। –

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