2009-11-23 13 views
5

Zbudowałem bibliotekę, która zrzuca większość tekstu debugowania za pomocą Console.WriteLine();Przekierowanie wyjścia konsoli do WinForm ListBox

Jestem teraz ja jestem procesem korzystania z biblioteki w aplikacji Windows Forms i nadal potrzebuję dostępu do wyjścia konsoli. (Aby wyświetlić w polu Lista/RichText)

I Noticed Mogę zastąpić standard z konsoli do TextWriter, ale jak mam wtedy te dane wprowadzić na wyświetlacz.

Próbowałem robić coś wzdłuż linii

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); 
    } 
} 

ale bezskutecznie. Jakieś pomysły?

Niepotrzebny kod usunięty.

Odpowiedz

12

Innym, prawdopodobnie czystszym sposobem, aby to zrobić, jest rozszerzenie TextWriter o własne, które loguje się tam, gdzie chcesz.

Uwaga: Nie testowałem tego.

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

to robi dokładnie to, co im po: D Dzięki – Fusspawn

3

Zamiast próbować "przechwytywać" tekst wysłany do konsoli, utworzę nową klasę, która będzie obsługiwać zapisywanie wyników dla ciebie. Wtedy ta nowa klasa mogłaby napisać na konsolę, a także w inne miejsce, w które chcesz jechać.

Jeśli używasz klasy Debug .NET, po prostu użyj dwóch detektorów: ConsoleTraceListener i TextWriterTraceListener.

Aby dokonać istniejących prac kodu, dodać:

writer.Flush(); 

po Console.WriteLine() wywołuje.

+0

Jeśli nie mogę znaleźć rozwiązania tego, najprawdopodobniej skończę w ten sposób. ale naprawdę wolałbym to robić poprzez dostęp do konsoli, (głównie jako łatwość użycia), ale także jako element edukacyjny. jest to coś, na co jestem pewien, że w przyszłości mogę znaleźć wiele zastosowań, więc nauka, jak to zrobić teraz, będzie raczej przydatna. – Fusspawn

+0

, gdy nie używam klasy debugowania (nie wszystkie informacje debugowania). Zapomniałem o istnieniu tej klasy debugowania i mogę po prostu konwertować bity, aby to wykorzystać. – Fusspawn

+0

Ok. W takim przypadku, aby twój kod zadziałał, po prostu dodaj: writer.Flush(); po wywołaniu Console.WriteLine(). –

Powiązane problemy