31 marzo 2006

Clases con C#

//Un poco de codigo usando Clases con c#

using System;
class Tabla
{
private int NumeroRenglones;
private int PosicionActual;

//Constructor
public Tabla()
{
NumRenglones = 0;
Posicion = 0;
}
public int NumRenglones
{
get
{
return this.NumeroRenglones;
}
set
{
this.NumeroRenglones = value;
}
}
public int Posicion
{
get
{
return this.PosicionActual;
}
set
{
this.PosicionActual = value;
}
}
public Boolean AgregaRenglon()
{
NumRenglones+=1;
return true;
}
public Boolean MueveAdelante()
{
Posicion +=1;
return true;
}
public Boolean MueveAtras()
{
Posicion -=1;
return true;
}
public Boolean MueveUltimo()
{
Posicion = NumRenglones;
return true;
}
public Boolean MuevePrimero()
{
Posicion = 0;
return true;
}
}
class Agenda
{
static void Main()
{
Tabla rt = new Tabla();
Console.WriteLine("Inicializacion ..... ");
Console.WriteLine("Renglones: {0}", rt.NumRenglones);
Console.WriteLine("Posicion: {0}", rt.Posicion);
Console.WriteLine("-------------------------------------");
int opcion;
do
{
Console.WriteLine("Menu");
Console.WriteLine("1.- Agregar registro");
Console.WriteLine("2.- Numero de registros");
Console.WriteLine("3.- Posicion actual");
Console.WriteLine("4.- Mover primero");
Console.WriteLine("5.- Mover atras");
Console.WriteLine("6.- Mover adelante");
Console.WriteLine("7.- Mover ultimo");
Console.WriteLine("8.- Salir");
Console.WriteLine("Elija una opcion: ");
opcion = Console.Read();
Console.Read();
switch(opcion)
{
case '1':
if(rt.AgregaRenglon())
Console.WriteLine("Agregado");
break;
case '2':
Console.WriteLine("Renglones: {0}", rt.NumRenglones);
break;
case '3':
Console.WriteLine("Posicion: {0}",rt.Posicion);
break;
case '6':
if(rt.MueveAdelante())
Console.WriteLine("Listo");
break;
}
}while(opcion!='8');
}
}

aun faltan las otras instrucciones, pero creo que es facil de implementar lo que falta.

30 marzo 2006

Un poco de Miguel de Icaza


Miguel de Icaza, creador del proyecto Mono y uno de los mejores programadores de software libre, en los años 90 estudiante de la Universidad Autonoma de México desarrolla un software para la manipulación de archivos (mid night commander) , crea el escritorio para linux gnome, y funda su empresa Ximian donde empieza a desarrollar el proyecto Mono, que es una plataforma .Net para desarrollo de software libre, actualmente vive en Boston, trabaja en Novell y sigue a cargo de la dirección del proyecto Mono.

Su blog: http://tirania.org/blog/index.html

Levantando a Mysql

En dias pasados tenia un problema con el server de Mysql, bueno en realidad creo que todavia persiste, pero encontre una solución temporal.

El error en cuestión era este:

shell>>mysql -u root -p
Enter password:

Me botaba este error

Error 2002 (HY000) Can't connect to local MySQL server through socket '/tmp'

y la verdad que era un quebradero de cabeza, así que busque como solucionarlo, y esta es hasta ahorita la manera de levantar al demonio de Mysql.

shell>>/usr/bin/mysqld --skip-grant-tables --user=root

Esto me arroja un comentario acerca de problemas creo con las tablas tipo INNODB

y despues de esto un ctrl+d

En fin esto me ha solucionado mi problema, espero les sirva en su caso.

29 marzo 2006

Acerca de la agenda

He estado pensando que en el proyecto de la agenda tenemos mucho codigo, o quizas sea el necesario, pero de lo que si estoy seguro es de que se puede modificar para que este mas optimizado, así que en los próximos días ire haciendo unas modificaciones, cuando ya lo tenga lo publicare, espero sea pronto no desesperen.

La idea es tener una forma mas general para el recorrido de los registros y despues este codigo pueda ser reutilizado en proyectos similares.

mas o menos asi:
class Mitabla
{

Private int PosicionRenglon;

public Mitabla()
{
//Aqui inicializar las variables de acuerdo a los datos de la bd
}

public MoverSiguiente()
{
this.PosicionRenglon+=1;
//Posicion+=1;
}

public int Posicion()
{
get
{
return this.PosicionRenglon;
}

set
{
this.PosicionRenglon=value;
}
}

bueno hasta aqui llevo la idea, si alguien considera algo mejor no duden en comentar

27 marzo 2006

Creacion de una ventana con Gtk

Aqui les dejo el codigo básico para crear una ventana con C# y Gtk con Mono

using System;
using Gtk;

class Miventana
{
static void Main(string[] args)
{
Application.Init();
Miventana window = new Miventana();
Application.Run();
}

public Miventana() //Constructor de la ventana
{
Gtk.Window v = new Gtk.Window("Mi ventana");
v.DeleteEvent += new DeleteEventHandler(OnDeleteWindow);
v.ShowAll();
}

static void OnDeleteWindow(object obj, DeleteEventArgs args)
{
Application.Quit();
}
}

compilar de la siguiente: mcs Miventana.cs -pkg:gtk-sharp

Ejecutar: mono Miventana.exe

Resultado que se obtiene




23 marzo 2006

Codigo C# y Gtk# agenda sencilla

//--------------------------------------------------------------------------
// Proyecto: Sencilla Agenda de contactos
// Desarrollo: gsur
// Fecha: 18/03/2006
// Compilar:
// mcs sagenda.cs -pkg:gtk-sharp -pkg:glade-sharp -r:System.Data.dll
// -r:Mysql.Data.dll -resource:vagenda.glade
// Entorno de desarrollo: Mono
// Comentarios: El borrado de contactos tiene un error, ya que no recorre el
// numero actual de contactos, falta añadir un poco mas de codigo,
// pero el borrado si lo aplica correctamente, asi que quedan
// advertidos
//--------------------------------------------------------------------------

using System;
using System.Data;
using MySql.Data.MySqlClient;
using Gtk;
using Glade;

public class Agenda
{
[Glade.Widget] Gtk.Window ventana;
[Glade.Widget] Gtk.Entry txtcontacto;
[Glade.Widget] Gtk.Entry txtdire;
[Glade.Widget] Gtk.Entry txttel;
[Glade.Widget] Gtk.Entry txtmail;
[Glade.Widget] Gtk.Label lblnregs;
[Glade.Widget] Gtk.Entry txtbusqueda;

public string sql; //Variable para las cadenas de consulta
public string connectionString;
public IDbConnection dbcon;
public IDbCommand dbcmd;
public IDataReader reader;
public int npos; //Renglon actual
public long nc; //Numero de renglones
public System.UInt32 id_contacto; //Clave primaria de los contactos
public string nombre; //Nombre del contacto
public string direccion; //Direccion del contacto
public string telefono; //Telefono del contacto
public string email; //Email del contacto
public int opcion; //Situacion actual [Insercion o Update]

public static void Main(String[] args)
{
Application.Init();
Agenda gt=new Agenda();
Application.Run();
}

public Agenda()
{
Glade.XML gxml=new Glade.XML(null, "vagenda.glade","ventana",null);
gxml.Autoconnect(this);
connectionString ="Server=localhost;" + "Database=personal;" + "User ID=rafita;" + "Password=;" + "Pooling=false";
dbcon = new MySqlConnection(connectionString);
dbcon.Open();
dbcmd = dbcon.CreateCommand();
sql = "SELECT * FROM miscontactos ORDER BY nombre_contacto LIMIT 0,1";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
leer_contacto(reader);
npos=0;
dhabilita(false);
reader.Close();
reader=null;
sql = "SELECT COUNT(id_contacto) AS ncount FROM miscontactos";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
reader.Read();
nc = (long) reader["ncount"];
lblnregs.Text="Contacto: 1 de " + nc;
opcion=0;
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
}

public void on_ventana_delete_event(object o, DeleteEventArgs args)
{
dbcon.Close();
dbcon = null;
Application.Quit();
}

public void on_bsalir_clicked(System.Object b, EventArgs e)
{
dbcon.Close();
dbcon = null;
Application.Quit();
}

public void on_bprimero_clicked(System.Object b, EventArgs e)
{
npos=0;
lblnregs.Text="Contacto: 1 de " + nc;
mover();
}

public void on_banterior_clicked(System.Object b, EventArgs e)
{
if(npos>0) {
npos-=1;
mover();
}
else
advierte("\n\nSe ha llegado al primer contacto");
lblnregs.Text="Contacto: " + (int) (npos + 1) + " de " + nc;
}

public void on_bsiguiente_clicked(System.Object b, EventArgs e)
{
if(npos<((int) nc-1)) {
npos+=1;
mover();
}
else
advierte("\n\nSe ha llegado al ultimo contacto");
lblnregs.Text="Contacto: " + (int) (npos + 1) + " de " + nc;
}

public void on_bultimo_clicked(System.Object b, EventArgs e)
{
npos=(int) (nc-1);
mover();
lblnregs.Text="Contacto: " + nc + " de " + nc;
}

public void guardar_cancelar()
{
nombre = txtcontacto.Text;
direccion = txtdire.Text;
telefono = txttel.Text;
email = txtmail.Text;
}
public void on_bnuevo_clicked(System.Object b, EventArgs e)
{
dhabilita(true);
guardar_cancelar();
txtcontacto.Text="";
txtdire.Text="";
txttel.Text="";
txtmail.Text="";
opcion=1;
}

public void on_beditar_clicked(System.Object b, EventArgs e)
{
dhabilita(true);
guardar_cancelar();
opcion=2;
}

public void on_bguardar_clicked(System.Object b, EventArgs e)
{
dbcmd = dbcon.CreateCommand();
switch(opcion)
{
case 0:
String msg;
msg="\n\nNo ha elegido alguna opcion [Nuevo/Editar]";
MessageDialog md = new MessageDialog(ventana, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok,msg);
ResponseType r = (ResponseType) md.Run();
if(r==ResponseType.Ok) {
md.Destroy();
}
break;
case 1:
guardar_nuevo();
break;
case 2:
guardar_edicion();
break;
}
opcion=0;
dhabilita(false);
}

public void guardar_nuevo()
{
sql = "INSERT INTO miscontactos(nombre_contacto, direccion_contacto, telefono_contacto, email_contacto) VALUES(";
sql = sql + "'" + txtcontacto.Text + "','" + txtdire.Text + "','" + txttel.Text + "','" + txtmail.Text + "')";
dbcmd.CommandText = sql;
dbcmd.ExecuteNonQuery();
sql = "SELECT COUNT(id_contacto) AS ncount FROM miscontactos";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
reader.Read();
nc = (long) reader["ncount"];
nc-=1;
reader.Close();
reader = null;
sql = "SELECT * FROM miscontactos ORDER BY id_contacto LIMIT " + nc + ",1";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
reader.Read();
System.UInt32 na = (System.UInt32) reader["id_contacto"];
id_contacto = na;
reader.Close();
reader = null;

sql = "SELECT * FROM miscontactos ORDER BY nombre_contacto";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
int ncont=0;
while(reader.Read() && ((System.UInt32) reader["id_contacto"]!=na)) {
ncont+=1;
}
npos=ncont;
ncont+=1;
nc+=1;
lblnregs.Text = "Contacto: " + ncont + " de " + nc;
reader.Close();
reader = null;

dbcmd.Dispose();
dbcmd = null;
}

public void guardar_edicion()
{
sql = "UPDATE miscontactos SET nombre_contacto='" + txtcontacto.Text + "',";
sql = sql + "direccion_contacto='" + txtdire.Text + "',";
sql = sql + "telefono_contacto='" + txttel.Text + "',";
sql = sql + "email_contacto='" + txtmail.Text + "' WHERE id_contacto=" + id_contacto;
dbcmd.CommandText = sql;
dbcmd.ExecuteNonQuery();
dbcmd.Dispose();
dbcmd = null;
}

public void on_bcancelar_clicked(System.Object b, EventArgs e)
{
txtcontacto.Text = nombre;
txtdire.Text = direccion;
txttel.Text = telefono;
txtmail.Text = email;
dhabilita(false);
}

public void on_beliminar_clicked(System.Object b, EventArgs e)
{
String msgdelete;
msgdelete="\n¿Desea realmente eliminar este contacto?";
msgdelete = msgdelete + "\n\nSi desea continuar pulse Aceptar, si no";
msgdelete = msgdelete + "\ndesea continuar pulse Cancelar";
MessageDialog md = new MessageDialog(ventana, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.OkCancel,msgdelete);
ResponseType r = (ResponseType) md.Run();
if(r==ResponseType.Ok) {
dbcon = new MySqlConnection(connectionString);
dbcon.Open();
dbcmd = dbcon.CreateCommand();
sql = "DELETE FROM miscontactos WHERE id_contacto=" + id_contacto;
dbcmd.CommandText = sql;
dbcmd.ExecuteNonQuery();
dbcmd.Dispose();
dbcmd = null;
dbcon.Close();
dbcon = null;
md.Destroy();
}
else
md.Destroy();
}

public void on_bbuscar_clicked(System.Object b, EventArgs e)
{
dbcmd = dbcon.CreateCommand();
sql = "SELECT * FROM miscontactos WHERE nombre_contacto LIKE '" + txtbusqueda.Text + "%'";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
if(reader.Read())
{
id_contacto = (System.UInt32) reader["id_contacto"];
System.UInt32 na = id_contacto;
txtcontacto.Text=(string) reader["nombre_contacto"];
txtdire.Text=(string) reader["direccion_contacto"];
txttel.Text=(string) reader["telefono_contacto"];
txtmail.Text=(string) reader["email_contacto"];
reader.Close();
reader = null;
sql = "SELECT * FROM miscontactos ORDER BY nombre_contacto";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
int ncont=0;
while(reader.Read() && ((System.UInt32) reader["id_contacto"]!=na)) {
ncont+=1;
}
npos=ncont;
ncont+=1;
lblnregs.Text = "Contacto: " + ncont + " de " + nc;
reader.Close();
reader = null;
}
else
{
MessageDialog md = new MessageDialog(ventana, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok, "\n\nNo se enontro alguna coincidencia");
ResponseType r = (ResponseType) md.Run();
if(r==ResponseType.Ok)
md.Destroy();
}
dbcmd.Dispose();
dbcmd = null;
}

public void mover()
{
dbcmd = dbcon.CreateCommand();
sql = "SELECT * FROM miscontactos ORDER BY nombre_contacto LIMIT " + npos + ",1";
dbcmd.CommandText = sql;
reader = dbcmd.ExecuteReader();
leer_contacto(reader);
reader.Close();
reader = null;
dbcmd.Dispose();
dbcmd = null;
}

public void dhabilita(Boolean valor)
{
txtcontacto.Editable = valor;
txtdire.Editable = valor;
txttel.Editable = valor;
txtmail.Editable = valor;
}

public void advierte(String mensaje)
{
MessageDialog md = new MessageDialog(ventana, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Ok, mensaje);
ResponseType r = (ResponseType) md.Run();
if(r==ResponseType.Ok)
md.Destroy();
}
public void leer_contacto(IDataReader mireader)
{
mireader.Read();
id_contacto = (System.UInt32) mireader["id_contacto"];
txtcontacto.Text=(string) mireader["nombre_contacto"];
txtdire.Text=(string) mireader["direccion_contacto"];
txttel.Text=(string) mireader["telefono_contacto"];
txtmail.Text=(string) mireader["email_contacto"];
}
}

17 marzo 2006

C# + Gtk# + Glade + Mysql

Empece con una pequeña agenda de contactos para empezar a programar en Mono, durante los proximos dias se ira publicando el desarrollo, por el momento les dejo la interfaz de la agenda, esta se elaboro con Glade.

Esta pantalla es ejecutandose en Windows


Esta otra pantalla es ejecutandose en Linux

Proyecto Mono en México

Aunque desconozco realmente el numero de desarrolladores en México que utilicen entornos de desarrollo libre, me atrevo a contarme como uno más, en este blog tratare de mostrar algunas cosillas del desarrollo con Mono.

Enlaces de interes:

http://www.monohispano.org (en español)
http://www.monohispano.es (en español)
http://www.go-mono.org (en ingles)