Curso Delphi. Lección 05C  

Send By: Ariel Bustamante
Web : N.A.
Email: N.A.
Date: 30/12/02

Tip accessed 946 times

 


Esta es la continuacion de Leccion 5, por lo tanto no crearemos ninguna carpeta nueva, si no que seguiremos trabajando con el proyecto anterior en la Carpeta Leccion5.
La continuación de este proyecto solo es posible con versiones de Delphi de la 2 en adelante.
Vamos a acabar la Form Facerca. Colocaremos cuatro Labels la Label1 y a su derecha la Label2, debajo de estas la Label3 y a su derecha la Label4























Componente

Caption


Label1 HD Libre
Label2 (sin texto)
Label3 RAM
Label4 (sin texto)


Y en el OnCreate de FAcerca ponemos:


 var
   Porcentaje : LongInt;
   MS        : TMemoryStatus;
 begin
 Porcentaje := DiskFree(0) div (DiskSize (0) div 100);
 Label2.Caption := IntToStr (DiskFree(0) div 1024000)
                    + ' Mb (' + IntToStr(Porcentaje) + ' %)';
 GlobalMemoryStatus (MS);
 Label4.Caption := IntToStr (MS.dwTotalPhys) + '  bytes total,   '
                  + IntToStr (MS.dwAvailPhys) + 'bytes libre';
 end;




Podríamos estar un buen rato explicando que hemos escrito aquí, pero lo más seguro que acabaríamos enredándonos aún más, de momento con un poco de observación entenderás que esta sintaxis es para que Label2 nos devuelva el valor de la memoria libre del HD y la Label4 el de la memoria RAM. Si decides profundizar tu teoría sobre Delphi verás que todo lo aquí escrito es un juego de niños, si no guárdate esta sintaxis en tu biblioteca de "recursos" para otra oportunidad. Si quieres sofisticar aún más a FAcerca puedes recurrir a varios trucos de Trucomanía por ej: el 281, el 280, el 139, el 138, el 261 etc.
Vamos a FEditor.

FEditor/BorderIcons y BorderStyle igual a las demás Forms. Paleta/Standard coloca un MainMenú en FEditor. Este no es otro que el clásico menú desplegable tan común en casi todas las aplicaciones, componente invisible en tiempo de ejecución pero que nos permite editar todos los menús desplegables que sí estarán visibles en la aplicación.
Vamos a diseñarlo según nuestras necesidades, haz doble clic sobre el componente y se abrirá la ventana FEditor MainMenu, ahora el Inspector nos muestra su nombre en blanco tanto en la Propiedad/Name como en la ventana principal del inspector, en Name escribimos MenuArchivo, pulsa Intro y verás que en la ventana superior ya aparece MenuArchivo-TMenuItem en el Caption vamos a poner. &Archivo, ya vemos el primer Item de este menú, haz un clic en el Item Archivo de la Form y se desplegará un nuevo contenedor debajo de este, a su Caption ponle &Nuevo clica Intro y otro contenedor aparecerá debajo, (observa que esté sombreado en azul, si no lo sombrearás haciendo clic sobre él) sigue con el mismo procedimiento y escribe: &Abrir ; continúa y al siguiente ponle solo el signo de menos - y pulsa Intro y habrás creado una línea de separación entre ese grupo de Items y el que viene a continuación. Continúa con &Guardar,
G&uardar Como..., otra línea de separación y continúas con &Salir y ya tenemos acabado el primer grupo de Items. Ahora clica sobre el rectángulo punteado que está a la derecha de Archivo y en la Propiedad/Name pones: MenuEdicion y en su Caption &Edición, comienza como en el menu Archivo y escribe: Diseño del documento y luego una línea de separación ( - ) luego continuamos con los siguientes menús pero en este oportunidad agregándoles a los mismos un atajo de teclado que no es otro que la Propiedad/ShortCut que por defecto nos aparece en "none", pero si desplegamos esa ventana encontraremos una infinidad de combinaciones de teclas para adicionarle al menú. por ejemplo para el menú Copiar sería la clásica Ctrl+C. A continuación el listado del resto de los menús para el MenuEdicion:

Copiar Ctrl+C
Cortar Ctrl+X
Pegar Ctrl+V
línea de separación ( - )
Seleccionar Todo Ctrl+E
línea de separación ( - )
Borrar Ctrl+Z (este no es convencional, me lo acabo de inventar)

Volvemos al Menú Diseño del Documento y crearemos un SubMenú, un vez posicionados en Diseño del Documento, clicamos con el botón derecho del ratón y nos aparece un menú de opciones, clicamos sobre Create SubMenú y nos aparece un menú sombreado sin texto, en su Caption escribimos: Color de Fondo, clicamos Intro y ponemos una línea de separación, clicamos Intro y escribimos: Fuente de Letra, clicamos Intro y ponemos otra línea de separación, en el siguiente escribimos: Alineación de Texto y aquí en Alineación de Texto creamos otro submenú otra vez clicando el botón derecho del ratón y escribimos:

A la Izquierda
Centrado
A la Derecha

Una vez acabado y antes de proseguir, pasa el WindowsState de FEditor a wsMaximized, guarda y ejecuta el proyecto para ver en tiempo de ejecución el funcionamiento de tu Menú. Volvemos a fase de diseño y continuamos con otro menú a la derecha de MenuEdicion.
La siguiente columna es Name/MenuBusqueda y Caption/Búsqueda y su único Item es Buscar, una vez escrito Buscar pulsa Intro y vuelve el foco a Buscar, allí crearemos otro submenu, en la primer línea del submenú pon: Buscar un texto, clica Intro y en la segunda pon: Remplazar un texto. Ya tienes tu tercer Submenú creado. Vamos a un nuevo menú.
Clica a la derecha de Búsqueda y escribe: &Impresión en el Caption y MenuImpresion en el Name, debajo de &Impresión escribe Configurar Impresora y debajo de este Imprimir con el atajo Ctrl+P. Otro nuevo menú.
A este de Name le pondremos MenuAyuda y de Caption: A&yuda, debajo escribimos: Ace&rca de.... y debajo de este &Ayuda, clica sobre la Form, desaparece el editor y nuestro menú se ha acabado en su etapa de diseño. De momento solo estamos en condiciones de escribir dos eventos. Abre el MenúArchivo, selecciona Salir y en su evento OnClick cerraremos a FEditor devolviéndole el protagonismo a FCaratula:


 FCaratula.Show;



El siguiente evento que podríamos escribir sería para Acerca de...., busca este Item en el Inspector y en su evento OnClick escribe una sintaxis para mostrar a FAcerca. Lo dejo por tu cuenta, no sin antes advertirte que si no has fallado al compilar aparecerá el famoso aviso de que Delphi te va a incluir en la clausula Uses etc., si no logras dar con el código para este evento tienes dos opciones, o miras el evento que acabas de escribir para el Item Salir o consulta el código fuente del final. Acabado y probados en tiempo de ejecución los dos únicos eventos escritos, volvemos a diseño y vamos a colocar un Panel en FEditor. Panel1/Name/PanelSuperior. PanelSuperior/Height 33. PanelSuperior/Align/alTop y le borramos el Caption. las propiedades BevelInner, BevelOuter, BevelWidth, BorderStyle y BorderWidth las ajustas a tu gusto. Ahora de la pestaña Win32 tomamos un StatusBar y lo colocamos en FEditor, por defecto se alinea alBottom, y toma el Width de la Form, cámbiale el Height a 25 y observa que la Propiedad/SimplePanel esté en False, si no cámbiala.

StatusBar es una barra de información al usuario muy vista en infinidad de programas, a diferencia del Panel tiene la peculiaridad que puede dividirse en varios paneles de información por medio de la Propiedad/Panels. Para crear un SubPanel, basta con pulsar en la Propiedad/Panels y escoger el botón AddNews en el editor de paneles que aparecerá, aquí puede introducirse el texto que se desee y los atributos de dicho texto. Para este caso en la Propiedad/Text pondremos " 00: 00 ", es decir no ponemos las comillas (son orientativas de distancia nada más), hacemos 2 espacios, doble cero, dos puntos, doble espacio, doble cero, doble espacio y confirmamos con Intro No se preocupen de este pequeño lío de momento, para cuando tengamos todo funcionando, acabarán de comprender que hemos hecho aquí, aunque si observan la Ficha alguna idea les dará.
Los SubPaneles se enumeran desde cero, ahora vamos con el uno donde con AddNews crearemos el 1 y en su texto pondremos: " Estado " y su Width se lo fijamos en 150 y para el 2 solamente lo creamos con AddNews y no escribimos nada, ya tenemos nuestro StatusBar con sus tres subpaneles. Tiene una Propiedad/BorderWidth, Color y Font que te las dejo a tu libre elección. Vamos a conocer la síntaxis que nos permite escribir en un panel de StatusBar. Escribe en el OnActivate de FEditor:


 StatusBar1.Panels[2].Text := ' My Word 1.0 activado';



Que 'My Word 1.0 activado' sea el texto del Panel2 de StatusBar1(el número del panel siempre entre llaves) , verás que no hay casi diferencia con un Caption o el Text de un Edit.
Ejecuta y comprueba el resultado, luego borra esta síntaxis del OnActivate porque el uso de este Panel será el mostrar las indicaciones de OnHint de cualquier componente que posea este evento. Para refrescar la información sobre el panel debe activarse un suceso denominado OnHint y que pertenece al componente Application. En primer lugar debemos crear un procedimiento público que se denominará DisplayHint. Vete a la cabecera de la UnitEditor y debajo de


 public
 {public declarations}     //escribes:
 procedure DisplayHint (Sender: TObject);



y luego en el OnCreate de FEditor escribes:

 Application.OnHint := DisplayHint;



por último debemos escribir el procedimiento DisplayHint en la sección implementation de UnitEditor debajo de


 uses UnitPassword, UnitCaratula, UnitAcerca;

 {$R *.DFM}  //escribes:

 procedure TFEditor.DisplayHint(Sender: TObject);
 begin
 StatusBar1.panels[2].Text := Application.Hint;
 end;



Y pensar que todo esto te lo hace Delphi con cada componente que colocas en la Form, pero esta vez el procedimiento (DisplayHint) te lo has creado tú para manejar el suceso OnHint y te ha tocado a tí la faena. Continuando, para que este suceso funcione necesitamos escribir algún texto en la propiedad Hint de los diferentes componentes que tenemos hasta ahora en FEditor y como lo único que tenemos son los menús vamos a ellos comenzando por el menú Archivo, clica sobre Archivo y en la ventana superior del inspector desplega la lista y busca a Nuevo1 que es nuestro primer submenú, en la Propiedad/Hint deja dos espacios
en blanco y escribe.

Crea un documento nuevo.

Clica Intro y busca el siguiente que es Abrir1 (recuerda que esta ventana está por orden alfabético) luego de dos espacios
en blanco allí escribe:

Abre un documento.

Para el resto escribes:

Guardar1: Guarda el documento.
GuardarComo1: Guarda el documento y selecciona carpeta.
Salir1: Cierra My Word

esto es solo una idea, tú puedes escribir lo que quieras y ahora que ya has escrito estos te dejo en libertad de escribir todos los restantes con el texto que más te apetezca. Ejecuta y prueba lo realizado. Volvemos a diseño.
Pestaña/Win32, busca RichEdit y colócalo en la Form, ajusta su Propiedad/Align alClient. Propiedad/Lines, clica sobre el botón de tres puntos, se abre el String List editor y allí igual que con el Memo le borras el texto, observa que ponga " 0 Lines " y clica OK.
Aunque permite la entrada de múltiple líneas de texto, uno de los grandes inconvenientes del componente Memo utilizado con anterioridad, es que no admite diferentes atributos para cada párrafo o carácter escrito por el usuario, es decir que está limitado a su forma de texto plano donde sus atributos son globales y por tanto se aplican a la totalidad de su contenido. A partir de Delphi 2 Borland incorporó el componente RichEdit que es capaz de trabajar con diferentes párrafos por separado, tipos de letra y justificaciones. Aunque el texto escrito se almacena en una propiedad Lines igual que el Memo, la elasticidad de RichEdit difiere en mucho a la del Memo, en cada párrafo se dispone de una serie de atributos que permiten controlar la alineación, la indentación, las marcas del tabulador y la existencia o no de viñetas.
Ahora en la Pestaña/Aditional busca SpeedButton y coloca ocho de ellos en el PanelSuperior, céntralos en el Panel primero un grupo de cinco y luego con una separación considerable un grupo con los tres restantes, vamos a darle nombre:





















































































Componente

Name

Caption

Propiedad

/Margin
Propiedad

GroupIndex
Propiedad

AllowAllUp
SpeedButton1 SPNegrita

N Font/Style/fsBold

  1 TRUE
SpeedButton2 SPCursiva

C Font/Style/fsItalic

  2 TRUE
SpeedButton3 SPSubrayada

S Font/Style/fsUnderline

  3 TRUE
SpeedButton4 SPTachada

TA Font/Style/fsStrikeOut

  4 TRUE
SpeedButton5 SPNormal

NO Font/Style/ []

  5 TRUE
SpeedButton6 SPIzquierda

= Font/12/Negrita

0 6 FALSE
SpeedButton7 SPCentro

= Font/12/Negrita

5 6 FALSE
SpeedButton8 SPDerecha

= Font/12/Negrita

10 6 FALSE



La Propiedad/Margin es nada más que para que el signo = vaya a la izquierda, derecha o centro del botón. SpeedButton es otro de los varios botones disponibles en Delphi.. A diferencia del Button o el BitBtn este tiene la peculiaridad de quedar hundido una vez clicado y volver a su estado normal con otro clic.
Una de sus características es la Propiedad/GroupIndex, observa que los cinco primeros la tienen en un valor que va del 1 al 5 y los tres restantes tienen el mismo valor 6. Eso quiere decir que los cinco primeros funcionarán como un grupo pudiéndose quedar hundidos los cinco al mismo tiempo (a excepción del
SPNormal que para eso escribiremos un código) en cambio los tres restantes al tener el valor igual (todos en 6) funcionarán como un grupo donde un clic sobre
uno de ellos hunde a este y vuelve a normal al anteriormente hundido.
Ponles a todos un texto Hint acorde con la función que van a realizar, los SpeedButtons del 1 al 5 asignarán un estilo de fuente y los del 6 al 8 alinearán el texto, escribe todos los Hint sin pasar la propiedad/ShowHint a True, porque si no caeríamos en la redundancia de mostrar el globo hint con el mismo mensaje que aparece en el del StatusBar. Estos botones van a realizar tareas que también asignamos a los menús, cualquier aplicación que se precie de bien diseñada no puede
obviar una barra de botones rápidos que eviten al usuario desplegar menús para cada cosa que quiera modificar.

Sintaxis para los diferentes eventos OnClick:

SPNegrita

 RichEdit1.Font.Style := [fsBold];
 SPNormal.Down := False;



SPCursiva

 RichEdit1.Font.Style := [fsItalic] ;
 SPNormal.Down := False;



SPSubrayada
SPTachada estos dos los dejo por tu cuenta. Aunque aparecen en el texto de la Unit.

SPNormal

 RichEdit1.Font.Style := [] ;
 SPNegrita.Down := False;
 SPCursiva.Down := False;
 SPTachada.Down := False;
 SPSubrayada.Down := False;



Cada botón asigna un Style y pasa a estado normal el botón SPNormal en el caso que este estuviera hundido usando la Propiedad/Down del SpeedButton en True hunde el botón y en False lo normaliza. El SPNormal asigna este estilo y normaliza el resto de botones. Ahora vamos con los botones de alineación, este mismo código que escribiremos aquí lo tendremos que escribir también en el evento OnClick del menú Edición/Diseño del documento/Alineación del texto que hemos diseñado.
SPIzquierda

 RichEdit1.Paragraph.Alignment := taLeftJustify;



SPCentro

 RichEdit1.Paragraph.Alignment := taCenter;



SPDerecha

 RichEdit1.Paragraph.Alignment :=  taRightJustify;



Vamos a la Pestaña/Dialogs y de allí cogeremos para depositar en la ficha: un OpenDialog, un SaveDialog, un FindDialog, un ColorDialog, un FontDialog,
un ReplaceDialog, un PrintDialog y un PrinterSetUpDialog. De la Pestaña/Additional cogemos un BitBtn para depositarlo en el PanelSuperior en el margen
derecho. Caption : Cerrar y Propiedad/Kind : bkClose y le escribes un código para que cierre a FEditor.
Ahora escribiremos todos los códigos correspondientes a los eventos OnClick de los diferentes menús.
MenuArchivo

Nuevo

 RichEdit1.Clear;



Abrir

 OpenDialog1.Execute;
  if OpenDialog1.Execute then
   begin
     RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
 end;



Observa que hemos escrito un end; mas, esto se debe a que tenemos dos begin .
Aquí estamos ejecutando a OpenDialog1 para que cargue el archivo (LoadFromFile) que seleccionemos en la ventana de OpenDialog, para ello hemos de
Hacer algún retoque en las Propiedades de OpenDialog1. En Propiedades/Filter clica el botón y abre el Filter Editor, allí escribiremos:

Columna Filter Name Columna Filter

Rich Text Format *.rtf *.rtf
Archivos de Texto *.txt *.txt
Todos los Archivos *.* *.*

Aquí nos estamos refiriendo a tres extensiones de archivo que son las opciones que aparecerán en el combo desplegable de la ventana OpenDialog, como
supondrás este editor no tiene límites, puedes poner cuantos nombres y extensiones de archivos te apetezcan, otra cosa es que tu aplicación sea capaz de
abrirlos, vamos a la Propiedad/InitialDir y escribe:

C:\Mis Documentos, o cualquier otra ruta que quieras que aparezca por defecto al ejecutar el OpenDialog.

Guardar

 RichEdit1.Lines.SaveToFile(FFileName);



Aquí estamos haciendo mención a FFileName, si compiláramos nos aparecería un aviso de error puesto que FFileName no está aún declarado, vamos a declarar
esta variable en la parte Private de la Unit para que sea accesible a cualquier componente, ve a la parte superior de la Unit y allí debajo de Private escribe:

  FFileName: String;  (esta variable String aparece explicada en el Bloque de teoría).



Guardar como

   if SaveDialog1.Execute then
   begin
     if FileExists(SaveDialog1.FileName) then
       if MessageDlg(Format('Sobrescribir %s', [SaveDialog1.FileName]),
         mtConfirmation, mbYesNoCancel, 0) <> idYes then Exit;
     RichEdit1.Lines.SaveToFile(SaveDialog1.FileName);
     SetFileName(SaveDialog1.FileName);
 end;



Aquí ejecutamos a SaveDialog1 por lo tanto debemos modificarle las mismas Propiedades que a Opendialog edita el Filter Editor y la Propiedad/InitialDir
como en OpenDialog.
También hacemos mención a SeTFileName que será el procedimiento que nos creará el archivo, para ello debemos declarar el procedimiento. En Private debajo de la variable que escribistes has de poner:

 procedure SetFileName(const FileName: String);


Y debajo de: {$R *.DFM}


 procedure TFEditor.SetFileName(const FileName: String);
 begin
   FFileName := FileName;
   Caption := Format('%s - %s', [ExtractFileName(FileName), Application.Title]);
 end;



Salir
Este ya no es necesario explicarlo.