|
En este capitulo veremos otras maneras de comenzar una aplicacion en Delphi. Delphi nos ayudara a escribir algun codigo de inicio para diferentes tipos de proyecto. Veremos que facil es comenzar con una base estandarizada para nuevas aplicaciones. Tambien veremos como el Code Repository nos puede ayudar a compartir codigo en un ambiente de trabajo (muy importante en desarrollos grandes). Ademas, haremos nuestra primera aplicacion en Delphi!
El Object Repository es un directorio donde usted puede poner codigo fuente basico y componentes que usted utiliza una y otra vez, como formas, su "aplicacion estandar" y cosas asi. Cuando usted selecciona File-New, el Code Repository muestra un una pagina con todas las opciones de Wizards y lo que contiene el repositorio para que usted eliga. Usted puede no solo copiar el codigo a su proyecto, sino "heredar" y "usar".
Heredar una forma (inherit) es una manera muy util de, por ejemplo, hacer que las formas de su aplicacion tengan una apariencia fija. Si usted siempre tiene un Toolbar vacio y su forma siempre tiene el caption rojo, por ejemplo, usted puede heredar de esa forma para todas las formas de su aplicacion, y Delphi creara las formas basadas en su forma en vez de basarlas en TForm. Cualquier objeto puede ser heredado. Simplemente "usar" quiere decir que no vamos a mantener una copia del objeto en el repositorio y tampoco lo vamos a utilizar.
Un wizard es un DLL (o DPL) de Delphi que nos ayuda a escribir codigo. Los Wizards pueden ser desde muy sencillos (wizard para "New Dialog"), hasta muy complejo codigo que cambia la totalidad del IDE (como Coderush, o GExperts). Cuando son muy complejos y cambian el IDE se llaman "Add-Ins" o IDE Enhancements.
Porque el rango tan amplio de complejidad y son lo mismo? Aunque eso es para otro capitulo, por ahora le puedo decir que Delphi esta hecho en Delphi (y la libreria sigue siendo el VCL), asi que cuando usted hace un Add-In, todos los objetos del IDE de Delphi estan disponibles para que usted los manipule. El IDE de Delphi tiene ademas interfaces que hacen estas modificaciones faciles, llamadas Open Tools API. Eso quiere decir que su Add-In puede manipular el menu añadiendo items, cajas de dialogo, modificando las ventanas del IDE e incluso reemplazando tareas de Delphi! Este es el poder de un ambiente totalmente abierto a que usted juege con el. Coderush es el ejemplo mas extremo en el mercado (hasta ahora) de lo que se puede hacer con este API.
Comencemos por algo facil, utilizar uno de los wizards que vienen con Delphi. Para esto no tenemos que saber nada...! Simplemente, seleccione File-New... (No use File-New application porque esto creara una aplicacion vacia tal como la que ve cuando comienza Delphi) - la ventana del repositorio de objetos desplegara las opciones de los nuevos elementos que puede crear:
Delphi tiene templates categorizadas por pagina:
Cuando use Delphi para producir sus aplicaciones, podra usar Tools-Repository del menu de Delphi para hacer mas paginas y organizar sus wizards o los modulos de datos que haga. Ademas, usando Tools-Environment options - Shared repository directory podra usted cambiar el directorio para que este en su directorio de datos, o en algun lugar de la red (asegurese de copiar los archivos de C:\Program Files\Borland\Delphi 3\ObjRepos, o equivalente, al nuevo directorio para que los wizards sigan funcionando).
Ahora que sabemos lo que es el repositorio de objetos, por que no usamos nuestro primer Wizard? Y de paso creamos nuestra primera aplicacion de a deveras...!
Seleccione File-New... y vaya a la pagina de Projects. Seleccione "Application Wizard" y presione OK. A continuacion, veremos que el wizard nos pregunta que menus queremos utilizar. Seleccione File, Edit, Window y/o Help (los que desee). Presione Next. Despues Delphi nos pide (si seleccionamos File) que especifiquemos las extensiones. Presione Add y conteste "Rich Text Format" y "*.rtf" como descripcion y extension.
A continuacion, nos presentara con una interface para añadir botones dependiendo en los comandos que seleccionamos:
Utilice la parte izquierda para seleccionar la pagina y la derecha para cambiar los botones. Los botones Insert, Remove y Space agregan, eliminan y ponen espacio entre los botones. En la parte superior vera usted la barra de botones tal y como se va a ver. El pequeño triangulo en esta barra representa donde se insertara el boton y puede ser movido para que usted ponga botones en medio si olvido alguno.
Cuando termine, le preguntara el Nombre de la applicacion y el directorio donde lo quiere guardar. Tambien encontrara las siguientes opciones:
Seleccione Create Status line y Enable hints. Delphi se ira a trabajar y dejara su programa listo para ejecutar por primera vez. Felicidades! Acaba usted de crear su primera aplicacion en Delphi. Todavia no hace nada, pero haremos un mini-editor de textos, nada mas para ver que tan facil es.
Esta es la apariencia de nuestra primera aplicacion en Delphi, la cual acabamos de crear utilizando el Wizard de Aplicacion nueva dentro del Object Repository. Utilizando el Object Inspector, cambie el Caption a "Mi Editorcito". Si usted quiere, puede ejecutar este programa tal como esta. Presione el boton de "Run" en el IDE y pruebelo. Trate de presionar los botones y note que ciertos botones despliegan dialogos (Open, Save)! Pronto veremos como se hace esto. Seleccione File-Exit para salir de su aplicacion de ejemplo y note como Delphi ya ha escrito codigo para salir del programa desde una opcion del menu.
Como se dio cuenta al ejecutarla, esta aplicacion tiene ciertos componentes que no se mostraran al usuario en tiempo de ejecucion (Delphi los ha agrupado en medio de la forma sin alinearlos). El VCL de Delphi se divide en dos clases de componentes: Componentes Visuales y componentes No Visuales. Los componentes no visuales son representados por Delphi como iconos con sombra menos "obscura" en el diseñador, y no se pueden contener dentro de un panel o barra de botones (porque como no se ven, no tiene caso ponerlos "adentro" de un componente visual).
Nota: El hecho de que el VCL se llame "Visual Component Library" y tenga componentes "No Visuales" ha inspirado a gente a decir que el nombre "VCL" esta mal utilizado. En mi opinion particular, el nombre esta bien utilizado porque la libreria es visual durante su diseño.
Los componentes no visuales en esta forma son el Menu principal, el dialogo "Open", el dialogo "Save", el Dialogo "Print" y el dialogo "Print Setup". Estos objetos del VCL son los dialogos estandard de Windows encapsulados en un objeto de Delphi (o sea que se veran en español, ingles, aleman, etc., dependiendo del idioma de Windows en la maquina "cliente").
Nota: El menu principal se representa en la pantalla como un componente no visual, pero lo podemos ver durante ejecucion y diseño. La razon es que Delphi, en su enfasis de dar un "look-and-feel" identico al diseñador, decidio poner un menu "de adeveras" en tiempo de diseño (para que responda a los cambios globales de Font y color en tiempo real, etcetera. Pero si usted pudiera modificar ESE menu en-linea, Delphi tendria que encadenar el codigo de modificacion de TMainMenu dentro del ejecutable final, lo cual agregaria "basura" a su ejecutable (el no hacerlo violaria las reglas de orientacion a objetos). Asi que tenemos en este caso en particular un componente no visual que se despliega en la pantalla (o un componente visual con un editor por separado, como lo quiera ver). Cuando veamos como escribir editores de propiedades en Delphi todo esto quedara muy claro. Si no entiene, por mientras "tenga fe" en que Delphi esta bien diseñado, pero MainMenu es un caso un tanto especial.
Para editar el MainMenu, haga doble-click en el icono del menu (componente no visual) y vera un editor de menus.
Como utilizamos un componente no visual? De hecho, no es muy dificil, pero si requiere un poquito de Codigo. Al ponerlo en la forma Delphi se encarga de crearlo y destruirlo sin tenernos que preocupar. Veamos el codigo que Delphi nos ayudo a escribir. Dentro de la ventana de diseño de su aplicacion (como la que se muestra arriba), vaya al menu de File y seleccione Open. Delphi ira al evento de FileOpen dentro de su codigo (que por cierto, Delphi ha escrito para usted con todo y logica basica, listo para que lo implemente):
procedure TMainForm.FileOpen(Sender: TObject); begin if OpenDialog.Execute then begin { Add code to open OpenDialog.FileName } end; end; |
Este evento, que esta enlazado al evento "Onclick" del item del menu FileOpenItem, nos muestra que para accesar uno de estos objetos "invisibles" solo tenemos que mencionarlo por nombre y llamar uno de sus "metodos" (procedimientos o funciones de los objetos) con un punto en medio, en el formato Objeto.Metodo. (de la misma manera en que C++ utiliza el formato Objeto->Metodo ). En el caso de todos los Dialogs estandar de Delphi que se encuentran en la pagina "Dialogs" de la paleta de componentes (Open, Save, Print, Print Setup, Find, etc), el metodo para mostrar el dialogo al usuario se llama Execute. Execute es una funcion que devuelve un valor Boolean (logico). Si Execute devuelve True, quiere decir que el usuario completo el dialogo con exito y salio con OK. Si Execute devuelve False, quiere decir que el usuario no completo el dialogo. Es por esto que Delphi ha encerrado la seccion donde dice "Añada codigo para abrir..." dentro del If-Then. De este modo el archivo solo abrira cuando el usuario seleccione OK (y Cancel funcionara tal como esperamos como usuarios, no haciendo nada). Si se asoma al codigo de Save, print, etc., vera que es el mismo asunto.
Ahora que ya probamos nuestro programa comencemos a hacer cosas para que de hecho haga algo. Dijimos que vamos a crear un editor de textos. Pues comencemos. En la paleta de componentes, vaya a Win32 y seleccione el componente RichEdit. Ponga uno de estos en medio de la forma. En el Object inspector, cambie la propiedad Align a alClient.
Nota: Delphi tiene nombres para diferentes items asociados con un tipo de propiedad. Estos se llaman "enumeraciones" o "enums". En este caso, la propiedad Align del objeto TControl (y sus derivados, que incluyen a TRichEdit) es de tipo TAlignment, que puede ser alNone, alTop, alBottom, alLeft, alRight o alClient. Internamente durante compilacion, Delphi compila esto en un set numerico. C tiene capacidades parecidas a traves de la directiva typedef enum, pero en Delphi es mucho mas simple (por supuesto). Internamente, las imagenes creadas por Delphi con este metodo en memoria son identicas a las de C y por ende, es igual de rapido.
Veremos que el RichEdit contiene el texto "RichEdit1". Esto como que no va en un programa, asi que vamos a borrarlo. Haga doble click en la propiedad "Lines" y vera una ventanita para editar textos. Elimine el texto.
Ahora vamos a escribir un poco de codigo, asi que truenese los dedos y agarrese del teclado (como yo) J
Vamos de nuevo a nuestro codigo. Primero necesitamos permitir al usuario grabar el texto que escriba en el RichEdit. Asi que vayamos a File-Open utilizando el menu dentro del diseñador. Delphi nos mostrara el codigo dentro de esa seccion. En el codigo, escriba lo siguiente:
procedure TMainForm.FileOpen(Sender: TObject); begin if OpenDialog.Execute then begin { Add code to open OpenDialog.FileName } RichEdit1.Lines.LoadFromFile(OpenDialog.Filename); end; end; |
Fue solo una linea... Pero una linea bastante poderosa. Vamos a probarla primero y despues explicare. Ejecute su programa. Ahora, antes de hacer nada, ejecute WordPad (el editorcito que viene con Windows). Escriba algo bonito, con Fonts y cosas. Ahora grabelo a disco, seleccionando el formato RTF. Corra nuestro programa (que ahora puede leer un archivo) y ejecutelo. Cargue el mismo archivo. Ahora compare:
Heeey... No esta mal para una linea de codigo, verdad? Nuestro programa, aunque todavia no tiene botones para edicion especifica de fonts y colores, soporta los mismos. Tambien, si se da cuenta, soporta "word wrapping". Felicidades! Acaba usted de terminar de hacer la parte mas pesada de los editores de Windows 3.1, el soporte interno de Fonts.
Esto es codigo optimizado, compilado en un ejecutable de 273K en mi caso. Si voy a Project-Options y elimino el "debug Info" puedo reducir el tamaño un poco. Y si decido utilizar "paquetes" Seleccionando Project- Options-Packages- Compile with Runtime Packages del menu de Delphi, mi ejecutable se reduce a la irrisoria cantidad de 34K, haciendolo un paquete facil de distribuir por el web.
Nota: Paquetes son un tipo de DLLs especifico para Delphi y C++ Builder que son capaces de pasar objetos en vez de solo tipos basicos (usan la extension DPL y se encuentran en Windows\System32). Los archivos son compartidos y cada objeto esta implementado en un paquete. Usted tiene que poner en el paquete de instalacion los archivos DPL en los que los objetos con los que programo se encuentran, de preferencia en un "paquete de web" (CAB) diferente. En el servidor de Borland hay un paquete CAB con solo los DPLs al cual usted puede hacer referencia en las dependencias de su propio CAB. De este modo el navegador solo baja el paquete con los objetos de Delphi una vez, y las veces subsiguientes baja unicamente 32K. Tambien hay un CAB por separado para la Database Engine que solo se usa si usted usa tablas o queries.
Como funciona? Bueno, de hecho es muy simple: El objeto RichEdit ya tiene soporte para diferentes tipos de letra, y entiende el formato RTF. La propiedad Lines del objeto es a su vez un objeto de tipo TStrings. TStrings es una muy veloz encapsulacion de una lista de cadenas de caracteres. Cada linea del control TRichEdit esta "mapeada" a una linea del objeto TStrings contenido dentro del RichEdit. RichEdit despliega el contenido del TStrings siguiendo las reglas del formato RTF. Por ejemplo, la ultima seccion del RTF contiene, en realidad, lo siguiente:
{\rtf1\ansi\ansicpg1252\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\froman Times New Roman;}{\f3\froman\fprq2 Bookman Old Style;}{\f4\fswiss\fprq2 Arial Black;}{\f5\fswiss\fprq2 Tahoma;}{\f6\fswiss\fprq2 System;}} {\colortbl\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue0;\red0\green255\blue255;\red128\green0\blue0;\red128\green0\blue128;\red0\green128\blue0;\red255\green0\blue0;} \deflang1033\horzdoc{\*\fchars }{\*\lchars }\pard\plain\f2\fs32 Tengo que poner \plain\f3\fs32 Tipos de letra \plain\f5\fs52 diferentes\plain\f3\fs32 \plain\f2\fs32 y \plain\f4\fs48\cf4 c\plain\f4\fs48\cf1 o\plain\f4\fs48\cf2 l\plain\f4\fs48\cf3 o\plain\f4\fs48\cf7 r\plain\f4\fs48\cf5 e\plain\f4\fs48\cf6 s\plain\f2\fs32 .} |
RichEdit interpreta esto como los diferentes colores y tipos de letra especificos. Imaginese cuanto tiempo nos han ahorrado implementando todo esto! Un poco de credito debe ir a Microsoft, ya que RichEdit es uno de los controles estandar de Win95 definidos en commctrl32.dll - pero ellos cambiaron las complejidades de usar el formato RichEdit con las complejidades de mantener Window Handles y mensajes de Windows a todo momento. Delphi nos da un componentito que ponemos en la formay punto.
El Objeto TStrings es uno de los objetos internos que mas se utilizan en Delphi. Tiene la capacidad de grabarse y cargarse del disco con una metodo (LoadFromFile/SaveToFile), de buscar una cadena dentro de la lista con el metodo IndexOf, de mantener un puntero de memoria por cada objeto dentro de la cadena, lo cual lo hace ideal para poner descripciones de texto en una lista de objetos (como por ejemplo una lista de bitmaps con nombres de archivo) en memoria, y muchisimas cosas mas. Vea la ayuda de TStrings para saber todo lo que puede hacer con listas, y por ende, todo lo que puede hacer con la propiedad Lines del RichEdit.
Bueno, yo ya explique como cargar archivos, ahora es responsabilidad de usted terminar el programa y hacerlo que tambien grabe. Recuerde que Windows graba con dos eventos diferentes; save y save as. Save debe funcionar solo cuando el FileName de SaveDialog no este especificado. De otro modo, Save debe llamar a Save as. Si se siente aventurero, trate de hacerlo imprimir (es muy facil). Notara que RichEdit "sabe" imprimir en colores y con sus tipos de letra, sin preocuparse por drivers, etc (lo cual sacara lagrimas de felicidad a todos los que vienen de programar ambientes DOS)...! Buena suerte!