Está en la página 1de 83

Delphi 7

Ferm Vil

79

III . - Programacin Visual

a) El IDE del Delphi - Men File New - Application - Observa la pantalla inicial:

Todo este conjunto de elementos determina lo que se llama un Entorno integrado de desarrollo o IDE (Integrated Development Environment), en nuestro caso se trata del IDE del Delphi. Delphi combina la facilidad en el uso de su IDE con la velocidad y potencia de un compilador optimizado de 32 bits y las posibilidades de la manipulacin de datos proporcionadas por su potente motor de bases de datos.

b) Programar en Delphi - Men File New - Application - Clic en el icono Edit (Solapa: Standard) de la paleta de componentes:

Delphi 7

Ferm Vil

80

- Marca un pequeo recuadro en el formulario. - Clic en el icono Button (Solapa: Standard) de la paleta de componentes. - Clic en el punto del formulario donde quieres insertar el botn. - Inserta otro botn, es decir: Clic en el icono Button (Standard). Clic en un punto del formulario - Mueve y cambia el tamao de los controles de forma que te quede aproximadamente de la siguiente manera:

Vamos a establecer las propiedades - Selecciona el formulario, es decir haz clic en cualquier punto del interior del Form1. Observa que en la ventana Object Inspector aparecen las propiedades del formulario. - Cambia las siguientes propiedades: Caption: Saludo Color: clWhite - Selecciona el Button1 (automticamente en el Object Inspector aparecen las propiedades del button1) y cambia las propiedades: Caption: Saludo Name: butSaludo Clic en el + de Font Clic en el + de Style fsBold: True - Cambia las siguientes propiedades del button2: Caption: Borrar Name: butBorrar Font(+): Style(+): fsBold: True - Cambia las siguientes propiedades del Edit1: Font(+): Style(+): fsItalic: True Text: (borra el texto Edit1, que aparece por defecto) Vamos a escribir el cdigo: - Selecciona el botn [Saludo]. En el Object Inspector haz clic en la pestaa Events. Sitate en el campo OnClick y haz un doble clic en su interior.

Delphi 7

Ferm Vil

81

Acabamos de acceder al procedimiento de evento: OnClick (al hacer clic) del botn [Saludo], en efecto, observa su nombre: procedure TForm1.butSaludoClick(Sender: TObjet); Escribe entre las lneas begin y end: Edit1.Text:= Hola Mundo; - Sal del Editor de Cdigo, es decir vuelve al formulario. Basta que hagas clic en el borde superior: clic

- Accede al procedimiento OnClick del botn [Borrar] y escribe: procedure TForm1.butBorrarClick(Sender: TObject); begin Edit1.Text:=''; end; - Graba el mdulo como Unit068.pas y el proyecto como Project068.dpr, en TuCarpeta - Ejecuta el programa, es decir: Clic en el icono Run: Clic en [Saludo] Si todo funciona correctamente aparecer en el cuadro de texto (Edit1), las palabras Hola Mundo; ya que en el procedimiento correspondiente hemos escrito:: Edit1.Text := Hola Mundo; Es decir: Al hacer clic en el botn [Saludo] (butSaludoClick), el valor de la propiedad Text del Edit1 es Hola Mundo (Edit1.Text : = Hola Mundo;) Clic en [Borrar] Si todo funciona correctamente, el contenido del cuadro de texto desaparece; ya que en el procedimiento de evento correspondiente hemos escrito: Edit1.Text := ; Es decir: el contenido (propiedad Text) del cuadro de texto es igual a nada.

- Para salir del programa Saludo, haz clic en la X del extremo superior derecho de la ventana Saludo. En definitiva, programar en Delphi significa: 1.- Insertar en el formulario (o formularios) controles de la paleta de componentes (de sus diversas pestaas).

Delphi 7

Ferm Vil

82

2.- Establecer o cambiar las propiedades de los diversos componentes insertados utilizando el Inspector de Objetos. 3.- Escribimos el cdigo en el mdulo o unit del formulario, utilizando el lenguaje de programacin ObjectPascal. Uno de los aspectos ms importantes en el cdigo, ser el acceso a las propiedades de un control: NombreComponente.Propiedad := nuevo valor; En nuestro ejemplo: Edit1.Text := Hola Mundo; Observa el uso del llamado operador punto.

c) Ficheros que genera un programa Localiza los ficheros generados en la aplicacin anterior: - Cierra el Delphi - Ejecuta el Explorador de Windows y sitate en TuCarpeta - Observa: Project068.cfg Projecto68.dof Project068.dpr Project068.exe Project068.res Unit068.dcu Unit068.dfm Unit068.pas

- El programa ejecutable: Project068.exe Desde el explorador de windows, ejecuta el Project068.exe (clic-clic). Si todo funciona correctamente se ejecutar nuestro programa. De hecho es el nico fichero que necesitamos, si borrramos los otros ficheros, funcionaria exactamente igual, y si instalamos el fichero Project068.exe en un ordenador sin Delphi, por supuesto funcionaria igual. - El archivo de proyecto: Project068.dpr Ejecuta el Delphi y abre el Project068.dpr Delphi relaciona todos los elementos de un proyecto generando un mdulo de cdigo, que se almacena en un archivo con extensin DPR. Es a ste al que se llama archivo de proyecto. Para visualizarlo basta que hagas: Men Project - View Source program Project068; uses Forms, Unit068 in 'Unit068.pas' {Form1}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1);

Delphi 7

Ferm Vil

83

Application.Run; end. Como es un fichero de texto, podramos editarlo desde fuera del Delphi, con el Bloc de Notas del Windows, por ejemplo. Su estructura bsicamente es: program NombreDelPrograma; Una referencia a cada uno de los archivos que almacenan los mdulos de cdigo, tras la clusula Uses Una llamada al mtodo CreateForm() por cada formulario (form) a crear. La ejecucin del programa se lleva a cabo en el momento en que se llama al mtodo Run()

- Mdulos de cdigo: Unit068.pas Son tambin ficheros de texto. Cada formulario tiene asociado un mdulo de cdigo o unidad (unit en ingls). Como ya hemos visto la finalidad de este fichero es contener el cdigo correspondiente al form, en nuestro ejemplo: procedure TForm1.butSaludoClick() y TForm1.butBorrarClick() Cada vez que se aade un nuevo formulario, se aade automticamente un nuevo mdulo de cdigo. - Archivo de formulario: Unit068.dfm Para cada formulario, los controles (componentes), valores de sus propiedades y los enlaces de los eventos con el cdigo, se almacenan en un fichero de nombre el mismo que el mdulo de cdigo del form y extensin DFM. No hay ningn problema para visualizar este fichero, ya que tambin (igual que los anteriores) es de texto. Los tres ficheros: Project068.dpr, Unit068.pas, Unit068.dfm son los ficheros que necesitamos para posibles modificaciones futuras. El resto de ficheros se generan al ejecutar el programa desde el Delphi y en definitiva el ejecutable Project068.exe es el nico imprescindible, sino disponemos del entorno Delphi En nuestro trabajo normal con el Delphi, observaremos que se generan otros ficheros: si corregimos algn procedimiento y/o si cambiamos algo del formulario. Los ficheros antiguos se guardan con la extensin ~pas (si hemos cambiado alguna cosa del cdigo) y/o ~dfm (si hemos cambiado alguna cosa del formulario).

Delphi 7

Ferm Vil

84

d) Propiedades y Mtodos - Men File New - Application - Primero: Insertar controles (Observa que utilizo indistintamente la palabra control y componente). Inserta:

Para la etiqueta Label1 debes utilizar el icono Label (Standard): - Segundo: Establecer las propiedades Form1 Caption: Saludo Personalizado Label1 Caption: Escribe tu nombre: Edit1 Text: (borra el texto Edit1) Edit2 Text: (borra el texto Edit2) Button1 Caption: Saludo Button2 Caption: Borrar Button3 Caption: Salir - Tercero: Escribir el cdigo Evento: OnClick del Button1 procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text:='Hola '+Edit1.Text; end; Evento: OnClick del Button2 procedure TForm1.Button2Click(Sender: TObject); begin Edit1.Text:=''; Edit2.Text:='';

Delphi 7

Ferm Vil

85

Edit1.SetFocus; end;

Evento: OnClick del Button3 procedure TForm1.Button3Click(Sender: TObject); begin Close; end;

- Graba el programa como Unit069.pas Project069.dpr y ejectalo. - Estudio del Project069: Close: es la sentencia equivalente a cerrar el formulario Edit1SetFocus: el cursor se colocar (el foco) en el componente Edit1 - Propiedades y Mtodos

Un control, componente o objeto (llmale como quieras) consta de: Propiedades (o atributos): que determinan las caractersticas del objeto: color, nombre, etc. Mtodos (o funciones): que determinan acciones del usuario o del sistema; no son ms que funciones del objeto. Por ejemplo SetFocus es un mtodo del componente Edit (y de otros componentes), cuya accin consiste en colocar el cursor (el foco del programa) en el componente.

La forma de acceder a una propiedad o a un mtodo es la misma: NombreObjeto.NombrePropiedadOMtodo Otra diferencia fundamental entre propiedad y mtodo es que podemos acceder a una propiedad desde tiempo de diseo (cuando establecemos valores en el Object Inspector), o desde tiempo de ejecucin (cuando escribimos una sentencia que modifica la propiedad en un procedimiento determinado). En cambio slo podemos acceder a un mtodo en tiempo de ejecucin.

e) Eventos Los eventos, al igual que las propiedades y los mtodos, son miembros de un componente. La diferencia entre una propiedad y un evento es que, un evento contiene referencias a procedimientos. Todos los procedimientos asociados a eventos reciben, como primer parmetro, un objeto Tobject llamado Sender. Esta variable es una referencia al objeto que ha generado el evento, variable que podemos usar para acceder a sus propiedades, eventos y mtodos.

Delphi 7

Ferm Vil

86

Hasta ahora hemos utilizado un nico evento y del componente Button, concretamente el evento OnClick (al hacer clic). Al hacer un doble clic en su evento onClick (Object Inspector pestaa Events), accedemos automticamente al procedimiento de evento: TForm1.Button1 Click (Sender:Tobject), que se encuentra en el rea implementation de la ventana de cdigo correspondiente al formulario. Vamos a trabajar con otros eventos - Men File New - Application - Inserta un control Button en el formulario, hazlo relativamente grande para que quepa la frase: Acabas de clicar el formulario, pero no cambies de momento su propiedad Caption. - Selecciona el Form1 Accede al Inspector de Objetos, pestaa Events Haz un doble clic en el campo correspondiente a OnClick Si todo funciona correctamente nos hemos colocado en el mdulo del formulario, procedimiento de evento: TForm1.FormClick() - Escribe: procedure TForm1.FormClick(Sender: TObject); begin Button1.Caption:='Acabas de clicar el formulario'; end; - Selecciona el Button1 Inspector de Objetos, pestaa Events Clic-clic en el evento OnMouseMove Escribe: procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin ShowMessage('Acabas de pasar el ratn por encima del botn'); end; - Selecciona el Form1 Inspector de Objetos, pestaa Events Clic-clic en el evento OnResize Escribe: procedure TForm1.FormResize(Sender: TObject); begin Button1.Caption:='Acabas de Redimensionar el formulario'; end; - Escribe el siguiente procedimiento de evento: procedure TForm1.FormDblClick(Sender: TObject); begin

Delphi 7

Ferm Vil

87

Form1.Caption:='Doble clic en el formulario'; end; Es decir, debers acceder al evento OnDblClick del formulario. - Graba el programa como Unit070.pas Project070.dpr y ejectalo, es decir prueba los eventos: Al hacer clic en el formulario (TForm1.FormClick) Al mover el ratn por el botn (TForm1.Button1MouseMove) Al cambiar el tamao del formulario (TForm1.FormResize) Al hacer doble clic en el formulario (TForm1.FormDblClick)

f) La funcin RGB( , , ) Utilizando la funcin incorporada RGB(x,y,z) con x,y,z nmeros entre 0 y 255, podemos acceder al color de un objeto, siendo x el componente rojo (red), y el componente verde (green) y z el componente azul (blue). - Men File New - Application - Inserta un Edit en el formulario Queremos conseguir lo siguiente: al hacer clic en el formulario, ste cambia de color aleatoriamente, utilizando la funcin RGB( , , ) y en el Edit aparece el grado de rojo, verde y azul del color correspondiente. Para ello basta que escribas el siguiente procedimiento de evento: procedure TForm1.FormClick(Sender: TObject); var x,y,z:integer; begin Randomize; x:=Random(255);y:=Random(255);z:=Random(255); Form1.Color:=RGB(x,y,z); Edit1.Text:='Rojo= '+IntToStr(x)+' , '+ 'Verde= '+IntToStr(y)+' , '+ 'Azul= '+IntToStr(z); end; - Graba el programa como Unit071.pas Project071.dpr y prubalo.

g) Teclas de acceso rpido

Delphi 7

Ferm Vil

88

Si escribimos el ampersand (&) en la propiedad Caption de un Button, por ejemplo: &Tecla, en el botn correspondiente aparecer la T subrayada. Y si en tiempo de ejecucin pulsamos: [Alt][t], es equivalente a hacer clic en el botn. - Men File New - Application - Inserta:

- Propiedades: Form1 Label1

Caption: Contrasea Caption: Introduce la clave secreta Alignment: taCenter

Edit1 Text: (borra el texto que aparece por defecto) MaxLength: 6 PasswordChar: * Button1 Caption: &Aceptar Button2 Caption: &Salir

- Escribe los siguientes procedimientos de evento: procedure TForm1.Button1Click(Sender: TObject); begin if Edit1.Text<>'PEPITO' then begin ShowMessage('No es correcto'); Form1.Close; end else ShowMessage('Lo has acertado'); end;

Delphi 7

Ferm Vil

89

procedure TForm1.Button2Click(Sender: TObject); begin Form1.Close; end; - Graba el programa como Unit072.pas Project072.dpr y ejectalo. Prueba el funcionamiento de los botones: utilizando el ratn y tambin por pulsacin de las teclas: [Alt][A] y [Alt][S] - Estudio del Project072: Supongo que est claro que la contrasea es PEPITO (en maysculas) Alignment = taCenter Centra el texto en el recuadro de la etiqueta, las otras posibilidades son: taLeftJustify (justificado a la izquierda) y taRightJustify (justificado a la derecha). Si queremos que el texto se divida automticamente en varias lneas, respetando el ancho que asignemos a la etiqueta, deberemos cambiar el valor de la propiedad wordWrap a true. MaxLength: 6 Podemos escribir un mximo de 6 caracteres en el control Edit correspondiente. Por defecto, el control Edit no pone ningn lmite a la cantidad de texto. La propiedad MaxLength contiene por defecto el nmero 0, indicando de esta forma que no hay lmite establecido. PasswordChar: * De esta forma conseguimos que el control Edit vaya representando cada uno de los caracteres que escribimos como un * Las teclas de acceso rpido, es decir: En tiempo de diseo: &letra = letra subrayada En tiempo de ejecucin: [Alt][letra] No son exclusivas del button como iremos viendo.

h) Evento: OnShow En lugar de establecer las propiedades iniciales de los controles, en tiempo de diseo, podemos establecerlas en tiempo de ejecucin, utilizando el evento OnShow (al mostrar) del formulario. - Men File New - Application - Inserta un label y un button - Con el formulario seleccionado Inspector de Objetos pestaa Events Clic-clic en OnShow - Escribe: procedure TForm1.FormShow(Sender: TObject); begin Form1.Caption:='El Evento OnShow'; Button1.Caption:='Cambia Color';

Delphi 7

Ferm Vil

90

With Label1 do begin Caption:='Intercambiar colores'; Color:=clLime; Font.Size:=25; Font.Color:=clRed; end; end; - Cdigo del OnClick del Button1: procedure TForm1.Button1Click(Sender: TObject); var x:integer; begin x:=Label1.Color; Label1.Color:=Label1.Font.Color; Label1.Font.Color:=x; end; - Graba el programa como Unit073.pas Project073.dpr y ejectalo

i) Evento: OnKeyPress Este evento nos permite detectar la tecla que pulsamos. - Men File New - Application - Inserta dos Edits y un Button - Corrige la propiedad Caption del Button, por &Button - Escribe los siguientes procedimientos:

Evento: OnKeyPress del Edit1 procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (Key In ['0'..'9',#8]) then Key:=#0; end; Evento: OnClick del Button1 procedure TForm1.Button1Click(Sender: TObject); begin Randomize; Form1.Color:=RGB(Random(255),Random(255),Random(255)); end;

Delphi 7

Ferm Vil

91

Evento: OnKeyPress del Edit2 procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 then Button1Click(Sender); end;

- Graba el programa como Unit074.pas Project074.dpr y ejectalo. - Estudio del Project074 En el Edit1 slo podemos escribir un nmero entero, ya que en el procedimiento correspondiente le estamos diciendo que si la tecla pulsada no es del 0 al 9 ni la tecla de borrado (#8), entonces anula el carcter (Key:=#0) Al pulsar [Return] (tecla de cdigo 13) en el Edit2, se ejecuta el procedure Button1Click(Sender). Si quieres evitar el Beep al pulsar [Return], deberas modificar el procedimiento Edit2KeyPress de la siguiente forma: procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char); begin if Key=#13 then begin Key:=#0; Button1Click(Sender); end; end; - Vuelve a grabar el programa con el mismo nombre y prubalo.

j) Botn por defecto y de cancelacin Hay dos tipos especiales de botones: los botones que se activan al pulsar [Return] y los que se activan al pulsar [Esc], el primero se llama botn por defecto, el segundo botn de cancelacin. Si la propiedad Default = True, el botn correspondiente ser un botn por defecto Si la propiedad Cancel = True, el botn correspondiente ser un botn de cancelacin - Men File New - Application - Inserta en el formulario un Edit y tres Buttons. - Propiedades: Button1 Button2

Caption: &Normal

Delphi 7

Ferm Vil

92

Caption: &Defecto Default: True Button3 Caption: &Cancelacin Cancel: True

- Escribe los procedimientos: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(Button1.Caption); end; procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage(Button2.Caption); end; procedure TForm1.Button3Click(Sender: TObject); begin ShowMessage(Button3.Caption); end; - Graba el programa como Unit075.pas Project075.dpr y ejectalo: Haciendo clic en los botones Pulsando [Alt] con [N], [D] o [C] Pulsando [Esc] o [Return]

k) Tipos y Estilos de letra - Men File New - Application - Inserta:

- Cdigo: procedure TForm1.Button1Click(Sender: TObject); begin Label1.Font.Name:='Arial';

Delphi 7

Ferm Vil

93

end; procedure TForm1.Button2Click(Sender: TObject); begin Label1.Font.Name:='Courier'; end; procedure TForm1.Button3Click(Sender: TObject); begin Label1.Font.Size:=Label1.Font.Size+4; end; procedure TForm1.Button4Click(Sender: TObject); begin Label1.Font.Size:=Label1.Font.Size-4; end; procedure TForm1.Button5Click(Sender: TObject); begin Label1.Font.Style:=[fsBold]; end; procedure TForm1.Button6Click(Sender: TObject); begin Label1.Font.Style:=[fsItalic]; end; procedure TForm1.Button7Click(Sender: TObject); begin Label1.Font.Style:=[fsUnderline]; end; procedure TForm1.Button8Click(Sender: TObject); begin Label1.Font.Style:=[fsStrikeOut]; end; - Graba el programa como Unit076.pas Project076.dpr y ejectalo.

l) Lotera - Crea un nuevo proyecto con los siguientes objetos y propiedades: Form1 Caption: LOTERA Label1 Caption: Escribe un nmero Edit1 Text: (borra el texto que aparece por defecto)

Delphi 7

Ferm Vil

94

Edit2 Text: (borra el texto) Enabled: False (de esta forma el usuario no podr escribir en el cuadro de texto) Label2 Caption: Ver el elemento nmero: Edit3 Text: (borra el texto) Edit4 Text: (borra el texto) Enabled: False Font.Size: 24

Pretendemos simular un juego de lotera, que funciona de la siguiente forma: el programa sortea 6 nmeros del 1 al 49 y nosotros hemos de adivinar uno de estos nmeros. Antes de continuar, coloca en el formulario seis Edits, donde aparecern los seis nmeros del sorteo; es simplemente para comprobar el funcionamiento del programa, al final los borraremos. En definitiva, de momento tenemos:

- Vamos a declarar en primer lugar, una variable pblica donde guardaremos los 6 nmeros del sorteo. Es decir: Sitate en el Unit del formulario y en el apartado public, escribe: Loteria: array[1..6] of integer; En definitiva, nuestros nmeros de la suerte quedarn representados por loteria[1], loteria[2], , loteria[6]. - Accede al evento OnShow de nuestro formulario y escribe el siguiente procedimiento de evento: procedure TForm1.FormShow(Sender: TObject); var i,j:integer; NumeroSorteado:integer; Trabajar,HaSalido:boolean; begin

Delphi 7

Ferm Vil

95

for i:=1 to 6 do loteria[i]:=0; Randomize; for i:=1 to 6 do begin Trabajar:=True; While Trabajar do begin NumeroSorteado:=Random(49)+1; HaSalido:=False; for j:=1 to i do if NumeroSorteado=loteria[j] then HaSalido:=True; if not HaSalido then begin loteria[i]:=NumeroSorteado; Trabajar:=False; end; end; end; Edit5.Text:=IntToStr(loteria[1]); Edit6.Text:=IntToStr(loteria[2]); Edit7.Text:=IntToStr(loteria[3]); Edit8.Text:=IntToStr(loteria[4]); Edit9.Text:=IntToStr(loteria[5]); Edit10.Text:=IntToStr(loteria[6]); end; - Observa: NumeroSorteado, representa el nmero aleatorio de 1 hasta 49 HaSalido: controla si el nmero sorteado ya ha salido. Trabajar: controla el ciclo while do Si el valor de NumeroSorteado es igual a algn valor de lotera (de los que hemos tirado hasta el momento), entonces HaSalido:= True y NumeroSorteado vuelve a tomar un valor aleatorio entre 1 y 49 Si el valor de NumeroSorteado no ha salido, el valor de lotera es igual a dicho nmero y salimos del bucle while do, ya que damos a Trabajar el valor False. Por ltimo en los seis ltimos cuadros de texto, aparecen los 6 valores de la lotera Ejecuta varias veces el programa para comprobar que los seis valores de la lotera son distintos. - Al escribir un nmero del 1 al 6 en el cuadro de texto Edit3, nos interesa que aparezca en el Edit4 el nmero correspondiente de la lotera Accede al evento OnChange del Edit3 y escribe el siguiente procedimiento:

Delphi 7

Ferm Vil

96

procedure TForm1.Edit3Change(Sender: TObject); var x,elemento:integer; begin if Edit3.Text<>'' then x:=StrToInt(Edit3.Text) else exit; if (0<x) and (x<7) then begin elemento:=loteria[x]; Edit4.Text:=IntToStr(elemento); end; end; - Prueba lo que hemos hecho hasta ahora, es decir: ejecuta el programa y escribe un nmero entre 1 y 6 en el Edit3 - Supongo que est claro el evento OnChange del Edit3: al cambiar el contenido del Edit3 se ejecutar el programa procedure TForm1.Edit3Change() Cada control tiene un evento por defecto, podramos pensar que es el evento ms usual del control. Por ejemplo: en un Button su evento por defecto es OnClick, y en el caso de un Edit es OnChange. La importancia del evento por defecto, est en que accedemos directamente a su procedure sin ms que hacer un doble clic en el control. Recuerda que al principio accedamos al procedure TForm1.Button1Click(), haciendo un doble clic en el Button1, por lo tanto a partir de ahora para acceder al procedure del evento OnChange de un Edit, bastar hacer clic-clic en dicho Edit. Para acabar nuestro programa de lotera: nos interesa que al escribir un nmero del 1 al 49, en el cuadro de texto Edit1 y pulsar [Return], aparezca en el cuadro de texto Edit2 un mensaje indicando si lo hemos adivinado o no - Accede al evento OnKeyDown del Edit1 y escribe: procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var x:integer; adivinado:boolean; begin if Key=13 then begin adivinado:=False; for x:=1 to 6 do if loteria[x]=StrToInt(Edit1.Text) then adivinado:=True; if adivinado then

Delphi 7

Ferm Vil

97

Edit2.Text:='Muy Bien, acertaste' else Edit2.Text:='Lo siento, prubalo otra vez'; end; end; - Graba el programa como Unit077.pas Project077.dpr y prubalo.

m) Proyecto con dos formularios - Men File New - Application - Accede a las propiedades del Form1 y cambia las siguientes propiedades: Caption: Tringulo Name: AREA1 Queremos conseguir:

El proceso a seguir es el siguiente: - Propiedades del Label1 (ttulo): Caption: rea de un Tringulo Font Color: clRed Size: 18 Style: (fsBold, fsItalic = True) Color: clYellow - Tres etiquetas de propiedades: Caption: BASE, ALTURA, REA Font Size: 12 Style: (fsBold, fsItalic = True)

Delphi 7

Ferm Vil

98

- Tres cuadros de texto de propiedades: Font Color: clRed Size: 10 Style: (fsBold = True) ReadOnly: True de esta forma impedimos la edicin del edit. Para imponer las mismas propiedades a varios controles a la vez, basta que los selecciones (manteniendo la tecla de maysculas pulsada o marcando un recuadro con el ratn que los contenga) y cambies las propiedades. - Tres botones de propiedades: Caption: Calcular, Borrar, Crculo Font.Style: (fsBold = True) - Graba el programa: El Unit del formulario AREA1: Unit078a.pas El proyecto como Project078.dpr - Escribe los siguientes procedimientos de evento: Botn [Calcular]: procedure TAREA1.Button1Click(Sender: TObject); var b,h,s:real; begin b:=StrToFloat(InputBox('Tringulo','BASE','')); h:=StrToFloat(InputBox('Tringulo','ALTURA','')); s:=b*h/2; Edit1.Text:=FloatToStr(b); Edit2.Text:=FloatToStr(h); Edit3.Text:=FloatToStr(s); end; Botn [Borrar]: procedure TAREA1.Button2Click(Sender: TObject); begin Edit1.Text:=''; Edit2.Text:=''; Edit3.Text:=''; Button1.SetFocus; end; Evento OnShow del Form1: procedure TAREA1.FormShow(Sender: TObject); begin Edit1.Text:=''; Edit2.Text:='';

Delphi 7

Ferm Vil

99

Edit3.Text:=''; Button1.SetFocus; end; - Graba de nuevo el programa como Unit078a / Project078 y prueba lo que hemos hecho hasta ahora. - Vamos a insertar un nuevo formulario a nuestro proyecto Project078, haz lo siguiente: Men File New Form - Cambia las siguientes propiedades del nuevo formulario: Caption: Crculo Name: AREA2 - Consigue en el nuevo formulario, aproximadamente lo siguiente:

Si quieres mover un control de forma ms fina que lo hace el ratn, basta que lo selecciones y manteniendo pulsada la tecla [Ctrl], muvelo utilizando las teclas del cursor. - Vamos a grabar el nuevo formulario: Con el formulario Crculo seleccionado. Men File Save As File Name: Unit078b.pas - Escribe el siguiente cdigo (en el Unit078b): procedure TAREA2.Edit1Change(Sender: TObject); var r,a,l:real; begin

Delphi 7

Ferm Vil

100

if Edit1.Text<>'' then begin r:=StrToFloat(Edit1.Text); a:=PI*r*r; l:=2*PI*r; Edit2.Text:=FloatToStr(a); Edit3.Text:=FloatToStr(l); end else begin Edit2.Text:=''; Edit3.Text:=''; end; end;

- Graba todo lo que hemos hecho hasta ahora con el mismo nombre: Unit078a, Unit078b, Project078. Para ello basta hacer: Men File Save All - Si ejecutas el programa vers que se ejecuta el formulario AREA1: Tringulo, esto es as porque ha sido el primero y el proyecto toma como formulario principal el primero. El problema que nos queda por resolver es conectar los dos formularios - Desde el formulario AREA1: Tringulo nos interesa ir al formulario AREA2: Crculo (botn [Crculo]). Haz lo siguiente: Selecciona el AREA1: basta que muevas las diversas ventanas que tienes en la pantalla, si no lo consigues haz: Men View Forms Clic en AREA1 Men File Use Unit Selecciona el formulario correspondiente (Unit078b), como es el nico, ya aparece seleccionado. [Ok] - Desde el formulario AREA2: Crculo nos interesa ir al formulario AREA1 (botn [Volver]), por lo tanto: Selecciona el AREA2: Cculo Men File Use Unit Unit078a [Ok] - Vamos por ltimo a programar los botones que nos permitirn pasar de un formulario a otro:

Delphi 7

Ferm Vil

101

Selecciona el formulario AREA1: Tringulo Clic-clic en el botn [Crculo] Escribe: procedure TAREA1.Button3Click(Sender: TObject); begin AREA2.Show; AREA1.Hide; end; Selecciona el formulario AREA2: Crculo Clic-clic en el botn [Volver] Escribe: procedure TAREA2.Button1Click(Sender: TObject); begin AREA1.Show; AREA2.Hide; end;

- Graba de nuevo el programa con el mismo nombre y ejectalo. Ten en cuenta que la forma correcta de salir del programa es cerrar el formulario principal, es decir el AREA1: Tringulo.

n) Formulario Principal Ya hemos visto en el apartado anterior, que en un proyecto con varios formularios. El formulario principal, esto es, el que se ejecuta al ejecutar el proyecto es el primer formulario. A veces nos interesar cambiar el formulario principal, vamos a ver cmo - Men File New - Application - Inserta:

- Men File New - Form - Inserta en el Form2:

Delphi 7

Ferm Vil

102

- Men File New - Form - Inserta en el Form3:

- En estos momentos, el formulario principal es el Form1, pero nos interesa que sea el Form3, haz lo siguiente: Men Project Options Pestaa: Forms En el cuadro combinado MainForm, selecciona Form3 [Ok] - Graba lo que hemos hecho hasta ahora de la siguiente forma: Selecciona el Form3 y Men File Save As File Name: Unit079a.pas Selecciona el Form1 y Men File Save As File Name: Unit079b.pas Selecciona el Form2 y

Delphi 7

Ferm Vil

103

Men File Save As File Name: Unit079c.pas Y por ltimo: Men File Save Project As File Name: Project079.dpr

- Vamos a escribir el cdigo: Selecciona el Form3 y escribe los procedimientos: procedure TForm3.Button1Click(Sender: TObject); begin Form3.Hide; Form1.Show; end;

procedure TForm3.Button2Click(Sender: TObject); begin Form3.Hide; Form2.Show; end; procedure TForm3.Button3Click(Sender: TObject); begin Close; end;

Selecciona el Form1 y escribe: procedure TForm1.Button1Click(Sender: TObject); begin Form1.Color:=RGB(Random(255),Random(255),Random(255 )); end; procedure TForm1.Button2Click(Sender: TObject); begin Form1.Hide; Form3.Show; end;

Selecciona el Form2 y escribe: procedure TForm2.FormActivate(Sender: TObject); // Atencin!: Evento 'OnActivate' del Form2

Delphi 7

Ferm Vil

104

begin Edit1.Color:=RGB(random(255),random(255),random(255)); Edit2.Color:=RGB(random(255),random(255),random(255)); Edit3.Color:=RGB(random(255),random(255),random(255)); end; procedure TForm2.Button1Click(Sender: TObject); begin Form2.Hide; Form3.Show; end; Y por ltimo vamos a establecer las conexiones estre los formularios: - Form3 (formulario Principal) [Color Total] Form1 [Colorines] Form2 Por lo tanto: Selecciona el Form3 Men File Use Unit Unit079b Unit079c - Form1 [Volver] Form3 Por lo tanto: Selecciona el Form1 Men File Use Unit Unit079a - Form2 [Volver] Form3 Por lo tanto: Selecciona el Form2 Men File Use Unit Unit079a - Graba los ficheros del programa con los mismos nombres y prubalo.

o) El componente Timer Todos los componentes que conocemos por ahora son componentes de tipo interactivo, es decir componentes con los que es posible interactuar en tiempo de ejecucin.

Delphi 7

Ferm Vil

105

Otro tipo de componente es el Timer (paleta System), cuya nica finalidad es generar un evento a intervalos regulares. La frecuencia con la que el componente Timer generar el evento OnTimer depender del valor de su propiedad Interval, que por defecto es 1000 milisegundos. Al igual que otros componentes, ste tambin cuenta con la propiedad Enabled, que nos permite desactivar el control, evitando de esta forma la generacin del evento. - Men File New - Application - Inserta un label con la propiedad Font, Size = 24 - Inserta un timer, es decir: Accede a la paleta de componentes System Clic en el icono Timer: Clic en cualquier punto del formulario, no importa el lugar ni el tamao, ya que se trata de un componente no visual, es decir, no se ver en tiempo de ejcucin.

- Con el timer que acabamos de insertar (Timer1) seleccionado, accede a sus Events (Inspector de Objetos) y clic-clic en el evento OnTimer (el nico posible). - Escribe: procedure TForm1.Timer1Timer(Sender: TObject); begin Label1.Caption:=TimeToStr(Now); end; - Graba el programa como Unit080.pas Project080.dpr y ejectalo.

- Estudio del Project080: Now: Determina la hora del sistema TimeToStr(): funcin de conversin de un dato tipo time a tipo string El procedimiento TForm1.Timer1Timer() se ejecuta cada segundo, porque el valor de la propiedad Interval del Timer1 es 1000 milisegundos, por esta razn aparece en el label el cambio de segundos: cada segundo se ejecuta la sentencia: Label1.Caption := TimeToStr(Now);

p) La propiedad WindowState

Delphi 7

Ferm Vil

106

La propiedad WindowState del formulario, determina el estado de ste. Por defecto: WindowState = wsNormal, esto es, se presenta con el tamao que hemos dado al formulario en tiempo de diseo. Los otros valores que puede tomar la propiedad WindowState son: wsMaximized: maximizada y wsMinimized: ventana minimizada. - Para hacer el siguiente ejercicio, necesitamos el fichero grfico: de nombre Clock.ico - Men File New - Application - Inserta 4 etiquetas y un control temporizador (Timer) con las siguientes propiedades: Form1 Name: frmReloj Caption: Reloj Digital Icon: Clock.ico WindowState: wsMaximized Label1 Caption: Hora: Label2 Caption: Fecha: Label3 Name: lblHora Color: clBlack Font.Size: 14 Font.Style: (fsBold = True) Font.Color: clYellow Label4 Name: lblFecha Color: clBlack Font.Size: 14 Font.Style: (fsBold=True) Font.Color: clGreen

- Accede al procedimiento OnTimer del Timer1, y escribe: procedure TfrmReloj.Timer1Timer(Sender: TObject); begin if frmReloj.WindowState=wsNormal then frmReloj.Caption:='Reloj: ' + DateTimeToStr(Now) else begin frmReloj.Caption:='Reloj'; lblFecha.Caption:=DateToStr(Now); lblHora.Caption:=TimeToStr(Now); end; end;

Delphi 7

Ferm Vil

107

- Graba el programa como Unit081.pas Project081.dpr y ejectalo: restaura la ventana y maximzala. - Estudio del Project081: Now: en realidad contiene la hora y tambin la fecha del sistema. DateTimeToStr(Now): aparece la fecha y hora del sistema DateToStr(Now): aparece la fecha del sistema. TimeToStr(Now): aparece la hora del sistema.

q) El componente Image Vamos a incluir dibujitos a nuestros proyectos. Comenzaremos con dibujos nuestros, es decir que hemos de hacer - Ejecuta el Paint del Windows, es decir: Clic en [Inicio] Programas Accesorios Clic en Paint - Men Imagen Atributos Pxeles Ancho: 360 Alto: 240 - Haz aproximadamente el siguiente dibujo: Ten en cuenta que el fondo es verde, la palabra Semforo debe estar en rojo. El fondo del semforo es blanco. La luz superior es roja, la media mbar y la inferior verde.

- Graba el dibujo en TuCarpeta con el nombre Sematodo.bmp - Selecciona la luz roja. Es decir: Clic en el icono Seleccin del Paint (2 icono de la 1 fila: rectngulo punteado). Marca un cuadrado que abarque la luz roja del semforo. - Men Edicin - Copiar

Delphi 7

Ferm Vil

108

- Men Archivo - Nuevo - Men Edicin - Pegar - Redimensiona el rea de dibujo de forma que abarque slo un cuadrado que contenga el crculo rojo. - Graba el dibujo que tienes en pantalla (luz roja), en TuCarpeta con el nombre Rojo.bmp - Recupera el fichero Sematodo.bmp - Selecciona la luz mbar y grbala con el nombre Ambar.bmp en TuCarpeta. Es decir: Con el dibujo Sematodo a la vista Clic en el icono Seleccin Marca un cuadrado que abarque la luz mbar del semforo. Men Edicin Copar Men Archivo Nuevo Men Edicin Pegar Redimensiona el rea de dibujo de forma que abarque slo un cuadrado blanco que contiene el crculo mbar. Graba el dibujo que tienes en pantalla (luz mbar), en TuCarpeta con el nombre Ambar.bmp Recupera el dibujo Sematodo. - Repite el proceso anterior para grabar la luz verde en TuCarpeta con el nombre Verde.bmp - Por ltimo, necesitamos el semforo sin luces: Con el Sematodo.bmp a la vista. Selecciona el color rojo y pulsa la tecla [Supr] Haz lo mismo para borrar el color mbar y el verde. Graba el dibujo resultante con el nombre Semavaci.bmp - Sal del Paint y vuelve al Delphi Pretendemos en este apartado hacer un programa que simule un semforo - Men File New - Application - Propiedades del formulario: Caption: Semforo Name: Luces - Inserta un control Image: Clic en el icono Image (paleta de componentes Additional): Clic en el interior del formulario - Propiedades del Image1: Height: 240 (recuerda que la altura del Sematodo o Semavaci.bmp era 240)

Delphi 7

Ferm Vil

109

Width: 360 (la anchura del Semavaci.bmp era 360 pxeles) Picture: . Haz clic en el botn de elipsis: [] . Clic en [Load] . Selecciona el fichero Semavaci.bmp de TuCarpeta . [Open] . [Ok]

- Selecciona el formulario y cambia las propiedades: AutoSize: True BorderStyle: bsSingle (de esta forma evitamos que el usuario del programa pueda redimensionar el formulario en tiempo de ejecucin). Vamos a colocar las luces en el semforo - Clic en el icono Image de la paleta de componentes Additional - Marca un cuadrado en el lugar del semforo correspondiente a la luz roja. - Accede a las propiedades del control Image2 y cambia las propiedades: Picture: localiza y selecciona el fichero Rojo.bmp de TuCarpeta Visible: False. - Coloca la luz mbar en su sitio: fichero Ambar.bmp en un nuevo control Image (Image3), con la propiedad Visible = False. - Coloca la luz verde en su sitio: fichero Verde.bmp en un nuevo control Image (Image4), con la propiedad Visible = False. - Graba el programa como Unit082.pas Project082.dpr - Ya tenemos el semforo con sus tres luces. Si ejecutamos el programa no veremos ninguna luz, ya que los tres controles Image que simulan las tres luces tienen la propiedad Visible igual a False. - Inserta un temporizador en unuestro formulario. Es decir: Clic en el icono Timer (System) Clic en cualquier punto del formulario. - Con el Timer1 que acabamos de insertar seleccionado: Solapa Events en el Inspector de Objetos Clic-clic en el evento OnTimer - Escribe: procedure TLuces.Timer1Timer(Sender: TObject); begin Image3.Visible:= Not Image3.Visible; end;

Delphi 7

Ferm Vil

110

La lnea de cdigo Image3.Visible := Not Image3.Visible, lo que hace es cambiar la propiedad Visible del color mbar. Por otro lado, como el valor de la propiedad Interval del Timer1 es 1000 milisegundos, significa que cada segundo cambiar la visibilidad del color mbar. Dicho de otra forma: habremos conseguido la seal de precaucin de nuestro semforo. - Cambia la propiedad Interval del Timer1 a 250 y ejecuta el programa. Vamos a por las dems luces - Selecciona el formulario Luces; debers seleccionarlo del cuadro combinado en el Object Inspector:

- Accede al evento OnShow y escribe: procedure TLuces.FormShow(Sender: TObject); begin Timer1.Enabled:=False; end; Es decir: al visualizar el semforo, desactivamos el control Timer1 - Inserta dos Buttons de propiedades: Button1 Caption: Precaucin Name: Intermitente Button2 Caption: Ninguno Name: Borra - Escribe los procedimientos: procedure TLuces.IntermitenteClick(Sender: TObject); begin Timer1.Enabled:=True; end; procedure TLuces.BorraClick(Sender: TObject); begin Timer1.Enabled:=False; Image2.Visible:=False; Image3.Visible:=False;

Delphi 7

Ferm Vil

111

Image4.Visible:=False; end; - Vamos a completar nuestro semforo Inserta en el formulario tres nuevos Buttons con las siguientes caractersticas: Button1 Caption: Rojo Button2 Caption: mbar Button3 Caption: Verde - Escribe: procedure TLuces.Button1Click(Sender: TObject); begin Image2.Visible:=True; end; procedure TLuces.Button2Click(Sender: TObject); begin Image3.Visible:=True; end; procedure TLuces.Button3Click(Sender: TObject); begin Image4.Visible:=True; end; - Graba el programa con el mismo nombre Unit082.pas Project082.dpr y prubalo.

r) La propiedad Canvas El componente Image no slo nos permite mostrar ficheros grficos sino que nos permite dibujar en tiempo de ejecucin - Men File New - Application - Inserta un componente Image (Additional), un Edit y dos Buttons:

Delphi 7

Ferm Vil

112

- Propiedades: Edit1 Button1

Text: (borra el texto que aparece) Caption: &Guardar

Button2 Caption: &Recuperar

- Vamos a declarar una variable pblica: accede al apartado public del unit y escribe: dibujar: boolean; - Escribe los siguientes procedimientos de evento: procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button=mbLeft then begin dibujar:=true; Image1.Canvas.MoveTo(X,Y); end; end; procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button=mbLeft then dibujar:=False; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if dibujar then Image1.Canvas.LineTo(X,Y); end; procedure TForm1.Button1Click(Sender: TObject); begin Image1.Picture.SaveToFile(Edit1.Text); end; procedure TForm1.Button2Click(Sender: TObject);

Delphi 7

Ferm Vil

113

begin Image1.Picture.LoadFromFile(Edit1.Text); end; - Graba el programa como Unit083.pas Project083.dpr y ejectalo de la siguiente forma: Mantn pulsado el botn izquierdo del ratn, mientras lo mueves por la superficie del Image. Si todo funciona correctamente, podrs dibujar con el ratn Cuando te hayas cansado de dibujar, escribe en el Edit1: prueba1.bmp y clic en [Guardar] Cierra el programa Project083 y utilizando el Paint abre el fichero que tienes en TUCarpeta de nombre prueba1.bmp; si todo funciona correctamente tendrs el dibujito que acabas de hacer con el Project083 Cierra el Paint. Vuelve al Delphi y ejecuta de nuevo el Project083 Escribe en el Edit1: prueba1.bmp y clic en [Recuperar] - Estudio del Project083: Al hacer clic con el botn izquierdo en el Image1, la variable dibujar toma el valor true, ya que: en el procedimiento Image1MouseDown(), si Button = mbLeft (Button es un parmetro del procedimiento que determina el botn pulsado y mbLeft representa el botn izquierdo), entonces dibujar := True Si soltamos el botn izquierdo del ratn en el Image1, entonces la variable dibujar toma el valor False, ya que: en el procedimiento Image1MouseUp(), si Button = mbLeft, entonce dibujar := False. La propiedad Canvas, del componente Image nos permite dibujar en l de la siguiente forma: El mtodo MoveTo(x,y) establece el punto de dibujo en la posicin indicada por las coordenadas x, y y el mtodo LineTo(x,y) dibuja una lnea desde el punto anterior (establecido por MoveTo o el mismo LineTo) al punto de coordenadas x,y actual. En definitiva podemos dibujar por el Image, utilizando el ratn, ya que: Si tenemos el botn izquierdo pulsado entonces dibujar := True y Image1.Canvas.MoveTo(x,y), gracias al procedimiento Image1MouseDown; en definitiva establecemos el punto de dibujo en (x,y) (observa que x,y son parmetros del procedimiento, que simplemente guardan las coordenadas del ratn). A partir de este momento, al mover el ratn (procedimiento Image1MouseMove) y si dibujar := true entonces Image1.Canvas.LineTo(x,y), es decir dibujamos desde el punto anterior al actual. Image1.Picture.SaveToFile(cadena); Graba el dibujo que tenemos en el Image1, con el nombre cadena. Image1.Picture.LoadFromFile(cadena); Recupera en el Image1, el dibujo de nombre cadena Canvas representa la superficie de dibujo del Image, por esto sus mtodos son de dibujo: MoveTo, LineTo y otros. Picture representa el dibujo del Image, por esto sus mtodos: SaveToFile, LoadFromFile no son para dibujar, sino para grabar o recuperar el dibujo en su conjunto.

s) El componente OpenDialog

Delphi 7

Ferm Vil

114

En el ejercicio anterior hemos visto una forma de recuperar un fichero (LoadFromFile), vamos a ver una forma ms elegante - Men File New - Application - Propiedades del formulario: Caption: El componente OpenDialog WindowState: wsMaximized - Inserta en el formulario un componente Image (Additional) de propiedades: Align = alClient (de esta forma se reajusta automticamente el tamao del objeto, un Image en nuestro caso, para que ocupe todo el rea del formulario)) Strech = True (de esta forma la imagen grfica se extender a toda la extensin del Image1) - Inserta un componente OpenDialog (Dialogs), es decir: Activa la paleta de componentes Dialogs Clic en el icono OpenDialog: Clic en cualquier punto del formulario. Se trata de un componente no visual (igual que el Timer), y por eso no es necesario que te preocupes del tamao ni de su posicin.

- Con el OpenDialog1 que acabamos de insertar, seleccionado: Clic en el botn de elipsis: [], de su propiedad Filter Se acaba de abrir el llamado Editor de Filtros, que nos permite especificar el tipo de fichero que visualizar el OpenDialog, escribe: Filter Name Filter Grficos BMP *.bmp - Inserta un componente Button de propiedad Caption = &Abrir - Escribe el siguiente procedimiento de evento: procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.Execute; Image1.Picture.LoadFromFile(OpenDialog1.Filename) ; Caption:=OpenDialog1.FileName; end; - Graba el programa como Unit084.pas Project084.dpr y ejectalo. - Estudio del Project084: OpenDialog1.Execute: se abre el cuadro de dilogo para abrir ficheros. Si en el OpenDialog, hemos seleccionado un fichero: OpenDialog1.FileName ser el nombre de dicho fichero. Image1.Picture.LoadFromFile(OpenDialog1.FileName);

Delphi 7

Ferm Vil

115

En el Image1 se muestra el fichero grfico seleccionado en el cuadro de dilogo. Caption := OpenDialog1.FileName; Corresponde a la propiedad Caption del formulario, porque no indicamos componente: en definitiva, como ttulo del formulario aparece el nombre del fichero grfico.

t) Image con barras de desplazamiento Vamos a hacer un par de mejoras al programa anterior: 1) Nos interesa poder abrir ficheros grficos que no sean BMP. 2) El uso de la propiedad Strech = True no es demasiado adecuada si queremos trabajar con ficheros grficos de tamaos muy diferentes. - Con el programa Project084, a la vista - Selecciona el Image1 Propiedad Strech = False - Selecciona el Form1 (debers hacerlo en el cuadro combinado del Object Inspector) Propiedades: WindowState = wsNormal HorzScrollBar Range = 1000 VertScrollBar Range = 1000 Observa las barras de desplazamiento que aparecen en el formulario. En general, podemos utilizar el proceso anterior para aadir barras de desplazamiento a cualquier componente alineado con el rea del cliente de la ventana (Align = alClient). Para que funcionen hemos de asegurarnos en cad barra de desplazamiento que: Visible = True Range > ClientWidt (normalmente un nmero entre 1000 y 2000) Vamos a programar las barras de desplazamiento, para que aparezcan si es necesario, es decir segn el tamao el fichero - Vuelve a poner a 0 el subvalor Range de HorzScrollBar y VertScrollBar - Escribe el procedimiento: procedure TForm1.FormResize(Sender: TObject); begin HorzScrollBar.Range:=Image1.Picture.Width; VertScrollBar.Range:=Image1.Picture.Height; end; - Para que el componente Image, pueda mostrar otros tipos de archivos grficos: escribe el siguiente procedimiento: procedure TForm1.FormActivate(Sender: TObject); begin OpenDialog1.Filter:=GraphicFilter(TGraphic);

Delphi 7

Ferm Vil

116

end; De esta forma podremos trabajar con los archivos grficos reconicidos por la clase Tgraphic que son: BMP, ICO, EMF, WMF - Si queremos acceder a imgenes JPEG: Aade a la clusula Uses del unit, la palabra: Jpeg - Graba el programa resultante como Unit085.pas Project085.dpr y prubalo.

u) El componente SaveDialog De la misma forma que tenemos un componente que nos permite abrir un fichero, tambin disponemos de un componente que nos permite grabar. En efecto: - Men File New - Application - Inserta:

- Propiedades: Form1 Memo1

Caption: Un Editor de Texto Lines: (borra el texto Memo1) WantTabs: True (de esta forma podemos utilizar tabuladores en el texto) ScrollBars: ssBoth (barras de desplazamiento vertical y tambin horizontal)

Button1 Caption: &Cortar Button2 Caption: &Pegar Button3 Caption: C&opiar Button4 Caption: &Nuevo Button5 Caption: &Abrir Button6 Caption: &Guardar Button7 Caption: &Finalizar Para insertar el OpenDialog1 y el SaveDialog1, debes situarte en la paleta de componentes Dialogs:

Delphi 7

Ferm Vil

117

OpenDialog

SaveDialog

En la propiedad Filter del OpenDialog1 y tambin del SaveDialog1 escribe: Ficheros de Texto | *.txt

- Cdigo: procedure TForm1.Button1Click(Sender: TObject); begin Memo1.CutToClipboard; Memo1.SetFocus; end; procedure TForm1.Button2Click(Sender: TObject); begin Memo1.PasteFromClipboard; Memo1.SetFocus; end;

procedure TForm1.Button3Click(Sender: TObject); begin Memo1.CopyToClipboard; Memo1.SetFocus; end; procedure TForm1.Button4Click(Sender: TObject); begin Memo1.Clear; Memo1.SetFocus; end; procedure TForm1.Button5Click(Sender: TObject); begin OpenDialog1.Execute; Memo1.Lines.LoadFromFile(OpenDialog1.FileName); Memo1.SetFocus; end; procedure TForm1.Button6Click(Sender: TObject); begin SaveDialog1.Execute; Memo1.Lines.SaveToFile(SaveDialog1.FileName);

Delphi 7

Ferm Vil

118

Memo1.SetFocus; end; procedure TForm1.Button7Click(Sender: TObject); begin Close; end; - Graba el programa como Unit086.pas Project086.dpr y ejectalo.

v) Cuadros de Mensajes Hasta ahora el nico cuadro de mensajes que conocemos es el showMessage, veamos que disponemos de otros - Men File New - Application - Inserta 5 botones de propiedad Caption:

- Escribe: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Cuadro de Mensajes sencillo'); end; Se trata del cuadro de mensajes que ya conocemos. procedure TForm1.Button2Click(Sender: TObject); begin ShowMessagePos('Cuadro de Mensajes sencillo pero con coordenadas', Screen.Width div 5,Screen.Height div 5); end; procedure TForm1.Button3Click(Sender: TObject); begin ShowMessagePos('Cuadro de Mensajes con coordenadas ms claras',0,0); end; El ShowMessagePos es un cuadro de mensajes igual al anterior pero tiene dos detalles ms, que son dos valores que indican las coordenadas donde se mostrar el cuadro. Screen.Height determina el alto de la pantalla y Screen.Width determina el ancho de la pantalla. Por lo tanto las coordenadas (Screen.Width div 5 , Screen.Height div 5)

Delphi 7

Ferm Vil

119

correspondern a un punto situado a una quinta parte de la pantalla, horizontal y verticalmente. procedure TForm1.Button4Click(Sender: TObject); begin if MessageDlg('Te gusta?',mtWarning,[mbYes,mbNo],0)=mrYes then ShowMessage('Has pulsado Yes') else ShowMessage('Has pulsado No'); end; El cuadro MessageDlg tiene ms posibilidades: el primer parmetro corresponde al texto que queremos mostrar, el segundo parmetro corresponde al icono que aparecer en el cuadro, el tercer parmetro determina los botones que se mostrarn en el cuadro, el cuarto parmetro es el ndice de la posible ayuda de nuestra aplicacin, si el cuadro contiene un botn de ayuda. Por ltimo el MessageDlg devuelve el valor del botn pulsado por el usuario. Los iconos que podemos utilizar son: mtInformation, mtWarning, mtError, mtConfirmation y mtCustom. Los botones que podemos poner son: mbYes, mbNo, mbOk, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbHelp. El valor que devuelve el cuadro MessageDlg es una constante que puede tomar los valores: mrNone, mrAbort, mrYes, mrOk, mrRetry, mrNo, mrCancel, mrIgnore, mrAll. procedure TForm1.Button5Click(Sender: TObject); begin Application.MessageBox('Mensaje','Ttulo',mb_OkCancel+mb_IconExclamation ); end; Funciona igual que el MessageDlg con la diferencia, que ahora podemos mostrar el cuadro en castellano. Ahora los botones a mostrar son: mb_IconAsterisk, mb_IconError, mb_IconExclamation, mb_IconHand, mb_IconInformation, mb_IconQuestion, mb_IconStop, mb_IconWarning. En el caso del MessageBox, el valor que devuelve es una de las siguientes constantes: IdAbort, IdCancel, IdIgnore, IdNo, IdOk, IdRetry, IdYes

- Graba el programa como Unit087.pas Project087.dpr y ejectalo

w) Cuadros de Mensajes Personalizados Vamos a ver las posibilidades que tiene el Delphi de crear cuadros de mensajes a nuestro gusto: - Men File New - Application

Delphi 7

Ferm Vil

120

- Inserta un Button de Caption = Abrir Cuadro de mensaje personalizado - Inserta un segundo formulario, es decir: Men File New Form - Asocia este segundo formulario al primero: Selecciona el Form1 Men File Use Unit Con el Unit2 seleccionado [Ok] - Selecciona el Form2 y propiedad BorderStyle = bsDialog - Selecciona el Form1 y escribe el siguiente procedimiento: procedure TForm1.Button1Click(Sender: TObject); begin Form2.ShowModal; end; - Graba el programa: El Unit1 como Unit088a.pas El Unit2 como Unit088b.pas El proyecto como Project088.dpr - Ejecuta el programa: si todo funciona correctamente, nuestro programa protesta en uses Unit2; del Unit088a.pas. Es lgico que proteste, ya que hemos asociado el Form1 con el Form2, antes de grabar los units correspondientes. Para solucionar el problema, en lugar de uses Unit2; escribe: uses Unit088b; - Al hacer clic en el botn se abrir el segundo formulario. Observa que sale descentrado y se conporta de forma modal, es decir: hasta que no cierres el formulario (Form2) no podrs tocar la ventana principal (Form2.ShowModal). - Para que el Form2 aparezca centrado, basta que escribas en su propiedad Position = poScreenCenter En definitiva, hemos conseguido en el Form2 un cuadro de mensajes personalizado: formulario Modal, centrado y que no podemos redimensionar (BorderStyle = bsDialog). Bien, vamos a dar contenido a nuestro cuadro de mensajes personalizado: - Selecciona el Form2 y Caption = Cuadro de Mensajes Personalizado - Inserta en el Form2 un label y un image de propiedades: Label1

Delphi 7

Ferm Vil

121

Caption: Esto es el contenido del cuadro de mensajes personalizado. WordWrap: True Font.Size: 12 Font.Style: (fsBold = True) Alignment: taCenter Image1 Picture: Circles.bmp de c:\Windows o el fichero grfico que quieras Stretch: True

- Por ltimo colocaremos botones en nuestro cuadro de mensajes: Activa la paleta de componentes Additional Inserta dos componentes BitBtn: - Propiedades del BitBtn1: Kind = bkOk Caption = &Aceptar - Propiedades del BitBtn2: Kind = bkCancel Caption = &Cancelar - Y para acabar el cdigo correspondiente a los dos BitBtns: procedure TForm2.BitBtn1Click(Sender: TObject); begin ShowMessage('Has pulsado [Aceptar]'); end; procedure TForm2.BitBtn2Click(Sender: TObject); begin ShowMessage('Has pulsado [Cancelar]'); end; - Graba el programa con el mismo nombre: Unit088a.pas Unit088b.pas Project088.dpr y prubalo.

x) El componente BitBtn Veamos que el componente BitBtn es ms de lo que hemos visto en el apartado anterior de tal forma que a partir de ahora usaremos muchas veces el BitBtn en lugar del Button. En principio el componente BitBtn no es ms que un botn que puede mostrar adems una imagen. La propiedad Kind del componente determina la imagen, por defecto Kind = bkCustom (ninguna imagen). La propiedad Kind est estrechamente ligada con la propiedad ModalResult, de manera que si, por ejemplo: Kind = bkCancel entonces ModalResult = mrCancel y no ser necesario escribir cdigo al botn, ya que ste automticamente tendr la accin de cancelar. Si no queremos que sea as: ModelResult = mrNone de la siguiente forma:

Delphi 7

Ferm Vil

122

1) Escogemos la propiedad Kind para la imagen del botn. 2) Escogemos Kind = bkCustom 3) Escogemos ModalResult = mrNone Hay la posibilidad de insertar en el BitBtn una imagen propia, utilizando las propiedades: Kind = bkCustom Glyph = escogemos la imagen Layout = posicin de la imagen (abajo, izquierda, )

- Men File New - Application - Inserta seis BitBtn (Additional) con las siguientes propiedades: BitBtn1 Kind: bkClose Caption: &Salir BitBtn2 Kind: bkOk Kind: bkCustom ModalResult: mrNone Caption: &Aceptar BitBtn3 Kind: bkCancel Kind: bkCustom ModalResult: mrNone Caption: &Cancelar BitBtn4 Kind: bkHelp Kind: bkCustom ModalResult: mrNone Caption: A&yuda BitBtn5 Kind: bkCustom Glyph: Circles.bmp Caption: Circulitos BitBtn6 Kind: bkCustom Glyph: Bubbles.bmp Caption: Burbujitas Layout: blGlyphTop - Observa que el nico botn que decir que no es necesario Close: Salir, y observa tambin acciones automticas del resto. - Graba el programa como y prueba el funcionamiento de todos tiene una accin automtica, es programarlo es el primero: de qu forma anulamos las Unit089.pas Project089.dpr los botones.

Delphi 7

Ferm Vil

123

y) Mens - Men File New Application - Inserta en el formulario, un MainMenu (Standard) de la siguiente forma: Clic en el icono MainMenu de la paleta de componentes Standard: Clic en cualquier punto del formulario. Se trata de un componente no por lo tanto no es necesario que te preocupes del tamao ni de su posicin. visual y

- Inserta en el formulario un PopupMenu (Standard) de la siguiente forma: Clic en el icono PopupMenu de la paleta de componentes Standard:

Clic en cualquier punto del formulario. Se trata igual que el MainMenu, de un componente no visual.

El MainMenu1 nos permitir crear un men para nuestro formulario y el PopupMenu1 un men emergente (el llamado men contextual, que aparece al pulsar el botn derecho del ratn). - Vamos a crear el men: Clic-clic en el MainMenu1 Se acaba de abrir el Diseador de Mens (Menu Designer) Sitate en la propiedad Caption (observa el Object Inspector) de la primera opcin del men y escribe: &Archivo y [Return] Haz clic debajo de la opcin Archivo en el diseador de mens, para introducir la primera subopcin de nuestro men Archivo.

Delphi 7

Ferm Vil

124

En la propiedad Caption correspondiente escribe: &Recuperar y [Return] Clic debajo de Recuperar y en la propiedad Caption, escribe: &Grabar y [Return] Clic debajo de Grabar y en la propiedad Caption escribe un menos y [Return]; de esta forma habremos conseguido una ralla de separacin. Clic debajo de la ralla de separacin, y en la propiedad Caption de la nueva opcin escribe: &Salir y [Return] Observa:

Nos gustara poder acceder a cada una de las opciones de nuestro men, utilizando una tecla de funcin (abreviatura). Para ello, selecciona la opcin Recuperar y en su propiedad ShortCut escribe o selecciona F1 A la opcin Grabar asocia la abreviatura (shortcut) F2 y a la opcin Salir la F3. Tendremos:

Cierra el diseador de mens, es decir: clic en la X del extremo superior derecho de la ventana Form1.MainMenu1

- Vamos a crear el men emergente: Clic clic en el PopupMenu1 Se abre el diseador de mens emergentes. Crea utilizando el mismo proceso que hemos seguido para el MainMenu1:

Cierra la ventana correspondiente al diseador de mens emergentes

Delphi 7

Ferm Vil

125

- No basta con crear un PopupMenu (men emergente), sino que adems, hay que decirle a la aplicacin que lo use: Selecciona el formulario En la propiedad PopupMenu, escribe o selecciona PopupMenu1 - Inserta un OpenDialog y un SaveDialog (paleta de componentes Dialogs) Escribe en su propiedad Filter: Ficheros de Texto | *.txt - Inserta un componente Memo (Standard) y borra su contenido (propiedad Lines). En su propiedad ScrollBars, escribe o selecciona: ssVertical Deberas tener algo parecido a esto:

- Vamos a programar nuestro men Clic en Archivo clic en Recuperar Escribe el procedimiento: procedure TForm1.Recuperar1Click(Sender: TObject); begin OpenDialog1.Execute; Memo1.Lines.LoadFromFile(Opendialog1.FileName); end; Vuelve al Form1 Clic en Archivo clic en Grabar Escribe: procedure TForm1.Grabar1Click(Sender: TObject); begin SaveDialog1.Execute; Memo1.Lines.SaveToFile(SaveDialog1.FileName) ; end; Vuelve al formulario Clic en Archivo clic en Salir Escribe: procedure TForm1.Salir1Click(Sender: TObject); begin Close;

Delphi 7

Ferm Vil

126

end; - Vamos a programar nuestro men emergente. En este caso hemos de hacerlo desde la pantalla de diseo, por lo tanto haz clic-clic en el PopupMenu1. Como las opciones que nos quedan por programar son las mismas que ya hemos programado en el MainMenu1, podremos hacerlo muy rpido, en efecto: Selecciona la opcin Recuperar en la ventana de diseo del PopupMenu1 y en el Object Inspector selecciona la pestaa Events Sitate en el campo OnClick y escribe o selecciona: Recuperar1Click Selecciona Grabar y en el Object Inspector Events OnClick escribe o selecciona Grabar1Click Selecciona Salir y en el Object Inspector Events OnClick escribe o selecciona: Salir1Click - Graba el programa como Unit090.pas Project090.dpr y prubalo. Recuerda de probar las diferentes abreviaturas que hemos programado, por ejemplo: Escribe lo que quieras en el Memo Pulsa [Alt][A] (se abrir el Men Archivo) Pulsa [G] (se ejecutar la subopcin de grabar) Escribe como nombre del fichero lo que quieras Pulsa [F3] (el programa se cerrar) Vuelve a ejecutar el programa y prueba directamente el uso de las teclas [F1] y/o ]F2] Vuelve a ejecutar el programa para probar las opciones del men emergente (botn derecho del ratn), utilizando el ratn y/o las teclas ([R], [G], [S])

z) La funcin STR (nm, cadena) - Men File New - Application - Para hacer este ejercicio necesitamos un fichero grfico de nombre Contar.bmp, tamao 16x16 pxeles y contenido: Es lo que se llama un BMP de tamao ideal como imagen de - Inserta: glifo (fichero 16x16) y es un BitBtn

Delphi 7

Ferm Vil

127

- Propiedades: Memo1 BitBtn1

Lines: (borra la palabra Memo1) Kind: bkCustom Glyph: Contar.bmp Caption: &Contar

BitBtn2 Kind: bkCustom Kind: bkCustom ModalResult: mrNone Caption:&Borrar BitBtn3 Kind: bkClose Caption: &Salir

- Escribe los siguientes procedimientos de evento: procedure TForm1.BitBtn1Click(Sender: TObject); var i,dig,may,min,esp:integer; tdig,tmay,tmin,tesp:string; begin dig:=0;may:=0;min:=0;esp:=0; str(dig,tdig); str(may,tmay); str(min,tmin); str(esp,tesp); Label5.Caption:=tdig; Label6.Caption:=tmay; Label7.Caption:=tmin; Label8.Caption:=tesp; for i:=1 to Length(Memo1.Text) do Case Memo1.Text[i] of '0'..'9': dig:=dig+1; 'A'..'Z','','','','','','','': may:=may+1; 'a'..'z','','','','','','','': min:=min+1; Else

Delphi 7

Ferm Vil

128

esp:=esp+1; end; str(dig,tdig); str(may,tmay); str(min,tmin); str(esp,tesp); Label5.Caption:=tdig; Label6.Caption:=tmay; Label7.Caption:=tmin; Label8.Caption:=tesp; end; procedure TForm1.BitBtn2Click(Sender: TObject); var dig,may,min,esp:word; tdig,tmay,tmin,tesp:string; begin Memo1.Text:=''; dig:=0;may:=0;min:=0;esp:=0; str(dig,tdig); str(may,tmay); str(min,tmin); str(esp,tesp); Label5.Caption:=tdig; Label6.Caption:=tmay; Label7.Caption:=tmin; Label8.Caption:=tesp; end; - Graba el programa como Unit091.pas Project091.dpr y ejectalo. - Estudio del Project091: Str(nm,cadena) Funcin de conversin que convierte el nmero nm en una cadena (string). Esta funcin no distingue entre el tipo de nmero, as en el TForm1.BitBtn1Click los nmeros son integer y en cambio, en el TForm1.BitBtn2Click los nmeros son word (nmeros enteros comprendidos entre 0 y 65535). Si el nmero es real, podramos indicar el nmero de decimales: str(x:10:2,cadena), siendo x un nmero real, ocuparia 10 espacios en la cadena con 2 decimales. Observa de qu forma accedemos a un carcter del memo: for:=1 to Length( Memo1. Text) do, desde uno hasta la longitud del contenido del memo, entonces Memo1Text[i], representa cada uno de sus caracteres

a1) El componente Memo El control Edit tiene la limitacin de que la entrada de texto no puede exceder de una lnea, aunque dicha lnea de texto puede tener una longitud superior al tamao del propio Edit en el formulario

Delphi 7

Ferm Vil

129

Cuando necesitamos una entrada de texto ms amplia, en lugar de un Edit, hemos de utilizar un Memo (paleta Standard) - Propiedades ms importantes de un Memo ScrollBars Muestra o no, barras de desplazamiento. Sus posibles valores son: ssNone: ninguna barra de desplazamiento (defecto) ssVertical: barra de desplazamiento vertical. ssHorizontal: barra de desplazamiento horizontal. ssBoth: barra de desplazamiento vertical y tambin horizontal. En el caso ScrollBars = ssNone o ssVertical, el texto que vamos introduciendo se divide automticamente, saltando de una lnea a otra, siempre y cuando la propiedad WordWrap = True (por defecto) Text Es la propiedad que nos permite acceder a su contenido, igual que sucede con el control Edit Lines Accedemos a cada una de las lneas del control. As, por ejemplo, Memo1.Lines[3], ser la tercera lnea del texto que tenemos en el Memo1 WantReturns = True Al pulsar [Return] en el Memo, se producir un salto de lnea (no la activacin del botn por defecto, que puede existir o no). WantTabs = True Al pulsar [Tab] no se producir la activacin del siguiente control, sino una tabulacin en el texto.

- Mtodos ms importantes en un Memo:

Clear(), Add(), Append(), Insert(): nos permiten eliminar todas las lneas de texto, aadir una nueva lnea o insertarla. SaveToFile() y LoadFromFile(): nos permiten guardar y recuperar el texto del Memo en un archivo.

Quizs la mejor solucin a la salida por pantalla de muchos datos tabulados, es el uso del control Memo - Men File New - Application - Inserta:

Delphi 7

Ferm Vil

130

- Propiedades: Memo1

Lines: (borra el texto Memo1) ScrollBars: ssVertical WantTabs: True Kind: bkOk Kind: bkCustom ModalResult: mrNone Caption: &Ejecuta

BitBtn1

BitBtn2 Kind: bkClose Caption: &Fin

- Escribe: procedure TForm1.BitBtn1Click(Sender: TObject); const g=9.81; var t:integer; v,s:real; tt,tv,ts:string; salida:string; begin salida:=''; salida:=salida+'TIEMPO VELOCIDAD ESPACIO'+#13#10; for t:=0 to 50 do begin v:=g*t; s:=1/2*g*t*t; str(t:7,tt); str(v:10:2,tv); str(s:10:2,ts); salida:=salida+tt+#9+tv+#9#9+ts+#13#10; end; Memo1.Text:=salida; end; - Graba el programa como Unit092.pas Project092.dpr y ejectalo.

Delphi 7

Ferm Vil

131

Programa que calcula 10.000 nmeros al azar, comprendidos entre 1 y 1000. Al final, presenta el nmero de pares e impares - Men File New - Application - Inserta los controles:

- Propiedades: Memo1

Lines: (borra el texto Memo1) ScrollBars: ssVertical WantTabs: True Kind: bkOk Kind: bkCustom ModalResult: mrNone Caption: &Ejecuta

BitBtn1

- Escribe el procedimiento: procedure TForm1.BitBtn1Click(Sender: TObject); var numero,indice,par,impar:integer; sal:string; begin Memo1.Text:='';Edit1.Text:='';Edit2.Text:=''; par:=0;impar:=0;sal:=''; for indice:=1 to 10000 do begin numero:=Random(1000)+1; sal:=sal+IntToStr(numero)+' , '; if numero mod 2=0 then par:=par+1 else impar:=impar+1; end; Memo1.Text:=sal;

Delphi 7

Ferm Vil

132

Edit1.Text:=IntToStr(par);Edit2.Text:=IntToStr(impar ); end; - Graba el programa como Unit093.pas Project093.dpr y ejectalo.

b1) El componente CheckBox El componente CheckBox (Standard) presenta al usuario una opcin S/No. Acta como un interruptor que puede presentar tres estados: seleccionado, sin seleccionar y sin determinar la accin. Propiedad Checked = True : Casilla de Verificacin activada Propiedad Checked = False : Casilla de Verificacin desactivada Si la propiedad AllowGrayed = True (por defecto es False), entonces el valor de la propiedad State determina el estado del CheckBox: State = cbChecked : activado State = cbUnchecked: desactivado State = cbGrayed: indeterminado Las casillas de verificacin son un componente que permite que, aunque existan varios sobre el mismo formulario, puedan elegirse varios a la vez (no son excluyentes). Por ejemplo, no se excluyen los atributos de negrilla, cursiva y subrayado - Men File New - Application - Inserta un label con la propiedad Caption = Curso de Delphi 7 - Inserta cuatro CheckBoxs (paleta de componentes Standard):

- Propiedades: CheckBox1 Caption: Negrita CheckBox2 Caption: Cursiva CheckBox3 Caption: Subrayado CheckBox4 Caption: Tachado

Delphi 7

Ferm Vil

133

- Escribe los siguientes procedimientos de evento: procedure TForm1.CheckBox1Click(Sender: TObject); begin if CheckBox1.Checked=True then Label1.Font.Style:=Label1.Font.Style+[fsBold] else Label1.Font.Style:=Label1.Font.Style-[fsBold]; end; procedure TForm1.CheckBox3Click(Sender: TObject); begin if CheckBox1.Checked=True then Label1.Font.Style:=Label1.Font.Style+[fsUnderline] else Label1.Font.Style:=Label1.Font.Style-[fsUnderline]; end; procedure TForm1.CheckBox4Click(Sender: TObject); begin if CheckBox1.Checked=True then Label1.Font.Style:=Label1.Font.Style+[fsStrikeOut] else Label1.Font.Style:=Label1.Font.Style-[fsStrikeOut]; end; procedure TForm1.CheckBox2Click(Sender: TObject); begin if CheckBox2.Checked=True then Label1.Font.Style:=Label1.Font.Style+[fsItalic] else Label1.Font.Style:=Label1.Font.Style-[fsItalic]; end; - Graba el programa como Unit094.pas Project094.dpr y ejectalo. Observa que podemos activar 4, 3, 2 , 1 o ninguno de los CheckBoxs de manera que no son excluyentes, es decir no hay ninguna relacin entre ellos. c1) El componente RadioButton Los botones de opcin (RadioButton: paleta de componentes standard) son otro de los componentes que permiten la eleccin de una opcin S/No. Las opciones que varios botones de opcin presentan sobre el mismo formulario son excluyentes, es decir, que elegida una de las opciones que presentan estos controles no se puede elegir ninguna otra opcin. - Men File New - Application - Inserta un label con la propiedad Caption = Curso de Delphi 7

Delphi 7

Ferm Vil

134

- Inserta tres RadioButtons (Paleta de componentes Standard): - Propiedades: RadioButton1 Caption: Arial RadioButton2 Caption: Courier RadioButton3 Caption: Times New Roman - Escribe los procedimientos: procedure TForm1.RadioButton1Click(Sender: TObject); begin Label1.Font.Name:='Arial'; end; procedure TForm1.RadioButton2Click(Sender: TObject); begin Label1.Font.Name:='Courier'; end; procedure TForm1.RadioButton3Click(Sender: TObject); begin Label1.Font.Name:='Times New Roman'; end; - Graba el programa como Unit095.pas Project095.dpr y prubalo. Observa que no puedes seleccionar ms de un RadioButton a la vez, ya que los RadioButtons son excluyentes, a diferencia de los CheckBoxs.

d1) El componente GroupBox Cuando los botones de opcin se sitan sobre un mismo formulario, la eleccin de uno de ellos excluye a los dems. Una forma de solucionar este problema es hacer grupos utilizando el componente GroupBox (paleta de componentes Standard) - Men File New - Application

Delphi 7

Ferm Vil

135

- Hemos de conseguir:

- Para ello, inserta dos GroupBox (paleta de componentes Standard): con la propiedad Caption = Estado Civil y Colaboracin - Incluye cuatro RadioButtons en el GroupBox1 y tres en el GroupBox2 de propiedad Caption, la que aparece en la ilustracin. - Graba el programa como Unit096.pas Project096.dpr y ejectalo.

e1) La funcin Val - Men File New - Application - Inserta los siguientes controles:

- Ejecuta el programa para investigar si los RaioButtons se comportan de la forma que nos interesa: Slo podemos escoger Euros o Dlares Slo podemos seleccionar un tipo de IVA - Inserta un nuevo formulario (Men File New Form) - Inserta en el Form2:

Delphi 7

Ferm Vil

136

- Graba el programa como: El Form1 como Unit097a.pas El Form2 como Unit097b.pas El proyecto como Project097.dpr - Desde el primer formulario (Unit097a) nos interesar acceder al segundo (Unit097b), es decir: Selecciona el primer formulario (Clculo del IVA) y Men File Use Unit Con el Unit097b seleccionado [Aceptar] - Escribe el siguiente procedimiento de evento: procedure TForm1.BitBtn1Click(Sender: TObject); var cant,dol,eur,euri,doli,dolt,eurt:real; control:integer; tdol,teur,teuri,tdoli,tdolt,teurt:string; begin Form2.Show; if RadioButton1.Checked=True then begin Form2.Edit1.Text:=''; Form2.Edit2.Text:=Form1.Edit1.Text; end; if RadioButton2.Checked=True then begin Form2.Edit2.Text:=''; Form2.Edit1.Text:=Form1.Edit1.Text; end; Val(Form1.Edit1.Text,cant,control); if control<>0 then begin ShowMessage('No tiene sentido'); Close; end; if Form2.Edit1.Text='' then begin dol:=cant/1.17; Str(dol:10:2,tdol); Form2.Edit1.Text:=tdol; end; if Form2.Edit2.Text='' then

Delphi 7

Ferm Vil

137

begin eur:=cant*1.17; Str(eur:10:2,teur); Form2.Edit2.Text:=teur; end; Val(Form2.Edit1.Text,dol,control); Val(Form2.Edit2.Text,eur,control); if RadioButton3.Checked=True then begin doli:=dol*0.04; Str(doli:10:2,tdoli); Form2.Edit3.Text:=tdoli; euri:=eur*0.04; Str(euri:10:2,teuri); Form2.Edit4.Text:=teuri; dolt:=dol+doli; Str(dolt:10:2,tdolt); Form2.Edit5.Text:=tdolt; eurt:=eur+euri; Str(eurt:10:2,teurt); Form2.Edit6.Text:=teurt; end; if RadioButton4.Checked=True then begin doli:=dol*0.07; Str(doli:10:2,tdoli); Form2.Edit3.Text:=tdoli; euri:=eur*0.07; Str(euri:10:2,teuri); Form2.Edit4.Text:=teuri; dolt:=dol+doli; Str(dolt:10:2,tdolt); Form2.Edit5.Text:=tdolt; eurt:=eur+euri; Str(eurt:10:2,teurt); Form2.Edit6.Text:=teurt; end; if RadioButton5.Checked=True then begin doli:=dol*0.16; Str(doli:10:2,tdoli); Form2.Edit3.Text:=tdoli; euri:=eur*0.16; Str(euri:10:2,teuri); Form2.Edit4.Text:=teuri; dolt:=dol+doli; Str(dolt:10:2,tdolt); Form2.Edit5.Text:=tdolt; eurt:=eur+euri; Str(eurt:10:2,teurt); Form2.Edit6.Text:=teurt;

Delphi 7

Ferm Vil

138

end; end; - Graba el programa con el mismo nombre: Unit097a.pas Unit097b.pas Project097.dpr prubalo. - Estudio del Project097: Estamos suponiendo que 1 dlar = 1,17 euros Val(t,r,i) Convierte el string t en el real r, si ello es posible, entonces i=0 Observa de qu modo evitamos el error que se producira si lo que escribimos en el Edit del Form1 no es un nmero: Val(Form1.Edit1.Text,cant,control); if control<>0 then begin ShowMessage('No tiene sentido'); Close; end;

f1) El componente RadioGroup El componente GroupBox se usa para agrupar sobre el formulario grupos de controles del tipo que sea, a diferencia del componente RadioGroup (Standard) que est especialmente pensado para agrupar RadioButtons. Su funcionamiento es un poco distinto del GroupBox, en efecto, veamos: - Men File New - Application - Inserta un label y dos RadioGroup (paleta de componentes Standard): - Propiedades: RadioGroup1 Caption: Tipos de Letra Items: Arial Courier Times New Roman RadioGroup2 Caption: Moneda Items: Euros Dlares

- Escribe los siguientes procedimientos de evento:

Delphi 7

Ferm Vil

139

procedure TForm1.RadioGroup1Click(Sender: TObject); begin if RadioGroup1.ItemIndex=0 then begin Label1.Caption:='Arial'; Label1.Font.Name:='Arial'; end; if RadioGroup1.ItemIndex=1 then begin Label1.Caption:='Courier'; Label1.Font.Name:='Courier'; end; if RadioGroup1.ItemIndex=2 then begin Label1.Caption:='Times New Roman'; Label1.Font.Name:='Times New Roman'; end; end; procedure TForm1.RadioGroup2Click(Sender: TObject); begin if Label1.Caption<>'Label1' then begin if RadioGroup2.ItemIndex=0 then Label1.Caption:=Label1.Caption+' Euros'; if RadioGroup2.ItemIndex=1 then Label1.Caption:=Label1.Caption+' Dlares'; end else ShowMessage('Debes seleccionar en primer lugar un tipo de letra'); end; - Graba el programa como Unit098.pas Project098.dpr y prubalo. Observa que la propiedad ItemIndex del RadioGroup determina la opcin seleccionada (empezando por 0). Si en tiempo de diseo establecemos la propiedad ItemIndex, por ejemplo igual a 1, en tiempo de ejecucin aparecer activado el segundo RadioButton. Es decir, en un RadioGroup no tiene sentido la propiedad Checked.

g1) El componente ListBox El control ListBox de la paleta de componentes Standard, se utiliza para recoger listados, es decir, su principal caracterstica es: lneas de texto - Propiedades ms importantes: Items: contiene los diferentes elementos de la lista.

Delphi 7

Ferm Vil

140

Sorted: si es True, los elementos del listado aparecen ordenados. MultiSelect: si es True, el usuario podr seleccionar, ms de un elemento. La forma de seleccin, depender del valor de la propiedad ExtendedSelect. ExtendedSelect: si es True podremos usar el botn izquierdo del ratn y tambin las teclas [Maysculas] y/o [Ctrl]. Encambio si es False, slo podremos utilizar el ratn. Elementos seleccionados: o Si MultiSelect = False, entonces el valor de ItemIndex ser el nico elemento seleccionado. o Si ItemIndex= -1, no habr ningn elemento seleccionado. o En el caso MultiSelect = True, la propiedad SelCount contiene el nmero de elementos seleccionados y la propiedad Selected contendr los ndices de los elementos seleccionados. o TopIndex contiene el ndice del elemento visible en la parte superior de la ventana. Si al desplazarse por los elementos del listado, el primer elemento y/o ltimo aparecen cortados, basta establecer la propiedad IntegralHeight = True

- Mtodos ms importantes: Add(): toma como parmetro una cadena de texto, aadindola al final del listado. Insert(): toma dos parmetros. El primero determina la posicin y el segundo el texto a aadir. Delete(): al indicar el ndice, borrar el elemento correspondiente. Clear(): borra todo el listado. IndexOf(): devuelve el ndice del elemento igual a la cadena introducida como parmetro. Si no existe devuelve -1. Move(): toma dos parmetros. El primero indica el ndice del elemento a mover y el segundo el ndice a donde hay que moverlo. Exchange(): intercambia dos elementos, a partir de los ndices respectivos. SaveToFile(): guarda en un archivo todo el listado LoadToFile(): recupera de un archivo el contenido de la lista.

- Men File - Inserta:

New - Application

Delphi 7

Ferm Vil

141

- Cdigo: procedure TForm1.BitBtn1Click(Sender: TObject); const g=9.81; var v,s:real; t:integer; tex,vt,st:string; begin for t:=0 to 15 do begin v:=g*t; s:=1/2*g*t*t; Str(t:10,tex); Str(v:10:2,vt); Str(s:10:2,st); ListBox1.Items.Add(tex); ListBox2.Items.Add(vt); ListBox3.Items.Add(st); end; end; - Graba el programa como Unit099.pas Project099.dpr y ejectalo.

Vamos a hacer un programa que nos permita ordenar tres nmeros enteros - Men File New - Application

Delphi 7

Ferm Vil

142

- Insertar:

- Cdigo: procedure TForm1.BitBtn1Click(Sender: TObject); var a,b,c:integer; aux:integer; begin ListBox1.Clear; ListBox2.Clear; a:=StrToInt(InputBox('Primer nmero entero','','')); b:=StrToInt(InputBox('Segundo nmero entero','','')); c:=StrToInt(InputBox('Tercer nmero entero','','')); ListBox1.Items.Add(IntToStr(a)); ListBox1.Items.Add(IntToStr(b)); ListBox1.Items.Add(IntToStr(c)); if (a>b) then begin aux:=a; a:=b; b:=aux; end; if (c<a) then begin aux:=c; c:=b; b:=a; a:=aux; end else if (c<b) then begin aux:=b; b:=c; c:=aux; end; ListBox2.Items.Add(IntToStr(a)); ListBox2.Items.Add(IntToStr(b)); ListBox2.Items.Add(IntToStr(c));

Delphi 7

Ferm Vil

143

end; - Graba el programa como Unit100.pas Project100.dpr y prubalo - Estudio del Project100 El mtodo de ordenacin que utilizamos es el uso de una variable auxiliar (variable aux). Veamos: If (a>b) then si a es el mayor entonces Begin aux:=a; aux es el mayor a:=b; a es el pequeo (b) b:=aux; b es el mayor (aux) end; En definitiva a es menor que b

Vamos a hacer un programa que obtenga una estadstica con el nmero de suspendidos, aprobados, notables y sobresalientes de un grupo de alumnos. La nota hemos de introducirla como un nmero entero entre 0 y 10 - Men File New - Applicatrion - Inserta:

- Cdigo: procedure TForm1.BitBtn1Click(Sender: TObject); var total,alum,nota,suspen,aprob,notabl,sobres:integer; begin ListBox1.Clear; total:=StrToInt(InputBox('Nmero de alumnos','','')); suspen:=0; aprob:=0;notabl:=0;sobres:=0; for alum:=1 to total do begin repeat nota:=StrToInt(InputBox('Nota de','Alumno '+IntToStr(alum),''));

Delphi 7

Ferm Vil

144

ListBox1.Items.Add(IntToStr(nota)); until (nota>=0) And (nota<=10); Case nota of 0..4: suspen:=suspen+1; 5..6: aprob:=aprob+1; 7..8: notabl:=notabl+1; 9..10: sobres:=sobres+1; end; end; Edit1.Text:=IntToStr(total); Edit2.Text:=IntToStr(suspen); Edit3.Text:=IntToStr(aprob); Edit4.Text:=IntToStr(notabl); Edit5.Text:=IntToStr(sobres); end; - Graba el programa como Unit101.pas Project101.dpr y prubalo - Men File New - Application - Inserta:

- En la propiedad MultiSelect del ListBox1, considera el valor Tru - Cdigo: procedure TForm1.FormCreate(Sender: TObject); begin Edit1.Text:=''; ListBox1.Items.Add('A Corua'); ListBox1.Items.Add('Girona'); ListBox1.Items.Add('Granada'); end;

procedure TForm1.BitBtn1Click(Sender: TObject); begin if Edit1.Text<>'' then

Delphi 7

Ferm Vil

145

begin ListBox1.Items.Add(Edit1.Text); Edit1.SelectAll; end; end; procedure TForm1.BitBtn2Click(Sender: TObject); var n:integer; begin n:=0; With ListBox1 do While n<Items.Count do begin if Selected[n] then begin Items.Delete(n); n:=0; end else n:=n+1; end; end; - Graba el programa como Unit102.pas Project102.dpr y ejectalo. Prueba la opcin [Eliminar de la lista] si tienes ms de un elemento seleccionado.

h1) El componente ComboBox El control ComboBox, de la paleta de componentes Standard no es ms que la unin de un Edit con un ListBox. Sus propiedades y mtodos son bsicamente los mismos que un ListBox, exceptuando la propiedad Style, que puede valer: - csDropDown (defecto): aspecto de un cuadro de texto con un botn a su derecha que despliega el listado. - csDropDownList: no podemos escribir, pero s seleccionar - csSimple: su aspecto es el mismo que un Edit, es decir no hay botn, ni listado adjunto. Con este estilo es posible utilizar las teclas del cursor arriba y abajo para recorrer los elementos de la lista, ya que el listado existe aunque no sea visible directamente. - Men File New - Application - Inserta:

Delphi 7

Ferm Vil

146

- El ComboBox debes insertarlo utilizando el icono ComboBox de la paleta de componentes Standard:

- En el apartado public del unit escribe: cambio:array [0..5] of real - Cdigo: procedure TForm1.FormCreate(Sender: TObject); begin ComboBox1.Items.Add('Dlares'); ComboBox1.Items.Add('Libras Esterlinas'); ComboBox1.Items.Add('Francos Suizos'); ComboBox1.Items.Add('Coronas Danesas'); ComboBox1.Items.Add('Coronas Suecas'); ComboBox1.Items.Add('Euros'); cambio[0]:=0.985; cambio[1]:=0.636; cambio[2]:=1.471; cambio[3]:=7.431; cambio[4]:=9.204; cambio[5]:=1; Edit1.Text:=''; end; procedure TForm1.BitBtn1Click(Sender: TObject); var codigo:integer; valor:real; endivisa:real; cadena:string; begin Val(Edit1.Text,valor,codigo); if codigo=0 then begin endivisa:=valor*cambio[ComboBox1.ItemIndex]; Str(endivisa:10:2,cadena); Label3.Caption:=cadena+' '+ComboBox1.Text; end else ShowMessage('Debes escribir la cantidad en Euros'); end; - Grbalo como Unit103.pas Project103.dpr y ejectalo.

Delphi 7

Ferm Vil

147

Ejercicios
1) Repite el ejercicio ProjectEjer26 que servia para simplificar fracciones pero de forma visual. Grbalo como Ejer32.pas / ProjectEjer32.dpr

Nota: Si en lugar de Edits utilizas Memos podrs centrar su contenido (Alignment = taCenter)

2) Repite el ejercicio ProjectEjer27 que servia para sumar fracciones pero de forma visual. Grbalo como Ejer33.pas / ProjectEjer33.dpr

3) Repite el ejercicio ProjectEjer29, que servia para calcular el rea de un tringulo en el espacio, pero de forma visual.

Delphi 7

Ferm Vil

148

Grbalo como Ejer34.pas / ProjectEjer34.dpr

4) Crea un programa de nombre Ejer35.pas / ProjectEjer35.dpr, que sirva para repasar las tablas de multiplicar, de la siguiente forma:

- Escribimos en el Edit1 el nmero de multiplicaciones que queremos hacer. - En los campos Edit3 y Edit4 aparecen dos nmeros aleatorios entre 1 y 9 - En el Edit5 escribimos el resultado de la multiplicacin que aparece en el Edit3 y Edit4. - Si la respuesta es correcta, aparece en el cuadro Edit8 la frase Muy Bien. - Si la respuesta es incorrecta, aparece en el Edit8 la contestacin correcta.

Delphi 7

Ferm Vil

149

- Los cuadros Edit6 y Edit7 cuentan el nmero de respuestas correctas e incorrectas respectivamente. - El botn [Otro Producto] sirve para que aparezca otra multiplicacin. - En el campo Edit2 aparece en cada momento el nmero de multiplicaciones pendientes. - Al acabarse todas las multiplicaciones, en el cuadro de texto Edit9 aparece la nota cualitativa (ProjectEjer09) y el botn [Otro Producto] se hace invisible.

5) Crea un programa de nombre Ejer36.pas / ProjectEjer36.dpr de tipo visual que sirva para calcular determinantes de segundo y/o tercer orden.

Una forma de conseguir las lneas verticales es: Inserta un Panel (paleta de componentes Standard):

Delphi 7

Ferm Vil

150

En su propiedad Color = clBlack

6) Crea un programa de nombre Ejer37.pas / ProjectEjer37.dpr de tipo visual que sirva para resolver una ecuacin de 2 grado.

7) Crea un programa de nombre Ejer38.pas / ProjectEjer38.dpr que nos permita jugar a los dados, de la siguiente forma:

Delphi 7

Ferm Vil

151

- Al iniciarse el programa: el botn [Tirada] y el mensaje SELECCIONA LOS desaparecen:

- Al hacer clic en [Empezar partida] aparecen los valores aleatorios de los 5 dados y el botn [Tirada] y el mensaje SELECCIONA LOS se hacen visibles:

- Al hacer lo que nos dice el mensaje (clic en los botoncitos de los dados que queremos volver a tirar), desaparecen los dados correspondientes:

Delphi 7

Ferm Vil

152

- Al hacer clic en [Tirada], los dados que haban desaparecido se hacen visibles con otros valores aleatorios:

8) Crea un programa de nombre Ejer39.pas / ProjectEjer39.dpr que sirva para ensear las diferentes partes de un ordenador a un nio. De la siguiente forma:

Al hacer clic en una de las tres partes del de ste aparece el correspondiente:

ordenador, debajo nombre de la parte

Delphi 7

Ferm Vil

153

Indicacin: Coloca tres labels que tapen las tres partes del ordenador con las propiedades: AutoSize: False Caption: Transparent: True

9) Crea un programa de nombre Ejer40.pas / ProjectEjer40.dpr que simule el funcionamiento de una lmpara de la siguiente forma: - Al ejecutar el programa:

- Al hacer clic en [Encender]:

Delphi 7

Ferm Vil

154

- Al hacer clic en [Apagar] volvemos a la situacin inicial.

10) Crea un programa de nombre Ejer41.pas / ProjectEjer41.dpr que sirva para calcular la media aritmtica de una serie de nmeros de la siguiente forma: a) Al escribir un nmero en el campo Nmero y pulsar [Return] o al hacer clic en [Introduce el nmero], ste se coloca en el listado:

b) Al escribir un nmero en el campo Lugar aparece automticamente en el campo Valor el correspondiente valor del nmero que tenemos en el listado de orden el Lugar introducido (debers utilizar el evento OnChange del control correspondiente a Lugar).

Delphi 7

Ferm Vil

155

Para acceder a un elemento determinado del listado hemos de utilizar: ListBox1.Items[lugar del listado 1] Por ejemplo: ListBox1.Items[3] = cuarto valor del listado(string) c) Al hacer clic en [Media Aritmtica], en el campo M.A. aparece la media aritmtica de todos los nmeros del listado

d) Hemos de tener la posibilidad de borrar todo el listado (accin del botn [Borra el listado]) e) Hemos de tener la posibilidad de borrar un determinado elemento del listado siempre y cuando lo seleccionemos prviamente (accin del botn [Elimina el nmero seleccionado]) Si no hay ningn elemento seleccionado en el Listado, el botn anterior se encuentra desactivado

Delphi 7

Ferm Vil

156

11) Crea un programa de nombre Ejer42.pas / ProjectEjer42.dpr, que sirva para calcular la media aritmtica de una serie de nmeros de la siguiente forma: La suma debe realizarse dentro de un bucle REPEAT, aadindose al contenido de una variable suma, el valor ledo desde el teclado. La condicin de salida ha de ser que dicho nmero sea el cero:

12) Crea un programa de nombre Ejer43.pas / ProjectEjer43.dpr, que contenga un ComboBox con el nombre de sus pases. Al seleccionar un pas, aparece el mapa y bandera del pas correspondiente: Para hacer este ejercicio necesitars 6 grficos:

Delphi 7

Ferm Vil

157

13) Crea un programa de nombre Ejer44.pas / ProjectEjer44.dpr que contenga un crucigrama funcionando de la siguiente forma:

14) Crea un programa de nombre Ejer45.pas / ProjectEjer45.dpr que nos sirva para repasar las tablas de sumar o multiplicar de la siguiente forma:

Delphi 7

Ferm Vil

158

15) Crea un programa de nombre Ejer46.pas / ProjectEjer46.dpr, que calcule el precio de un ordenador, segn los suplementos, de la siguiente forma:

16) Crea un programa de nombre Ejer47.pas / ProjectEjer47.dpr, que calcule el producto de dos nmeros pero por el mtodo de las sumas (por ejemplo: 7*5 = 7 veces 5 = 5+5+5+5+5+5+5)

Delphi 7

Ferm Vil

159

17) Crea un programa de nombre Ejer48.pas / ProjectEjer48.dpr, que calcule la divisin entera pero por el mtodo de las restas (por ejemplo: 10/3: 10-3=7; 7-3=4; 4-3=1, como hemos restado 3 veces, el cociente es tres)

18) Crea un programa de nombre Ejer49.pas / ProjectEjer49.dpr, que calcule la suma de los nmeros entre dos dados

19) Crea un programa de nombre Ejer50.pas / ProjectEjer50.dpr, que acepte nmeros hasta un mximo de 20 y luego obtiene el porcentaje de nmeros positivos sobre el total de nmeros distintos de cero.

Delphi 7

Ferm Vil

160

20) Crea un programa de nombre Ejer51.pas / ProjectEjer51.dpr, que acepte nmeros hasta un mximo de 50 y luego obtiene el nmero mayor y el menor, indicando el lugar que ocupan

21) Crea un programa de nombre Ejer52.pas / ProjectEjer52.dpr, que vaya pidiendo el nombre y el telfono de una serie de personas. Posteriormente, dando el nombre, nos contesta con su nmero de telfono:

Delphi 7

Ferm Vil

161

22) Crea un programa de nombre Ejer53.pas / ProjectEjer53.dpr, que nos permita introducir el nombre y la fecha de nacimiento, de una serie de personas. Por ltimo el programa determina el nombre y la fecha de nacimiento de la persona ms joven y de la persona ms vieja.

El mejor componente para trabajar con fechas es el dateTimePicker que encontrars en la pgina de componentes win32. El array correspondiente de fechas, debes declarlo como: fechas: array [1..50] of TDateTime Una variable tipo fecha sera: fecha:TDateTime La fecha que contiene el control DateTimePicker queda determinada por DateTimePicker1 .Date