image47dd1de4

Buenas,

hoy toca el post tonto del día, pero cuando quiero acordarme cómo se hacía esto, pues tengo que abrir código viejuno para verlo. Así que aquí está es escenario:

Capturar la salida del buffer de la consola (por ejemplo: Console.Write() o similares) en una caja de texto en una aplicación Winforms.

Pues una vez que tienes un proyecto WinForm con un formulario, una caja de texto llamada txtConsole y un botón btnAddLine para agregar nuevas líneas, puedes resolver el escenario con el siguiente código, donde la línea importante es la línea 10.

   1: public partial class Form1 : Form

   2: {

   3:     private int i = 0;

   4:     public Form1()

   5:     {

   6:         InitializeComponent();

   7:     }

   8:     private void Form1_Load(object sender, EventArgs e)

   9:     {

  10:         Console.SetOut(new TextBoxWriter(txtConsole));

  11:     }

  12:     private void btnAddLine_Click(object sender, EventArgs e)

  13:     {

  14:         i++;

  15:         Console.WriteLine("new line: {0}", i);

  16:     }

  17: }

¿Simple no? Eso jugando un poco con Console y con Console.SetOut(), pues soluciona el problema.

image

Ahoar bien, si en este momento dejaste de leer el post, te vas a dar con la cabeza contra la pared, porque en realidad lo interesante está en la implementación que querramos hacer del TextWriter con el que trabajaremos en Out de la consola. En este caso la clase se llama TextBoxWriter y posee el siguiente código:

   1: public class TextBoxWriter : TextWriter

   2: {

   3:     private TextBox control;

   4:     private StringBuilder bufferStringBuilder;

   5:  

   6:     public TextBoxWriter(TextBox txtConsole)

   7:     {

   8:         control = txtConsole;

   9:         control.HandleCreated += ControlHandleCreated;

  10:     }

  11:  

  12:     public override void Write(string format)

  13:     {

  14:         if (control.IsHandleCreated)

  15:             AppendText(format);

  16:         else

  17:             BufferText(format);

  18:     }

  19:     public override void WriteLine(string format)

  20:     {

  21:         Write(format + "\r\n");

  22:     }

  23:  

  24:     private void BufferText(string format)

  25:     {

  26:         if (bufferStringBuilder == null)

  27:         {

  28:             bufferStringBuilder = new StringBuilder();

  29:         }

  30:         bufferStringBuilder.Append(format);

  31:     }

  32:  

  33:     private void AppendText(string format)

  34:     {

  35:         if (bufferStringBuilder != null)

  36:         {

  37:             control.AppendText(bufferStringBuilder.ToString());

  38:             bufferStringBuilder = null;

  39:         }

  40:         control.AppendText(format);

  41:     }

  42:  

  43:     void ControlHandleCreated(object sender, EventArgs e)

  44:     {

  45:         if (bufferStringBuilder != null)

  46:         {

  47:             control.AppendText(bufferStringBuilder.ToString());

  48:             bufferStringBuilder = null;

  49:         }

  50:     }

  51:  

  52:     public override Encoding Encoding

  53:     {

  54:         get { throw new NotImplementedException(); }

  55:     }

  56: }

Una vez más, este código es solo un ejemplo para el post, hace falta refactorizarlo, acomodarlo al escenario de utilización concreto, etc.; pero sirve para que hagan copy & paste y destruyan algún proyecto en producción.

Y claro, si quieres lo puedes portar a WPF, o lo que mejor te fit you Open-mouthed smile

El código del ejemplo lo puedes descargar desde aquí.

http://cid-bef06dffdb192125.office.live.com/embedicon.aspx/Code%20Samples/2011%2003%2013%20Capturar%20la%20salida%20de%20la%20consola.zip

Saludos @ Home

El Bruno

   

Leave a comment

Discover more from El Bruno

Subscribe now to keep reading and get access to the full archive.

Continue reading