Programas visuales con C# en Windows y Linux

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 Comments

Add a Comment

Comment spam protected by SpamBam