Programas visuales con C# en Windows y Linux
By: Date: agosto 30, 2006 Categories: Programación

La importancia de C# es tener la capacidad de ser portable. Esto nos ayuda a
escribir programas una vez y portarlos a cualquier plataforma sin
modificaciones, sin embargo siempre hay un pero.

La programación visual orientada a aplicación, Las que muestran ventanas con
objetos que reaccionan a los eventos del usuario. Son un serio problema pues
cada sistema operativo maneja sus propios apis visuales. Por ejemplo Windows y
GNU/Linux con Gnome y por que no Mac OS seguramente ha de manejar su propio
repertorio de apis para sus programas gráficos.

¿Y como solucionar este problema para portar programas a cualquier plataforma
evitando reescribir mucho código?

1) Tus programas no deben hacer llamadas a apis propias del sistema operativo,
debes usar clases escritas completamente en C# o cualquier lenguaje que soporte
.NET
2) Las soluciones ha determinados problemas deben ser escritas en clases
diferentes o escribir tus métodos o funciones estructuradamente, pide argumentos
de entrada y entrega el resultado de salida con un return
3) Asegúrate que en tus clases no interactúen directamente con los componentes
visuales, que ninguna de tus clases o métodos/funciones modifique nada visual,
tus soluciones deben ser eso, Solucionar un problema determinado y retornar el
valor de la solución, ya con este valor tu puedes modificar los componentes
visuales, por ejemplo modificar el texto de algún Label o el texto de un botón.

A continuación escribo 2 programas que ilustran el llamado a una función muy
sencilla. La función, recibe un valor entero de entrada, lo incrementa y
finalmente devuelve el valor ya incrementado. El valor incrementado es asignado
un botón. También interactúan 2 objetos visuales. Un textbox.

El primer programa esta escrito con componentes visuales propios de Windows y el
segundo con los respectivos de Gnome en GNU/Linux, ambos programas son idénticos
visualmente y a nivel código fuente trato de mantenerlos lo mas idéntico
posible.

Versión para MS/Windows con Windows.Form

using System.Windows.Forms;

class wform
{
public static int incremento (int contador)
{
return ++contador;
}

public static void Main()
{
// Codigo de Ventana
Form ventana = new Form ();
ventana.Disposed += delegate
{
Application.Exit ();
};
ventana.Text = "Programa C# en Windows";

// Boton Cerrar

Button bcerrar = new Button ();
bcerrar.Text = "Cerrar";
bcerrar.Height = 30;
bcerrar.Width = 80;
bcerrar.Location = new System.Drawing.Point (110,230);
bcerrar.Click += delegate { Application.Exit (); };

// Etiqueta de Texto
Label etiqueta = new Label();
etiqueta.Location = new System.Drawing.Point (70,90);

// Caja de Texto
TextBox texto = new TextBox ();
texto.TextChanged += delegate { etiqueta.Text = texto.Text; };
texto.Location = new System.Drawing.Point (70,120);

// Boton incrementador
Button bincremento = new Button ();
bincremento.Height = 30;
bincremento.Width = 80;
bincremento.Text = "0";
bincremento.Click += delegate { bincremento.Text = System.Convert.ToString
(incremento (System.Convert.ToInt32 (bincremento.Text))); };
bincremento.Location = new System.Drawing.Point (70,40);

// Carga final de objetos
ventana.Height = 300;
ventana.Width = 300;
ventana.Controls.Add (bcerrar);
ventana.Controls.Add (etiqueta);
ventana.Controls.Add (texto);
ventana.Controls.Add (bincremento);
ventana.Show ();

// Ejeutar el programa
Application.Run ();

}
}

Versión para GNU/Linux con Gnomo y mono

using Gtk;

class ventanagtk
{

public static int incremento (int contador)
{
return ++contador;
}

public static void Main(string[] args)
{
// Inicializar componentes
Application.Init ();

// Codigo de Ventana
Window ventana = new Window ("Programa C# en Linux");
ventana.DeleteEvent += delegate { Application.Quit (); };

// Boton Cerrar
Button bcerrar = new Button ("Cerrar");
bcerrar.HeightRequest = 30;
bcerrar.WidthRequest = 80;
bcerrar.Clicked += delegate { Application.Quit (); };

// Etiqueta de Texto
Label etiqueta = new Label();

// Caja de Texto
Entry texto = new Entry ();
texto.Changed += delegate { etiqueta.Text = texto.Text; };

// Boton incrementador
Button bincremento = new Button ("0");
bincremento.HeightRequest = 30;
bincremento.WidthRequest = 80;
bincremento.Clicked += delegate { bincremento.Label = System.Convert.ToString
(incremento (System.Convert.ToInt32 (bincremento.Label))); };

//Capa de objetos
Fixed controls = new Fixed ();
controls.Add (bcerrar);
controls.Add (texto);
controls.Add (etiqueta);
controls.Add (bincremento);

// Control de objetos en la capa de objetos
controls.Move (bcerrar,110,230);
controls.Move (texto,70,120);
controls.Move (etiqueta,70,90);
controls.Move (bincremento,70,40);

// Carga final de objetos
ventana.Add (controls);
ventana.HeightRequest = 300; //Alto de ventana
ventana.WidthRequest = 300; // Largo de ventana
ventana.ShowAll ();

// Ejeutar el programa
Application.Run ();
}
}

Por ultimo un video mostrando los programas de forma operativa y corriendo cada
uno en su propio ambiente.

 

Si no puedes ver el video, puedes ir a esta URL y descargarlo

http://www.metacafe.com/watch/227074/ejemplo_de_portar_soluciones_con_c/
 

2 thoughts on “Programas visuales con C# en Windows y Linux

  1. Usa: Internet Explorer Internet Explorer 9.0 en Windows Windows 7 - Detectado...

    Estoy iniciando un programa con arquitectura 3 capas, en c# y monodevelop.
    En Windows me trabaja bien el proyecto pero al correrlo en Linux, tengo problemas con la capa de conexión de datos, ya que hago cambios en la conexion y no los actualiza.
    Me podrias ayudar tambien con algún manuel para la capa de presentacion.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *