2009-11-23 8 views
5

Console.WriteLine()을 사용하여 대부분의 디버그 텍스트를 덤프하는 라이브러리를 빌드했습니다.콘솔 출력을 winforms로 리디렉션 ListBox

저는 이제 Windows Forms 응용 프로그램에서 라이브러리를 사용하는 과정에 있으며 콘솔 출력에 계속 액세스해야합니다. (목록/리치 텍스트 상자에 표시)

눈치 채기 콘솔의 표준을 TextWriter로 대체 할 수 있지만이 데이터를 디스플레이로 가져 오는 방법은 무엇입니까?

나는

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

이 작업을 수행하는 또 다른 방법은 TextWriter를 자신이 원하는 위치로 로그를 확장하는 것입니다.

참고 : 테스트하지 않았습니다.

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

다음과 정확히 일치합니까? D Thanks – Fusspawn

3

콘솔로 보낸 텍스트를 "캡처"하려고하지 않고 출력 결과를 처리하는 새로운 클래스를 만듭니다. 그런 다음 새로운 클래스는 콘솔뿐만 아니라 다른 곳으로도 쓸 수 있습니다.

.NET의 Debug 클래스를 사용하는 경우 ConsoleTraceListener와 TextWriterTraceListener라는 두 개의 리스너를 사용하면됩니다.()를 호출

writer.Flush(); 

당신 Console.WriteLine 후 :

추가, 기존의 코드가 작동을합니다.

+0

만약 내가 이것에 대한 해결책을 찾지 못하면 나는 그렇게 할 것입니다. 하지만 난 정말 오히려 콘솔에 액세스 (주로 사용의 용이성으로)를 통해 그것을 할뿐만 아니라 교육 조각으로. 그것의 무언가 나는 미래에 여러 용도를 찾을 수 있기 때문에 지금 이것을하는 법을 배우는 것이 다소 편리 할 것이라고 확신합니다. – Fusspawn

+0

나는 디버그 클래스 (모든 디버그 정보가 아님)를 사용하지 않는 동안. Debug 클래스의 존재에 대해 잊어 버렸습니다. 단지 그것을 사용하기 위해 비트를 변환 할 수 있습니다. – Fusspawn

+0

확인. 이 경우 코드를 작동 시키려면 다음을 추가하십시오. writer.Flush(); Console.WriteLine() 호출 후 –

관련 문제