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/
necesito un editor de textos un block de notas
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.