You are on page 1of 35

UNIVERSIDAD DE CORDOBA FACULTAD DE INGENIERIAS PROGRAMA INGENIERIA DE SISTEMAS CURSO: Electiva de profundizacin I (desarrollo de software libre) TEMA: Archivos

de texto en C#. DESCRIPCION: A lo largo de este documento se realiza un estudio del concepto y caractersticas de los archivos de texto y la respectiva implementacin de un ejemplo practico en lenguaje C# mediante un proyecto de interfaz grafica de usuario (GUI) construido con MonoDevelop basado en GTK# 2.0, describiendo ademas los ensamblados, clases y mtodos de estas disponibles en C# para el tratamiento de archivos texto. Para este efecto se disea e implementa una primera clase abstracta especializada en las operaciones de creacin y apertura de un archivo de texto en modo de escritura, de tal suerte que adems permita almacenar en disco (serializar) cualquier tipo de objeto mediante un mtodo abstracto. En ese mismo orden de ideas se disea e implementa una segunda clase para apertura y recorrido de un archivo de texto en modo de lectura, que adems tiene un mtodo abstracto para recuperar los objetos serializados en el archivo. El proyecto de ejemplo ilustra el uso de menus en GTK# 2.0 y cuadros de dilogos para la apertura y guardado de archivos, adicional al uso de filtros en estos para tipos de archivos. OBJETIVO: Disear e implementar en el lenguaje C# las clases necesarias para realizar las operaciones de creacin, apertura, escritura y lectura de archivos de texto, incluyendo la serializacion y recuperacin de cualquier tipo de objetos, desarrollando para ello una aplicacin de ventanas en C# con MonoDevelop que muestre la serializacin de un tipo de objetos y su recuperacin desde un archivo de texto. PALABRAS CLAVES: Archivos de texto en C#, serializacin de objetos, la clase File, StreamWriter y StreamReader de C#, los Widget TreeView y MenuBar.

Lic. Luis Roberto Olascoaga Surmay

1. Archivos de Texto En general los archivos son un mecanismo de persistencia de datos aunque menos sofisticados como por ejemplo el caso de las bases de datos. Esto significa que los datos con que trabajan nuestros programas pueden ser guardados de manera permanente en disco, de modo que en cualquier momento posterior lo podamos recuperar sin que se pierdan por causa de cerrar el programa o reiniciar nuestra PC. El tratamiento de un archivo podemos enfocarlo desde distintos puntos de vista, segn si nos interesa realizar con ellos operaciones propias del sistema operativo (como por ejemplo copiado, renombrado, asignacin de permisos, eliminacin etc.) en las que el significado o interpretacin del contenido del archivo no es de importancia. Por otro lado el trabajo con el archivo tambin puede orientarse hacia el tratamiento del contenido de este, lo cual incluye operaciones como la lectura, la escritura o modificacin y en todo caso suponemos que interesa el significado o interpretacin del contenido del archivo. En este documento trataremos a los archivos en funcin de su contenido. En cuanto a los archivos de texto, estos constituyen la forma ms simple de guardar y leer datos hasta o desde un archivo fsico en disco. Un archivo de texto, como su nombre lo indica, esta compuesto por un conjunto de lneas de caracteres, que se almacenan en el archivo usando algn formato especial de codificacin, entre los que se destacan el ASCII, UNICODE, UTF entre otros. Estos valores se almacenan sin ningn atributo de texto especial como tamao de letra, color y caractersticas similares, con lo cual a los archivos de texto tambin se les llaman archivos planos. Por estas razones el contenido de un archivo de texto es legible, lo cual supone que podemos ver y comprender su contenido directamente, al menos desde cualquier editor de texto; incluso con independencia del sistema operativo, lenguaje de programacin o software con el que se ha creado dicho archivo. En trminos de las operaciones de lectura y escritura en archivos de texto, estas se hacen lnea a lnea, es decir que cada vez que se guarda o se lee se almacena o se lee una lnea de caracteres completa, la cual puede variar para cualquiera de las dos operaciones en la longitud o cantidad de caracteres que la componen. Siempre que se guarda una lnea o se lee, el puntero de archivo avanza a la siguiente lnea, por lo cual un archivo de texto en funcin de su modo de acceso es tambin un archivo secuencial. As por ejemplo si queremos acceder a la dcima lnea de un archivo, previamente debemos leer las nueve que le preceden. Las operaciones de lectura y de escritura en archivos de texto son

Lic. Luis Roberto Olascoaga Surmay

mutuamente excluyentes, es decir, un archivo de texto se abre en un solo modo; sea para leer o para escribir y no en ambos; no obstante se puede abrir en un modo, realizar las operaciones requeridas y luego cerrarse para abrirse en el otro modo. 2. Archivos de Texto en C# Las consideraciones anteriormente expuestas aplican a la forma en la cual se ven los archivos de texto en el lenguaje C#. Para el tratamiento de archivos (de cualquier tipo) y de directorio desde C# se utiliza el ensamblado System.IO, que contiene clases, excepciones, estructuras, enumeraciones y dems elementos especializados en operaciones de entrada y salida con archivos y directorios. Una de las clases ms representativas de este ensamblado es la clase File, la cual contiene mtodos estticos para gestin tanto de archivos como de directorios entre los que se destacan:

File.Copy: Que permite hacer una copia exacta de un archivo dando el nombre del archivo original y el nombre de la copia (destino). File.Move: Que permite mover un archivo de un directorio o disco a otro, o en su defecto renombrar un archivo existente. Es equivalente a la operacin de cortar y pegar y se le indican el nombre del archivo original y el nuevo nombre o destino (directorio).

File.Delete: Que borra fsicamente un archivo dando el nombre del archivo. File.Exitsts: Funcin booleana que determina si un archivo o directorio existe o no, indicando el nombre del archivo o directorio segn sea el caso. File.GetCreationTime: Funcin a la que se le indica un nombre de archivo o directorio y retorna un tipo DateTime representativo de la fecha y hora en la que fue creado. File.GetLastAccessTime: Funcin que toma por parmetro el nombre de un archivo y retorna un tipo DateTime con la fecha y hora en la que el archivo fue accedido por ultima vez.

File.GetLastWriteTime: Funcin a la que se le pasa el nombre de un archivo y retorna un tipo DateTime con la fecha y hora en la que el archivo fue modificado por ltima vez.

File.OpenText: Funcin que crea una instancia de la clase StreamReader usada para leer un archivo de texto indicando el nombre del archivo, dejando el puntero de archivo en la primera lnea del archivo.

Lic. Luis Roberto Olascoaga Surmay

File.CreateText: Funcin que crea una instancia de la clase StreamWriter usada para escribir en un archivo de texto indicando el nombre del archivo. Si el archivo no existe lo crea, pero si existe borra su contenido.

File.AppendText: Funcin que crea una instancia de la clase StreamWriter usada para escribir en un archivo de texto en modo aadir al final, indicndole el nombre del archivo. Si el archivo no existe lo crea y si existe conserva su contenido.

Ahora bien para acceder a un archivo de texto en modo de escritura optamos por usar la clase StreamWriter la cual tiene los siguientes mtodos y propiedades de inters:

Write: Mtodo sobrecargado para guardar un dato o valor de cualquier tipo hasta el archivo, sin hacer un salto de lnea en este despus de almacenar el valor. WriteLine: Mtodo sobrecargado para guardar un dato o valor de cualquier tipo hasta el archivo almacenando un salto de lnea despus de almacenar el valor. Flush: Mtodo que vaca el buffer de archivo usado de modo que se garantiza que todos los cambios o escrituras hechos en el archivo a nivel de memoria sean efectivamente guardados en el archivo fsico en disco.

Close: Mtodo que cierra el archivo y todos los flujos de datos abiertos por este. Dispose: Mtodo destructor del objeto. Encoding: Propiedad que es un objeto representativo del tipo o formato de codificacin del archivo.

En cuanto al acceso de un archivo de texto en modo de lectura usamos una instancia de la clase StreamReader cuyos mtodos y propiedades de mayor importancia son:

Read: Mtodo sobrecargado para leer un carcter o un buffer (arreglo) de caracteres desde el archivo. ReadLine: Mtodo que lee y retorna la lnea de caracteres actual en el archivo; si no hay ms lneas que leer (cuando se llega al final) retorna un null. ReadToEnd: Mtodo lee todo el contenido del archivo de una vez retornndolo en una sola cadena de caracteres. Close: Mtodo que cierra el archivo y todos los flujos de datos abiertos por este. Dispose: Mtodo destructor del objeto.

Lic. Luis Roberto Olascoaga Surmay

CurrentEncoding: Propiedad que es un objeto representativo del tipo o formato de codificacin con el que se abri el archivo. EndOfStream: Propiedad booleana que indica si se ha alcanzado el final del archivo o no durante las operaciones de lectura. BaseStream: Propiedad que es una instancia descendiente de la clase Stream (flujo o secuencia de datos o bytes) relacionada con el flujo de datos del archivo.

3. Presentacin ejemplo serializacin de objetos con archivos de texto A efectos del proceso de serializacin consideraremos almacenar los datos bsicos de una persona correspondiente al cdigo, apellidos, nombres, edad, estrato y sexo, los cuales sern representados por propiedades de la clase TPersona. Se diseara e implementara una clase para guardar datos en forma de lneas de caracteres hasta un archivo de texto, la cual contendr un mtodo abstracto llamado GuardarObj para serializar un objeto de cualquier clase, adems de los habituales mtodos para crear, aadir y cerrar un archivo de texto conociendo su nombre a travs de una propiedad. A esta clase la llamaremos TEscritura y de ella heredara la clase TEscPersona, que se especializara en guardar o serializar un objeto de la clase TPersona, implementando para ello el mtodo abstracto GuardarObj de su clase padre, de tal suerte que se guarde cada propiedad (atributo) del objeto TPersona en una lnea independiente. De manera anloga tenemos la clase TLectura, la cual ser una clase abstracta especializada en las operaciones de apertura, lectura, recorrido de un archivo de texto y cierre de este, cuyo nombre y ruta se especificara mediante una propiedad. Iincluye adems mtodos para leer una lnea cada vez, verificar la condicin de fin de archivo y por supuesto un mtodo abstracto llamado LeerObj que permitir recuperar un objeto de cualquier tipo desde el archivo. Para este efecto se disea e implementa la clase TLecPersona que se especializa en leer o recuperar el estado de un objeto de la clase TPersona, implementando para ello el mtodo abstracto LeerObj de su clase ascendiente con la idea de que cada propiedad (atributo) del objeto TPersona se lea desde una lnea independiente del archivo.

Lic. Luis Roberto Olascoaga Surmay

4. Diseo de clases para archivos de texto y serializacin de objetos Seguidamente vemos el diagrama de clases UML con el diseo de las clases y las relaciones entre estas, en donde se aprecia una relacin de dependencia de las clases TEscPersona y TLecPersona (clases dependientes) respecto a la clase TPersona (clase independiente) Por qu razon debe ser una relacion de dependencia?.

Lic. Luis Roberto Olascoaga Surmay

5. Creacin de la solucin Para desarrollar el programa de serializacin de objetos de la clase TPersona mediante archivos de texto procedemos de la siguiente manera: a) Entrar en Monodevelop: Aplicaciones + programacin + Monodevelop

b) Crear una nueva solucin: Archivo + nuevo + solucin.

c) Enseguida se muestra la siguiente ventana, en la que seleccionamos el nodo C# de la lista de la izquierda, y de la lista del centro escogemos proyecto GTK#2.0 para despus escribir el nombre del proyecto que ser archivo_texto. Opcionalmente con el botn examinar se puede especificar una carpeta distinta a la presentada por defecto para guardar el proyecto. As mismo es opcional marcar la creacion de un subdirectorio por separado para la solucin. Finalmente pulse el botn adelante.

Lic. Luis Roberto Olascoaga Surmay

d) Seguidamente vemos la ventana para aadir otros proyectos adicionales y opcionales a la solucin, tales como soporte GTK#, proyecto de traduccin e integracin con Unix. Para nuestro caso ninguna de estas opciones son necesarias y por ello no debe marcarlas. La imagen siguiente presenta estas opciones y en ella se aprecia una descripcin de cada una de estas opciones.

La siguiente pantalla muestra el estado inicial de la solucin, observndose en la izquierda el inspector de la solucin y en lado derecho apreciamos el archivo principal del proyecto llamado Main.cs que contiene la clase principal MainClass. Tambin vemos que

Lic. Luis Roberto Olascoaga Surmay

el nombre de espacio archivo_tetxo (namespace) engloba la definicin de la clase principal. Para nuestros propsitos no es necesario y por lo tanto borrelo incluyendo la primera llave de apertura y la ultima llave de cierre. En la implementacin del mtodo esttico Main tenemos el uso del ensamblado Gtk, el llamado de mtodos del objeto global implcito Application, adems de la creacin de una instancia de la clase MainWindow que representa la ventana principal.

Despus de borrar el nombre de espacio el cdigo debe quedar como sigue:

Lic. Luis Roberto Olascoaga Surmay

6. Creacin de los archivos para implementacin de las clases a) Ahora cree un archivo nuevo para implementar la clase TPersona haciendo click derecho en el nombre de la solucin y tomar la opcin aadir + nuevo archivo:

b) En la ventana desplegada del panel de la izquierda seleccionamos la opcin general y del panel central la opcin clase vaca, asignando por nombre TPersona y luego haga click en el botn nuevo para crear el archivo .cs correspondiente como se aprecia en la siguiente imagen.

Lic. Luis Roberto Olascoaga Surmay

Para implementar esta clase borre el nombre de espacio (namespace) dentro del cdigo y asegrese que el cdigo quede como sigue en donde vemos que esta clase solo declara propiedades correspondiente a caractersticas bsicas de una persona y los objetos creados de esta clase son los que vamos a serializar:

using System; public class TPersona{ private int FCodigo; private string FApellidos; private string FNombres; private byte FEdad; private byte FEstrato; private string FSexo; public TPersona(){ FCodigo = 0; FApellidos = ""; FNombres = ""; FEdad = 0; FEstrato = 0; FSexo = ""; } public int Codigo{ set{ FCodigo = value; } get{ return FCodigo; } } public string Apellidos{ set{ FApellidos = value; } get{ return FApellidos; } } public string Nombres{ set{ FNombres = value; } get{ return FNombres; } }

public byte Edad{ set{ FEdad = value; } get{ return FEdad; } } public byte Estrato{ set{ FEstrato = value; } get{ return FEstrato; } } public string Sexo{ set{ FSexo = value; } get{ return FSexo; } } }

Lic. Luis Roberto Olascoaga Surmay

c) Repita el paso (a) pero esta vez en la ventana desplegada asigne TEscritura como nombre de la clase y haga click en el botn Nuevo como se indica en la siguiente imagen:

Para implementar esta clase borre el nombre de espacio (namespace) dentro del cdigo y asegrese que el cdigo para la clase TEscritura sea como sigue:
using System; using System.IO; public abstract class TEscritura{ private string FNombre; protected StreamWriter FEscritor; public TEscritura(){ FNombre=null; FEscritor=null; } public string Nombre{ set{ FNombre=value; } get{ return FNombre; } } public void GuardarLin(string Linea){ FEscritor.WriteLine(Linea); } public abstract bool GuardarObj(object Obj); public bool Abrir(bool Agregar){ try{ Cerrar(); if(Agregar) FEscritor=File.AppendText(FNombre); else FEscritor=File.CreateText(FNombre); return true; } catch{ return false; } } public void Cerrar(){ if(FEscritor!=null){ FEscritor.Flush(); FEscritor.Close(); FEscritor=null; } } }

Lic. Luis Roberto Olascoaga Surmay

e) Repitiendo el paso (a) cree la clase TLectura y haga click en el botn Nuevo como se indica en la siguiente imagen:

Como en los casos anteriores borre namespace dentro del cdigo y asegrese que la implementacin de la clase TLectura quede as:
using System; using System.IO; public abstract class TLectura{ private string FNombre; protected StreamReader FLector; public TLectura(){ FNombre=""; FLector=null; } public string Nombre{ set{ FNombre=value; } get{ return FNombre; } } public bool EsFinal(){ return FLector.EndOfStream; } public bool Abrir(){ try{ Cerrar(); FLector=File.OpenText(FNombre); return true; } catch{ return false; } } public abstract bool LeerObj(object Obj); public void Cerrar(){ if(FLector!=null){ FLector.Close(); FLector=null; } } } public string LeerLin(){ return FLector.ReadLine(); }

Lic. Luis Roberto Olascoaga Surmay

f) Nuevamente con el paso (a) creamos una nueva clase vaca pero esta vez con el nombre TEscPersona y haga click en el botn Nuevo como se aprecia seguidamente:

Igualmente borre el nombre de espacio dentro del cdigo y asegrese que la codificacin para la clase TEscPersona quede de esta forma:
using System; public class TEscPersona : TEscritura{ public TEscPersona() : base(){ } public override bool GuardarObj(object Obj){ TPersona Per; if(Obj is TPersona){ Per=Obj as TPersona; GuardarLin(Per.Codigo+""); GuardarLin(Per.Apellidos); GuardarLin(Per.Nombres); GuardarLin(Per.Edad+""); GuardarLin(Per.Estrato+""); GuardarLin(Per.Sexo); return true; } else return false; } }

Lic. Luis Roberto Olascoaga Surmay

g) Finalmente siguiendo el paso (a) creamos la ltima clase vaca con el nombre TLecPersona y haga click en el botn Nuevo como se muestra a continuacin:

Nuevamente borre el nombre de espacio dentro del cdigo y asegrese que la implementacin para la clase TLecPersona quede de la siguiente manera:
using System; public class TLecPersona : TLectura{ public TLecPersona() : base(){ } public override bool LeerObj(object Obj){ TPersona Per; if(Obj is TPersona){ Per=Obj as TPersona; Per.Codigo=int.Parse(LeerLin()); Per.Apellidos=LeerLin(); Per.Nombres=LeerLin(); Per.Edad=byte.Parse(LeerLin()); Per.Estrato=byte.Parse(LeerLin()); Per.Sexo=LeerLin(); return true; } else return false; } }

Lic. Luis Roberto Olascoaga Surmay

7. Diseo de la ventana principal. Haga doble click en el panel de la solucin sobre el archivo MainWindow.cs y en la parte inferior de esta observe dos botones (cdigo fuente y diseador),

Ahora haga click en el botn diseador debe ver una imagen previa de la ventana como esta:

Para disear la ventana ser necesario usar la barra de herramientas y el inspector de propiedades. Para ver estos, nos vamos por la opcin Ver del men principal y hacemos click en el tem Visual Design, como se indica en la imagen de izquierda. La imagen de la derecha muestra el panel de componentes (barra de herramientas) y debajo de esta el inspector de propiedades con dos fichas en su parte superior: Propiedades y seales (para los eventos). Si aun asi no vemos estos paneles seleccionelos por la opcin Ver + Paneles y marcando Barra de herramientas y despus propiedades respectivamente.

Lic. Luis Roberto Olascoaga Surmay

Seleccione la ventana y en el inspector de propiedades despliegue el nodo Window Properties (haciendo click en la flecha a la izquierda de este). Ubique la propiedad Title (Titulo de la ventana) y escriba delante de esta Ejemplo archivos de texto, quedando la ventana como se muestra a continuacin.

Ahora en la barra de herramientas asegrese de estar en el grupo de contenedores y desde este arrastre hasta la ventana un widget llamado VBox que nos divide la ventana en tres (por defecto) paneles horizontales, como se aprecia en la siguiente imagen.

Lic. Luis Roberto Olascoaga Surmay

Construccin del men principal Para construir el men principal de la ventana procedemos as: a) Del grupo componentes de la barra de herramientas arrastre hasta el primer panel del VBox un Menu Bar (Barra de men).

b) En la imagen anterior haga click en el texto haga clic para crear men con el objetivo de definir las opciones del men. Aqu escriba el texto Archivo y pulse enter segn lo muestra la siguiente imagen:

c) Una vez hecho esto el aspecto del men es como el que se muestra a continuacin, repitiendo el mismo procedimiento haga click en el texto que dice haga clic para crear opcin para crear los tems que colgaran de la opcin principal archivo.

Lic. Luis Roberto Olascoaga Surmay

d) Haga clic en el texto que dice haga clic para crear opcin, escriba el texto Abrir y luego pulse enter como puede ver en la siguiente imagen:

e) Repita este proceso para aadir las sub opciones de guardar y salir, quedando el men como se aprecia seguidamente:

f) Haga click en la opcin Abrir y en el inspector de propiedades en el nodo llamado action properties, asignele un icono apropiado en la propiedad Stockid:

Lic. Luis Roberto Olascoaga Surmay

g) Haga lo propio para las opciones Guardar y Salir de modo que el men quede como se indica a continuacin:

Widgets para captura de datos a) Para los controles de captura de datos, primero desde el panel de contenedores de la barra de herramientas arrastre hasta el panel central del VBox una tabla como se indica en seguida:

Lic. Luis Roberto Olascoaga Surmay

b) Seguidamente ponga por dimensin de la tabla cuatro filas y cinco columnas, para lo cual en el inspector de propiedades despliegue el nodo Table properties de modo que en la propiedad NRows (numero de filas) ponga 4 y en la propiedad NColumns (numero de columnas) asigne 5.

c) Seguidamente en las celdas indicadas de la primera fila de la tabla arrastre tres Widgets Label desde el grupo componentes de la barra de herramientas. A estas tres etiquetas pngales por ttulo Cdigo, Apellidos y Nombres respectivamente, para lo cual en el inspector de propiedades expanda el nodo Label Properties y escriba el texto adecuado en la propiedad LabelProp.

Lic. Luis Roberto Olascoaga Surmay

d) Seleccione el Label con el titulo apellidos y en el inspector de propiedades expanda el nodo Table Child Layout y ponga la propiedad RightAttach en tres (inicialmente esta en dos, pero se le aumenta en uno para que ocupe dos columnas).

e) Haga la misma operacin con el Label de titulo nombres, pero esta vez ponga 5 en la propiedad RightAttach.

Lic. Luis Roberto Olascoaga Surmay

f) Arrastre de la barra de herramientas del grupo de componentes tres Label hasta las tres primeras celdas de la tercera fila de la tabla, asignndoles como titulo los textos sexo, edad y estrato respectivamente.

g) A cada uno de los seis Label

pngale 0 en el valor para la propiedad Xaling

seleccionndola desde el nodo de propiedad titulado como Miscellaneous Alignment Properties como se observa en la siguiente imagen.

Lic. Luis Roberto Olascoaga Surmay

h) Hasta las dos primeras celdas de la segunda fila de la tabla arrastre dos Entry cuyos nombres sern E1 y E2. Seleccione el segundo Entry y en el nodo Table Chile Layout ponga el valor de 3 en la propiedad RightAttach para que ocupe dos celdas..

i) Arrastre otro Entry dle por nombre E3 y asigne el valor de 5 en la propiedad RightAttach.

Lic. Luis Roberto Olascoaga Surmay

j) Seleccione el primer Entry y en el nodo de propiedades llamado Common Widget Properties busque la propiedad WidthRequest (ancho del control) marque el checkbox y ponga el valor de 100.

k) Arrastre un ComboBox hasta la primera celda de cuarta fila de la tabla, seleccione la propiedad tems, haga clic en el botn de tres puntos que esta a la derecha de esta e ingrese los valores de Masculino y Femenino uno debajo del otro y pulse el boton aceptar. A este control pngale por nombre Cb1.

Lic. Luis Roberto Olascoaga Surmay

l) Arrastre otro dos Entry hasta la segunda y tercera celda de la cuarta fila, asignndoles por nombre E4 y E5 respectivamente. Adems pngales a ambos el valor de 50 en la propiedad WidthRequest.

m) Arrastre un botn hasta la cuarta celda de la cuarta fila de la tabla. Expanda el nodo de propiedades Button Properties y ponga los valores indicados a las propiedades segn la siguiente imagen:

Lic. Luis Roberto Olascoaga Surmay

n) Ponga otro botn hasta la quinta celda de la cuarta fila de la tabla. En el nodo Button Poroperties ponga los valores indicados a las propiedades segn la imagen siguiente:

o) Haga click derecho sobre el ultimo panel del VBox para agregar un nuevo panel tomando para ello la opcin Insert Alter

Lic. Luis Roberto Olascoaga Surmay

p) Ahora arrastre una barra de progreso (ProgressBar) hasta el penltimo panel del VBox que tendr por nombre prg. Seguidamente expanda el nodo de propiedades Common Widget Properties desmarcamos la casilla de la propiedad Visible, para que en ejecucin el componente no sea vea.

q) Finalmente en el ltimo panel arrastre un TreeView que tendr como nombre Trv, quedando el diseo final de la ventana segn la siguiente imagen.

Lic. Luis Roberto Olascoaga Surmay

8. Implementacin de mtodos de la ventana En la ventana implementaremos los siguientes mtodos que se describen brevemente a continuacin:

CrearColumnas: Con este mtodo definimos las columnas y ttulos del TreeView, asegurndonos que sean redimensionables. As mismo creamos el modelo con los tipos de cada columna, considerando para ello la funcion typeof indicandole el tipo adecuado para cada caso y usando como objeto de renderizado para cada columna una instancia de la clase CellRenderText, la cual se relaciona con la propiedad text con cada columna del modelo.

Agregar: Aade al modelo del TreeView los datos de las propiedades de un objeto de la clase TPersona.

Cargar: Recibe un nombre de archivo y lee objetos de la clase TPersona que son aadidos hasta el TreeView.

Asignar: Mtodo sobrecargado, en el que la primera sobre carga recibe un objeto de la clase TPersona y llena el valor de sus propiedades desde los datos ingresados en los controles (Widgets) de la ventana. La segunda sobre carga adems recibe un segundo parmetro la fila (TreeIter) del modelo de datos del TreeView desde la que se toman los valores de las propiedades del objeto.

Guardar: Recibe un nombre de archivo y guarda todos los objetos de la clase TPersona hasta un archivo de texto, que fueron previamente ledos desde un archivo de texto y/o ingresados en el TreeView.

Limpiar: Recibe por parmetro una cantidad variable de Widgets del tipo Entry (usando la palabra reservada params) para limpiar el texto ingresado por el usuario.

Ahora trasldese a la vista de cdigo fuente de la ventana y asegrese de que el cdigo de la misma quede como se indica a continuacion:

Lic. Luis Roberto Olascoaga Surmay

using System; using Gtk; public partial class MainWindow : Gtk.Window{ private ListStore Mod; public MainWindow () : base(Gtk.WindowType.Toplevel){ Build(); CrearColumnas(); } private void CrearColumnas(){ int i; string [ ]Titulos={"Codigo","Apellidos","Nombres","Sexo","Edad","Estrato"} ; Mod=new ListStore(typeof(int),typeof(string),typeof(string),typeof(string),typeof(byte),typeof(byte)); for(i=0;i<Titulos.Length;i++){ Trv.AppendColumn(new TreeViewColumn(Titulos[i],new CellRendererText(),"text",i)); Trv.Columns[i].Resizable=true; } Trv.Model=Mod; } private void Agregar(TPersona Per){ Mod.AppendValues(Per.Codigo,Per.Apellidos,Per.Nombres,Per.Sexo,Per.Edad,Per.Estrato); } private void Cargar(string NomArch){ TPersona Per; TLecPersona LP=new TLecPersona(); LP.Nombre=NomArch; if(LP.Abrir()){ Mod.Clear(); Per=new TPersona(); while(!LP.EsFinal()) if(LP.LeerObj(Per)) Agregar(Per); LP.Cerrar(); } } private void Asignar(TPersona Per){ Per.Codigo=int.Parse(E1.Text); Per.Apellidos=E2.Text; Per.Nombres=E3.Text; Per.Sexo=Cb1.ActiveText; Per.Edad=byte.Parse(E4.Text); Per.Estrato=byte.Parse(E5.Text); } private void Asignar(TPersona Per,TreeIter Fila){ Per.Codigo=int.Parse(Mod.GetValue(Fila,0).ToString()); Per.Apellidos=Mod.GetValue(Fila,1)+""; Per.Nombres=Mod.GetValue(Fila,2)+""; Per.Sexo=(Mod.GetValue(Fila,3)+""); Per.Edad=byte.Parse(Mod.GetValue(Fila,4)+""); Per.Estrato=byte.Parse(Mod.GetValue(Fila,5)+""); }

Lic. Luis Roberto Olascoaga Surmay

private void Guardar(string NomArch){ int i; TPersona Per; TreeIter Fila; TEscPersona EP=new TEscPersona(); EP.Nombre=NomArch; if(EP.Abrir(false)){ Per=new TPersona(); for(i=0;i<Mod.IterNChildren();i++){ Mod.IterNthChild(out Fila,i); Asignar(Per,Fila); EP.GuardarObj(Per); } EP.Cerrar(); } } private void Limpiar(params Entry []Datos){ int i; for(i=0;i<Datos.Length;i++) Datos[i].Text=""; Cb1.Active=-1; Datos[0].GrabFocus(); } protected void OnDeleteEvent (object sender, DeleteEventArgs a){ Application.Quit(); a.RetVal = true; } }

9. Implementacin de eventos de la ventana Para implementar los eventos de los botones y de las opciones del men procedemos as: a) Seleccione el botn Agregar y active la ficha de seales (eventos) del inspector de propiedades. Luego expanda el nodo Buttons Signals y haga doble click en el evento llamado Clicked:

Lic. Luis Roberto Olascoaga Surmay

Implemente el evento del botn Agregar con el siguiente cdigo:


protected virtual void OnButton1Clicked(object sender, System.EventArgs e){ TPersona Per=new TPersona(); Asignar(Per); Agregar(Per ); Limpiar(E1,E2,E3,E4,E5); }

b) Ahora seleccione el botn Eliminar y en la ficha de seales dentro del nodo Buttons Signals y haga doble click en el evento llamado Clicked:

Implemente el evento del botn Eliminar con el siguiente cdigo:

protected virtual void OnButton2Clicked(object sender, System.EventArgs e){ TreeIter Fila; if(Trv.Selection.GetSelected(out Fila)) Mod.Remove(ref Fila); }

c) Para implementar las opciones de la barra de men, empiece seleccionando la opcin Abrir, expanda el nodo de seales llamado Action Signals y haga doble click en la seal Activated

Lic. Luis Roberto Olascoaga Surmay

El cdigo para implementar la opcin de men Abrir es el siguiente:


protected virtual void OnOpenActionActivated(object sender, System.EventArgs e){ FileChooserDialog Dlg; Dlg=new FileChooserDialog("Abrir archive personas",this,FileChooserAction.Open, Stock.Open,ResponseType.Ok,Stock.Cancel,ResponseType.Cancel); Dlg.Filter=new FileFilter(); Dlg.Filter.AddPattern("*.txt"); if(Dlg.Run()==(int)ResponseType.Ok) Cargar(Dlg.Filename); Dlg.HideAll(); Dlg.Destroy(); }

d) La siguiente opcin del men es Guardar, seleccinela y haga doble click en la seal Activated:

El cdigo para implementar la opcin de men Guardar queda as:


protected virtual void OnSaveActionActivated(object sender, System.EventArgs e){ FileChooserDialog Dlg; Dlg=new FileChooserDialog("Guardar archivo personas",this,FileChooserAction.Save, Stock.Save,ResponseType.Ok,Stock.Cancel,ResponseType.Cancel); Dlg.Filter=new FileFilter(); Dlg.Filter.AddPattern("*.txt"); if(Dlg.Run()==(int)ResponseType.Ok) Guardar(Dlg.Filename); Dlg.HideAll(); Dlg.Destroy(); }

Lic. Luis Roberto Olascoaga Surmay

e) Finalmente seleccione la opcin Salir y haga doble click en la seal Activated

Implemente el evento de la opcin del men Salir de la siguiente manera:


protected virtual void OnQuitActionActivated (object sender, System.EventArgs e){ this.Dispose(); }

La siguiente imagen muestra la ventana en tiempo de ejecucin:

Lic. Luis Roberto Olascoaga Surmay

Actividad propuesta. Como complemento del anterior ejercicio desarrolle las siguientes actividades. 1. Para los parmetros por valor y para los de tipo ref, out y params existentes en C# explique su funcionamiento y diferencias. 2. Consulte cuales son los miembros de la enumeracin ResponseType. 3. Investigue cual es el ensamblado y que clases de este se utilizan para los formatos de codificacin de archivos. 4. Explique para que es el mtodo Run de un cuadro de dialogo. 5. Explique cual es la interpretacin que tienen los cuatro ltimos parmetros del constructor de la clase FileChosserDialog. 6. Modifique el ejemplo anterior insertando al principio una nueva columna al TreeView (y consecuentemente al modelo) con el titulo N que muestre el nmero de fila o registro de cada persona. 7. Modifique el cdigo de la ventana del ejemplo presentado para que la operacin de guardado del archivo de texto sea realizada con un hilo, de modo que se muestre en ejecucin el progreso de esta operacin usando la barra de progreso que dejamos oculta. 8. A la aplicacin anterior se le debe agregar una nueva opcin de men al lado de la opcin de archivo. Esta nueva opcin deber llamarse Ordenar y contendr sub opciones para ordenar los datos del modelo del TreeView por cdigo, apellidos y nombres respectivamente. 9. Usando la clase Lectura cree una nueva solucin de ventana junto con las clases necesarias para leer los datos de los usuarios del sistema desde el archivo /etc/passwd. 10.Desarrolle un proyecto de ventana para demostrar el uso de los mtodos Copy, Move, Delete y GetLastWirte de la clase File.

Lic. Luis Roberto Olascoaga Surmay

You might also like