delphi 3

83
Delphi 7 Fermí Vilà 79 III . - Programación 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 manipulación 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:

Upload: josseph-humberto-mejia-otondo

Post on 12-Aug-2015

77 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Delphi 3

Delphi 7 Fermí Vilà 79

III . - Programación 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 manipulación 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:

Page 2: Delphi 3

Delphi 7 Fermí Vilà 80

- “Marca” un pequeño 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 botón.

- Inserta otro botón, es decir:• Clic en el icono “Button” (Standard).• Clic en un punto del formulario

- Mueve y cambia el tamaño 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” (automáticamente 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 código:

- Selecciona el botón [Saludo]. En el “Object Inspector” haz clic en la pestaña “Events”. Sitúate en el campo OnClick y haz un doble clic en su interior.

Page 3: Delphi 3

Delphi 7 Fermí Vilà 81

Acabamos de acceder al procedimiento de evento: OnClick (al hacer clic) del botón [Saludo], en efecto, observa su nombre: procedure TForm1.butSaludoClick(Sender: TObjet);

Escribe entre las líneas “begin” y “end”:Edit1.Text:= ‘Hola Mundo’;

- Sal del “Editor de Código”, es decir vuelve al formulario. Basta que hagas clic en el borde superior:

- Accede al procedimiento “OnClick” del botón [Borrar] y escribe:

procedure TForm1.butBorrarClick(Sender: TObject);begin Edit1.Text:='';end;

- Graba el módulo 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 botón [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 pestañas).

clic

Page 4: Delphi 3

Delphi 7 Fermí Vilà 82

2º.- Establecer o cambiar las propiedades de los diversos componentes insertados utilizando el “Inspector de Objetos”.3º.- Escribimos el código en el módulo o “unit” del formulario, utilizando el lenguaje de programación ObjectPascal.Uno de los aspectos más importantes en el código, 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 aplicación anterior:

- Cierra el “Delphi”

- Ejecuta el “Explorador de Windows” y sitúate en TuCarpeta

- Observa:Project068.cfg Unit068.dcuProjecto68.dof Unit068.dfmProject068.dpr Unit068.pasProject068.exeProject068.res

- El programa ejecutable: Project068.exeDesde 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 borráramos 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.dprEjecuta el “Delphi” y abre el Project068.dprDelphi relaciona todos los elementos de un proyecto generando un módulo de código,

que se almacena en un archivo con extensión 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);

Page 5: Delphi 3

Delphi 7 Fermí Vilà 83

Application.Run;end.

Como es un fichero de texto, podríamos editarlo desde fuera del Delphi, con el Bloc de Notas del Windows, por ejemplo.

Su estructura básicamente es:• program NombreDelPrograma;• Una referencia a cada uno de los archivos que almacenan los módulos de código, tras la

cláusula “Uses”• Una llamada al método CreateForm() por cada formulario (form) a crear.• La ejecución del programa se lleva a cabo en el momento en que se llama al método

Run()

- Módulos de código: Unit068.pasSon también ficheros de texto. Cada formulario tiene asociado un módulo de código o

unidad (“unit” en inglés). Como ya hemos visto la finalidad de este fichero es contener el código correspondiente al “form”, en nuestro ejemplo: procedure TForm1.butSaludoClick() y TForm1.butBorrarClick()

Cada vez que se añade un nuevo formulario, se añade automáticamente un nuevo módulo de código.

- Archivo de formulario: Unit068.dfmPara cada formulario, los controles (componentes), valores de sus propiedades y los

enlaces de los eventos con el código, se almacenan en un fichero de nombre el mismo que el módulo de código del “form” y extensión DFM.

No hay ningún problema para visualizar este fichero, ya que también (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 algún procedimiento y/o si cambiamos algo del formulario. Los ficheros “antiguos” se guardan con la extensión ~pas (si hemos cambiado alguna cosa del código) y/o ~dfm (si hemos cambiado alguna cosa del formulario).

Page 6: Delphi 3

Delphi 7 Fermí Vilà 84

d) Propiedades y Métodos

- 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 código• Evento: OnClick del Button1

procedure TForm1.Button1Click(Sender: TObject);begin Edit2.Text:='Hola '+Edit1.Text;end;

• Evento: OnClick del Button2procedure TForm1.Button2Click(Sender: TObject);begin Edit1.Text:=''; Edit2.Text:='';

Page 7: Delphi 3

Delphi 7 Fermí Vilà 85

Edit1.SetFocus;end;

• Evento: OnClick del Button3procedure TForm1.Button3Click(Sender: TObject);begin Close;end;

- Graba el programa como Unit069.pas – Project069.dpr y ejecútalo.

- 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 Métodos

Un control, componente o objeto (llámale como quieras) consta de:• Propiedades (o atributos): que determinan las características del objeto: color, nombre,

etc.• Métodos (o funciones): que determinan acciones del usuario o del sistema; no son más

que funciones del objeto. Por ejemplo “SetFocus” es un método del componente “Edit” (y de otros componentes), cuya “acción” consiste en colocar el cursor (el foco del programa) en el componente.

La forma de acceder a una propiedad o a un método es la misma:NombreObjeto.NombrePropiedadOMétodo

Otra diferencia fundamental entre “propiedad” y “método” es que podemos acceder a una propiedad desde “tiempo de diseño” (cuando establecemos valores en el “Object Inspector”), o desde “tiempo de ejecución” (cuando escribimos una sentencia que modifica la propiedad en un procedimiento determinado). En cambio sólo podemos acceder a un método en tiempo de ejecución.

e) Eventos

Los eventos, al igual que las propiedades y los métodos, 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 parámetro, 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 métodos.

Page 8: Delphi 3

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 – pestaña Events), accedemos automáticamente al procedimiento de evento: TForm1.Button1 Click (Sender:Tobject), que se encuentra en el área implementation de la ventana de código 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”, pestaña Events• Haz un doble clic en el campo correspondiente a OnClick• Si todo funciona correctamente nos hemos colocado en el módulo 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”, pestaña “Events”• Clic-clic en el evento OnMouseMove• Escribe:

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);begin ShowMessage('Acabas de pasar el ratón por encima del botón');end;

- Selecciona el “Form1”• “Inspector de Objetos”, pestaña “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

Page 9: Delphi 3

Delphi 7 Fermí Vilà 87

Form1.Caption:='Doble clic en el formulario';end;

Es decir, deberás acceder al evento OnDblClick del formulario.

- Graba el programa como Unit070.pas – Project070.dpr y ejecútalo, es decir prueba los eventos:

• Al hacer clic en el formulario (TForm1.FormClick)• Al mover el ratón por el botón (TForm1.Button1MouseMove)• Al cambiar el tamaño del formulario (TForm1.FormResize)• Al hacer doble clic en el formulario (TForm1.FormDblClick)

f) La función RGB( , , )

Utilizando la función incorporada RGB(x,y,z) con x,y,z números 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 función 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 pruébalo.

g) Teclas de acceso rápido

Page 10: Delphi 3

Delphi 7 Fermí Vilà 88

Si escribimos el ampersand (&) en la propiedad “Caption” de un “Button”, por ejemplo: &Tecla, en el botón correspondiente aparecerá la “T” subrayada. Y si en tiempo de ejecución pulsamos: [Alt][t], es equivalente a hacer clic en el botón.

- Menú File – New - Application

- Inserta:

- Propiedades:• Form1

Caption: Contraseña• Label1

Caption: Introduce la clave secretaAlignment: taCenter

• Edit1Text: (borra el texto que aparece por defecto)MaxLength: 6PasswordChar: *

• Button1Caption: &Aceptar

• Button2Caption: &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;

Page 11: Delphi 3

Delphi 7 Fermí Vilà 89

procedure TForm1.Button2Click(Sender: TObject);begin Form1.Close;end;

- Graba el programa como Unit072.pas – Project072.dpr y ejecútalo. Prueba el funcionamiento de los botones: utilizando el ratón y también por pulsación de las teclas: [Alt][A] y [Alt][S]- Estudio del Project072:

• Supongo que está claro que la contraseña es “PEPITO” (en mayúsculas)• 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 automáticamente en varias líneas, respetando el ancho que asignemos a la etiqueta, deberemos cambiar el valor de la propiedad wordWrap a true.

• MaxLength: 6Podemos escribir un máximo de 6 caracteres en el control “Edit” correspondiente. Por defecto, el control “Edit” no pone ningún límite a la cantidad de texto. La propiedad “MaxLength” contiene por defecto el número 0, indicando de esta forma que no hay límite 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 rápido, es decir:En tiempo de diseño: &letra = letra subrayadaEn tiempo de ejecución: [Alt][letra]No son exclusivas del “button” como iremos viendo.

h) Evento: OnShowEn lugar de establecer las propiedades iniciales de los controles, en “tiempo de diseño”,

podemos establecerlas en “tiempo de ejecución”, 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 – pestaña “Events”• Clic-clic en OnShow

- Escribe:procedure TForm1.FormShow(Sender: TObject);begin Form1.Caption:='El Evento OnShow'; Button1.Caption:='Cambia Color';

Page 12: Delphi 3

Delphi 7 Fermí Vilà 90

With Label1 do begin Caption:='Intercambiar colores'; Color:=clLime; Font.Size:=25; Font.Color:=clRed; end;end;

- Código 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 ejecútalo

i) Evento: OnKeyPressEste 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;

Page 13: Delphi 3

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 ejecútalo.

- Estudio del Project074• En el “Edit1” sólo podemos escribir un número 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 carácter (Key:=#0)

• Al pulsar [Return] (tecla de código 13) en el “Edit2”, se ejecuta el procedure “Button1Click(Sender)”. Si quieres evitar el “Beep” al pulsar [Return], deberías 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 pruébalo.

j) Botón por defecto y de cancelación

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 botón por defecto, el segundo botón de cancelación.

Si la propiedad Default = True, el botón correspondiente será un botón por defectoSi la propiedad Cancel = True, el botón correspondiente será un botón de cancelación

- Menú File – New - Application

- Inserta en el formulario un “Edit” y tres “Buttons”.

- Propiedades:• Button1

Caption: &Normal• Button2

Page 14: Delphi 3

Delphi 7 Fermí Vilà 92

Caption: &DefectoDefault: True

• Button3Caption: &CancelaciónCancel: 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 ejecútalo:• 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:

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

Page 15: Delphi 3

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);beginLabel1.Font.Style:=[fsUnderline];end;

procedure TForm1.Button8Click(Sender: TObject);begin Label1.Font.Style:=[fsStrikeOut];end;

- Graba el programa como Unit076.pas – Project076.dpr y ejecútalo.

l) Lotería

- Crea un nuevo proyecto con los siguientes objetos y propiedades:• Form1

Caption: LOTERÍA• Label1

Caption: Escribe un número• Edit1

Text: (borra el texto que aparece por defecto)

Page 16: Delphi 3

Delphi 7 Fermí Vilà 94

• Edit2Text: (borra el texto)Enabled: False (de esta forma el usuario no podrá escribir en el cuadro de texto)

• Label2Caption: Ver el elemento número:

• Edit3Text: (borra el texto)

• Edit4Text: (borra el texto)Enabled: FalseFont.Size: 24

Pretendemos simular un juego de lotería, que funciona de la siguiente forma: el programa sortea 6 números del 1 al 49 y nosotros hemos de adivinar uno de estos números.

Antes de continuar, coloca en el formulario seis “Edits”, donde aparecerán los seis números 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 pública donde “guardaremos” los 6 números del sorteo.Es decir:

• Sitúate en el “Unit” del formulario y en el apartado public, escribe:Loteria: array[1..6] of integer;

En definitiva, nuestros números de la suerte quedarán 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

Page 17: Delphi 3

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 número aleatorio de 1 hasta 49• HaSalido: controla si el número sorteado ya ha salido.• Trabajar: controla el ciclo “while … do”• Si el valor de “NumeroSorteado” es igual a algún valor de lotería (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 lotería es igual a dicho número 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 lotería• Ejecuta varias veces el programa para comprobar que los seis valores de la lotería son

distintos.

- Al escribir un número del 1 al 6 en el cuadro de texto Edit3, nos interesa que aparezca en el Edit4 el número correspondiente de la lotería …

Accede al evento OnChange del Edit3 y escribe el siguiente procedimiento:

Page 18: Delphi 3

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 número 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”, podríamos pensar que es el evento más 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 más que hacer un doble clic en el control. Recuerda que al principio accedíamos 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 lotería: nos interesa que al escribir un número 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

Page 19: Delphi 3

Delphi 7 Fermí Vilà 97

Edit2.Text:='Muy Bien, acertaste' else Edit2.Text:='Lo siento, pruébalo otra vez'; end;end;

- Graba el programa como Unit077.pas – Project077.dpr y pruébalo.

m) Proyecto con dos formularios

- Menú File – New - Application

- Accede a las propiedades del “Form1” y cambia las siguientes propiedades:• Caption: Triángulo• Name: AREA1

Queremos conseguir:

El proceso a seguir es el siguiente:

- Propiedades del Label1 (título):• Caption: Área de un Triángulo• Font Color: clRed

Size: 18Style: (fsBold, fsItalic = True)

• Color: clYellow

- Tres etiquetas de propiedades:• Caption: BASE, ALTURA, ÁREA• Font Size: 12

Style: (fsBold, fsItalic = True)

Page 20: Delphi 3

Delphi 7 Fermí Vilà 98

- Tres cuadros de texto de propiedades:• Font Color: clRed

Size: 10Style: (fsBold = True)

• ReadOnly: True de esta forma impedimos la edición del “edit”.

Para imponer las mismas propiedades a varios controles a la vez, basta que los selecciones (manteniendo la tecla de mayúsculas pulsada o marcando un recuadro con el ratón que los contenga) y cambies las propiedades.

- Tres botones de propiedades:• Caption: Calcular, Borrar, Círculo• 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:• Botón [Calcular]:

procedure TAREA1.Button1Click(Sender: TObject);var b,h,s:real;begin b:=StrToFloat(InputBox('Triángulo','BASE','')); h:=StrToFloat(InputBox('Triángulo','ALTURA','')); s:=b*h/2; Edit1.Text:=FloatToStr(b); Edit2.Text:=FloatToStr(h); Edit3.Text:=FloatToStr(s);end;

• Botón [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:='';

Page 21: Delphi 3

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

NewForm

- Cambia las siguientes propiedades del nuevo formulario:• Caption: Círculo• Name: AREA2

- Consigue en el nuevo formulario, aproximadamente lo siguiente:

Si quieres mover un control de forma más “fina” que lo hace el ratón, basta que lo selecciones y manteniendo pulsada la tecla [Ctrl], muévelo utilizando las teclas del cursor.

- Vamos a grabar el nuevo formulario:• Con el formulario “Círculo” seleccionado.• Menú File

Save As …File Name: Unit078b.pas

- Escribe el siguiente código (en el “Unit078b”):

procedure TAREA2.Edit1Change(Sender: TObject);var r,a,l:real;begin

Page 22: Delphi 3

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 verás que se ejecuta el formulario AREA1: Triángulo, 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: Triángulo” nos interesa ir al formulario “AREA2: Círculo” (botón [Círculo]). Haz lo siguiente:

• Selecciona el AREA1: basta que muevas las diversas ventanas que tienes en la pantalla, si no lo consigues haz:

Menú ViewForms…

Clic en AREA1• Menú File

Use Unit …Selecciona el formulario correspondiente (Unit078b), como es el único, ya aparece seleccionado.[Ok]

- Desde el formulario “AREA2: Círculo” nos interesa ir al formulario “AREA1” (botón [Volver]), por lo tanto:

• Selecciona el AREA2: Cículo• Menú File

Use Unit…Unit078a[Ok]

- Vamos por último a programar los botones que nos permitirán pasar de un formulario a otro:

Page 23: Delphi 3

Delphi 7 Fermí Vilà 101

• Selecciona el formulario AREA1: Triángulo • Clic-clic en el botón [Círculo]• Escribe:

procedure TAREA1.Button3Click(Sender: TObject);begin AREA2.Show; AREA1.Hide;end;

• Selecciona el formulario AREA2: Círculo• Clic-clic en el botón [Volver]• Escribe:

procedure TAREA2.Button1Click(Sender: TObject);begin AREA1.Show; AREA2.Hide;end;

- Graba de nuevo el programa con el mismo nombre y ejecútalo.

Ten en cuenta que la forma correcta de salir del programa es “cerrar” el formulario principal, es decir el AREA1: Triángulo.

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 cómo …

- Menú File – New - Application

- Inserta:

- Menú File – New - Form

- Inserta en el Form2:

Page 24: Delphi 3

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ú ProjectOptions …

Pestaña: FormsEn el cuadro combinado MainForm, selecciona Form3[Ok]

- Graba lo que hemos hecho hasta ahora de la siguiente forma:• Selecciona el Form3 y

Menú FileSave As…

File Name: Unit079a.pas• Selecciona el Form1 y

Menú FileSave As…

File Name: Unit079b.pas• Selecciona el Form2 y

Page 25: Delphi 3

Delphi 7 Fermí Vilà 103

Menú FileSave As…

File Name: Unit079c.pas• Y por último:

Menú FileSave Project As …

File Name: Project079.dpr

- Vamos a escribir el código:• 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);// Atención!: Evento 'OnActivate' del Form2

Page 26: Delphi 3

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…Unit079bUnit079c

- 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 pruébalo.

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 ejecución”.

Page 27: Delphi 3

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 también cuenta con la propiedad Enabled, que nos permite desactivar el control, evitando de esta forma la generación 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 tamaño, ya que se trata de un componente no visual, es decir, no se verá en tiempo de ejcución.

- 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 ejecútalo.

- Estudio del Project080:• Now: Determina la hora del sistema• TimeToStr(): función de conversión 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 razón aparece en el label el cambio de segundos: cada segundo se ejecuta la sentencia:

Label1.Caption := TimeToStr(Now);

p) La propiedad “WindowState”

Page 28: Delphi 3

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 tamaño que hemos dado al formulario en tiempo de diseño.

Los otros valores que puede tomar la propiedad “WindowState” son: wsMaximized: maximizada y wsMinimized: ventana minimizada.

- Para hacer el siguiente ejercicio, necesitamos el fichero gráfico:de nombre Clock.ico

- Menú File – New - Application

- Inserta 4 etiquetas y un control temporizador (Timer) con las siguientes propiedades:• Form1

Name: frmRelojCaption: Reloj DigitalIcon: Clock.icoWindowState: wsMaximized

• Label1Caption: Hora:

• Label2Caption: Fecha:

• Label3Name: lblHoraColor: clBlackFont.Size: 14Font.Style: (fsBold = True)Font.Color: clYellow

• Label4Name: lblFechaColor: clBlackFont.Size: 14Font.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;

Page 29: Delphi 3

Delphi 7 Fermí Vilà 107

- Graba el programa como Unit081.pas – Project081.dpr y ejecútalo: “restaura” la ventana y “maximízala”.

- Estudio del Project081:• Now: en realidad contiene la hora y también 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]

ProgramasAccesorios

Clic en Paint

- Menú ImagenAtributos …

PíxelesAncho: 360Alto: 240

- Haz aproximadamente el siguiente dibujo:

Ten en cuenta que el fondo es verde, la palabra “Semáforo” debe estar en rojo. El fondo del semáforo 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 “Selección” del Paint (2º icono de la 1ª fila: rectángulo punteado).• “Marca” un cuadrado que abarque “la luz roja” del semáforo.

- Menú Edición - Copiar

Page 30: Delphi 3

Delphi 7 Fermí Vilà 108

- Menú Archivo - Nuevo

- Menú Edición - Pegar

- Redimensiona el área de dibujo de forma que abarque sólo un cuadrado que contenga el círculo 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 grábala con el nombre Ambar.bmp en TuCarpeta. Es decir:• Con el dibujo Sematodo a la vista• Clic en el icono Selección• “Marca” un cuadrado que abarque la luz ámbar del semáforo.• Menú Edición – Copìar• Menú Archivo – Nuevo• Menú Edición – Pegar• Redimensiona el área de dibujo de forma que abarque sólo un cuadrado blanco que

contiene el círculo á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 semáforo 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 semáforo …

- Menú File – New - Application

- Propiedades del formulario:• Caption: Semáforo• 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)

Page 31: Delphi 3

Delphi 7 Fermí Vilà 109

• Width: 360 (la anchura del Semavaci.bmp era 360 píxeles)• Picture:

. Haz clic en el botón 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 ejecución).

Vamos a colocar las luces en el semáforo …

- Clic en el icono Image de la paleta de componentes Additional

- “Marca” un cuadrado en el lugar del semáforo 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 semáforo 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;

Page 32: Delphi 3

Delphi 7 Fermí Vilà 110

La línea de código “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 señal de precaución de nuestro semáforo.

- Cambia la propiedad Interval del Timer1 a 250 y ejecuta el programa.

Vamos a por las demás luces …

- Selecciona el formulario Luces; deberás 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 semáforo, desactivamos el control Timer1

- Inserta dos “Buttons” de propiedades:• Button1

Caption: PrecauciónName: Intermitente

• Button2Caption: NingunoName: 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;

Page 33: Delphi 3

Delphi 7 Fermí Vilà 111

Image4.Visible:=False;end;

- Vamos a completar nuestro semáforo …Inserta en el formulario tres nuevos “Buttons” con las siguientes características:

• Button1Caption: Rojo

• Button2Caption: Ámbar

• Button3Caption: 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 pruébalo.

r) La propiedad “Canvas”

El componente “Image” no sólo nos permite “mostrar” ficheros gráficos sino que nos permite dibujar en tiempo de ejecución …

- Menú File – New - Application

- Inserta un componente “Image” (Additional), un “Edit” y dos “Buttons”:

Page 34: Delphi 3

Delphi 7 Fermí Vilà 112

- Propiedades:• Edit1

Text: (borra el texto que aparece)• Button1

Caption: &Guardar• Button2

Caption: &Recuperar

- Vamos a declarar una variable pública: 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);

Page 35: Delphi 3

Delphi 7 Fermí Vilà 113

begin Image1.Picture.LoadFromFile(Edit1.Text);end;

- Graba el programa como Unit083.pas – Project083.dpr y ejecútalo de la siguiente forma:• Mantén pulsado el botón izquierdo del ratón, mientras lo mueves por la superficie del

“Image”. Si todo funciona correctamente, podrás dibujar con el ratón• 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 tendrás 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 botón izquierdo en el Image1, la variable “dibujar” toma el valor

“true”, ya que: en el procedimiento Image1MouseDown(), si Button = mbLeft (Button es un parámetro del procedimiento que determina el botón pulsado y mbLeft representa el botón izquierdo), entonces dibujar := True

• Si “soltamos” el botón izquierdo del ratón 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 método MoveTo(x,y) establece el punto de dibujo en la posición indicada por las coordenadas x, y y el método LineTo(x,y) dibuja una línea 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 ratón, ya que: Si tenemos el botón 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 parámetros del procedimiento, que simplemente “guardan” las coordenadas del ratón). A partir de este momento, al mover el ratón (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 métodos son de dibujo: MoveTo, LineTo y otros.

• Picture representa el dibujo del Image, por esto sus métodos: SaveToFile, LoadFromFile no son para dibujar, sino para grabar o recuperar el dibujo en su conjunto.

s) El componente “OpenDialog”

Page 36: Delphi 3

Delphi 7 Fermí Vilà 114

En el ejercicio anterior hemos visto una forma de recuperar un fichero (LoadFromFile), vamos a ver una forma más 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 automáticamente el tamaño del objeto, un

“Image” en nuestro caso, para que ocupe todo el área del formulario))• Strech = True (de esta forma la imagen gráfica se extenderá a toda la extensión 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 tamaño ni de su posición.

- Con el “OpenDialog1” que acabamos de insertar, seleccionado:• Clic en el botón 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 FilterGráficos 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 ejecútalo.

- Estudio del Project084:• OpenDialog1.Execute: se abre el “cuadro de diálogo para abrir ficheros”.• Si en el OpenDialog, hemos seleccionado un fichero: “OpenDialog1.FileName” será el

nombre de dicho fichero.• Image1.Picture.LoadFromFile(OpenDialog1.FileName);

Page 37: Delphi 3

Delphi 7 Fermí Vilà 115

En el “Image1” se muestra el fichero gráfico seleccionado en el cuadro de diálogo.• Caption := OpenDialog1.FileName;

Corresponde a la propiedad “Caption” del formulario, porque no indicamos componente: en definitiva, como título del formulario aparece el nombre del fichero gráfico.

t) “Image” con barras de desplazamiento

Vamos a hacer un par de mejoras al programa anterior:1) Nos interesa poder abrir ficheros gráficos que no sean BMP.2) El uso de la propiedad Strech = True no es demasiado adecuada si queremos trabajar

con ficheros gráficos de tamaños muy diferentes.

- Con el programa Project084, a la vista …

- Selecciona el Image1Propiedad “Strech = False”

- Selecciona el Form1 (deberás hacerlo en el cuadro combinado del “Object Inspector”)Propiedades:

WindowState = wsNormalHorzScrollBar

Range = 1000VertScrollBar

Range = 1000Observa las barras de desplazamiento que aparecen en el formulario. En general,

podemos utilizar el proceso anterior para añadir 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 número entre 1000 y 2000)Vamos a “programar” las barras de desplazamiento, para que aparezcan si es necesario, es decir según el tamaño 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 gráficos: escribe el siguiente procedimiento:

procedure TForm1.FormActivate(Sender: TObject);begin OpenDialog1.Filter:=GraphicFilter(TGraphic);

Page 38: Delphi 3

Delphi 7 Fermí Vilà 116

end;De esta forma podremos trabajar con los archivos gráficos reconicidos por la clase

Tgraphic que son: BMP, ICO, EMF, WMF

- Si queremos acceder a imágenes JPEG: Añade a la cláusula Uses del “unit”, la palabra: Jpeg

- Graba el programa resultante como Unit085.pas – Project085.dpr y pruébalo.

u) El componente “SaveDialog”

De la misma forma que tenemos un componente que nos permite “abrir” un fichero, también disponemos de un componente que nos permite “grabar”. En efecto:

- Menú File – New - Application

- Inserta:

- Propiedades:• Form1

Caption: Un Editor de Texto• Memo1

Lines: (borra el texto “Memo1”)WantTabs: True (de esta forma podemos utilizar tabuladores en el texto)ScrollBars: ssBoth (barras de desplazamiento vertical y también horizontal)

• Button1Caption: &Cortar

• Button2Caption: &Pegar

• Button3Caption: C&opiar

• Button4Caption: &Nuevo

• Button5Caption: &Abrir

• Button6Caption: &Guardar

• Button7Caption: &Finalizar

• Para insertar el OpenDialog1 y el SaveDialog1, debes situarte en la paleta de componentes Dialogs:

Page 39: Delphi 3

Delphi 7 Fermí Vilà 117

• En la propiedad “Filter” del OpenDialog1 y también del SaveDialog1 escribe: Ficheros de Texto | *.txt

- Código:

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);

OpenDialog SaveDialog

Page 40: Delphi 3

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 ejecútalo.

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 más claras',0,0);end;

• El ShowMessagePos es un cuadro de mensajes igual al anterior pero tiene dos detalles más, 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)

Page 41: Delphi 3

Delphi 7 Fermí Vilà 119

corresponderán 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 más posibilidades: el primer parámetro corresponde al texto que queremos mostrar, el segundo parámetro corresponde al icono que aparecerá en el cuadro, el tercer parámetro determina los botones que se mostrarán en el cuadro, el cuarto parámetro es el índice de la posible ayuda de nuestra aplicación, si el cuadro contiene un botón de ayuda. Por último el MessageDlg devuelve el valor del botón 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','Título',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 ejecútalo

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

Page 42: Delphi 3

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.pasEl Unit2 como Unit088b.pasEl proyecto como Project088.dpr

- Ejecuta el programa: si todo funciona correctamente, nuestro programa protesta en uses Unit2; del Unit088a.pas. Es lógico 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 botón 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 podrás 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 yCaption = Cuadro de Mensajes Personalizado

- Inserta en el Form2 un “label” y un “image” de propiedades:• Label1

Page 43: Delphi 3

Delphi 7 Fermí Vilà 121

Caption: Esto es el contenido del cuadro de mensajes personalizado.WordWrap: TrueFont.Size: 12Font.Style: (fsBold = True)Alignment: taCenter

• Image1Picture: Circles.bmp de c:\Windows o el fichero gráfico que quierasStretch: 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 código 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 pruébalo.

x) El componente “BitBtn”

Veamos que el componente “BitBtn” es más 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 más que un botón que puede mostrar además 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 código al botón, ya que éste automáticamente tendrá la acción de cancelar. Si no queremos que sea así: ModelResult = mrNone de la siguiente forma:

Page 44: Delphi 3

Delphi 7 Fermí Vilà 122

1º) Escogemos la propiedad Kind para la imagen del botón.2º) Escogemos Kind = bkCustom3º) Escogemos ModalResult = mrNone

Hay la posibilidad de insertar en el BitBtn una imagen propia, utilizando las propiedades:• Kind = bkCustom• Glyph = escogemos la imagen• Layout = posición de la imagen (abajo, izquierda, …)

- Menú File – New - Application

- Inserta seis BitBtn (Additional) con las siguientes propiedades:• BitBtn1

Kind: bkCloseCaption: &Salir

• BitBtn2Kind: bkOkKind: bkCustomModalResult: mrNoneCaption: &Aceptar

• BitBtn3Kind: bkCancelKind: bkCustomModalResult: mrNoneCaption: &Cancelar

• BitBtn4Kind: bkHelpKind: bkCustomModalResult: mrNoneCaption: A&yuda

• BitBtn5Kind: bkCustomGlyph: Circles.bmpCaption: Circulitos

• BitBtn6Kind: bkCustomGlyph: Bubbles.bmpCaption: BurbujitasLayout: blGlyphTop

- Observa que el único botón que tiene una acción automática, es decir que no es necesario programarlo es el primero: “Close: Salir”, y observa también de qué forma anulamos las acciones automáticas del resto.

- Graba el programa como Unit089.pas – Project089.dpr y prueba el funcionamiento de todos los botones.

Page 45: Delphi 3

Delphi 7 Fermí Vilà 123

y) Menús

- 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 visual y por lo tanto no es necesario que te preocupes del tamaño ni de su posición.

- 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 botón derecho del ratón).

- Vamos a crear el menú:• Clic-clic en el MainMenu1• Se acaba de abrir el “Diseñador de Menús” (Menu Designer)• Sitúate en la propiedad Caption (observa el “Object Inspector”) de la primera opción del

menú y escribe: &Archivo y [Return]• Haz clic debajo de la opción “Archivo” en el diseñador de menús, para introducir la

primera subopción de nuestro menú Archivo.

Page 46: Delphi 3

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 separación.• Clic debajo de la ralla de separación, y en la propiedad “Caption” de la nueva opción

escribe: &Salir y [Return]• Observa:

• Nos gustaría poder acceder a cada una de las opciones de nuestro menú, utilizando una tecla de función (abreviatura). Para ello, selecciona la opción “Recuperar” y en su propiedad ShortCut escribe o selecciona F1

• A la opción “Grabar” asocia la abreviatura (shortcut) F2 y a la opción “Salir” la F3.Tendremos:

• “Cierra” el diseñador de menús, 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 “diseñador de menús emergentes”. Crea utilizando el mismo proceso que

hemos seguido para el MainMenu1:

• Cierra la ventana correspondiente al “diseñador de menús emergentes”

Page 47: Delphi 3

Delphi 7 Fermí Vilà 125

- No basta con crear un PopupMenu (menú emergente), sino que además, hay que decirle a la aplicación 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: ssVerticalDeberías 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;

Page 48: Delphi 3

Delphi 7 Fermí Vilà 126

end;

- Vamos a programar nuestro “menú emergente”. En este caso hemos de hacerlo desde la pantalla de diseño, 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 rápido, en efecto:

• Selecciona la opción “Recuperar” en la ventana de diseño del PopupMenu1 y en el “Object Inspector” selecciona la pestaña Events

• Sitúate 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 pruébalo. 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 subopción 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 (botón

derecho del ratón), utilizando el ratón y/o las teclas ([R], [G], [S])

z) La función STR (núm, cadena)

- Menú File – New - Application

- Para hacer este ejercicio necesitamos un fichero gráfico de nombre Contar.bmp, tamaño 16x16 píxeles y contenido:

Es lo que se llama un glifo (fichero BMP de tamaño 16x16) y es ideal como imagen de un “BitBtn”

- Inserta:

Page 49: Delphi 3

Delphi 7 Fermí Vilà 127

- Propiedades:• Memo1

Lines: (borra la palabra Memo1)• BitBtn1

Kind: bkCustomGlyph: Contar.bmpCaption: &Contar

• BitBtn2Kind: bkCustomKind: bkCustomModalResult: mrNoneCaption:&Borrar

• BitBtn3Kind: bkCloseCaption: &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

Page 50: Delphi 3

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 ejecútalo.

- Estudio del Project091:• Str(núm,cadena)

Función de conversión que convierte el número “núm” en una cadena (string). Esta función no distingue entre el tipo de número, así en el TForm1.BitBtn1Click los números son “integer” y en cambio, en el TForm1.BitBtn2Click los números son word (números enteros comprendidos entre 0 y 65535). Si el número es real, podríamos indicar el número de decimales: str(x:10:2,cadena), siendo “x” un número real, ocuparia 10 espacios en la “cadena” con 2 decimales.

• Observa de qué forma accedemos a un carácter 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 limitación de que la entrada de texto no puede exceder de una línea, aunque dicha línea de texto puede tener una longitud superior al tamaño del propio Edit en el formulario

Page 51: Delphi 3

Delphi 7 Fermí Vilà 129

Cuando necesitamos una entrada de texto más amplia, en lugar de un Edit, hemos de utilizar un “Memo” (paleta Standard)

- Propiedades más importantes de un “Memo”

• ScrollBarsMuestra 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 también horizontal.En el caso ScrollBars = ssNone o ssVertical, el texto que vamos introduciendo se divide automáticamente, saltando de una línea a otra, siempre y cuando la propiedad WordWrap = True (por defecto)

• TextEs la propiedad que nos permite acceder a su contenido, igual que sucede con el control Edit

• LinesAccedemos a cada una de las líneas del control. Así, por ejemplo, Memo1.Lines[3], será la tercera línea del texto que tenemos en el “Memo1”

• WantReturns = TrueAl pulsar [Return] en el “Memo”, se producirá un salto de línea (no la activación del botón por defecto, que puede existir o no).

• WantTabs = TrueAl pulsar [Tab] no se producirá la activación del siguiente control, sino una tabulación en el texto.

- Métodos más importantes en un “Memo”:

• Clear(), Add(), Append(), Insert(): nos permiten eliminar todas las líneas de texto, añadir una nueva línea o insertarla.

• SaveToFile() y LoadFromFile(): nos permiten guardar y recuperar el texto del “Memo” en un archivo.

Quizás la mejor solución a la salida por pantalla de muchos datos tabulados, es el uso del control Memo …

- Menú File – New - Application

- Inserta:

Page 52: Delphi 3

Delphi 7 Fermí Vilà 130

- Propiedades:• Memo1

Lines: (borra el texto “Memo1”)ScrollBars: ssVerticalWantTabs: True

• BitBtn1Kind: bkOkKind: bkCustomModalResult: mrNoneCaption: &Ejecuta

• BitBtn2Kind: bkCloseCaption: &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 ejecútalo.

Page 53: Delphi 3

Delphi 7 Fermí Vilà 131

Programa que calcula 10.000 números al azar, comprendidos entre 1 y 1000. Al final, presenta el número de pares e impares

- Menú File – New - Application

- Inserta los controles:

- Propiedades:• Memo1

Lines: (borra el texto “Memo1”)ScrollBars: ssVerticalWantTabs: True

• BitBtn1Kind: bkOkKind: bkCustomModalResult: mrNoneCaption: &Ejecuta

- 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;

Page 54: Delphi 3

Delphi 7 Fermí Vilà 132

Edit1.Text:=IntToStr(par);Edit2.Text:=IntToStr(impar);end;

- Graba el programa como Unit093.pas – Project093.dpr y ejecútalo.

b1) El componente “CheckBox”

El componente CheckBox (Standard) presenta al usuario una opción Sí/No. Actúa como un interruptor que puede presentar tres estados: seleccionado, sin seleccionar y sin determinar la acción.

Propiedad Checked = True : Casilla de Verificación activadaPropiedad Checked = False : Casilla de Verificación desactivada

Si la propiedad AllowGrayed = True (por defecto es “False”), entonces el valor de la propiedad State determina el estado del CheckBox:

State = cbChecked : activadoState = cbUnchecked: desactivadoState = cbGrayed: indeterminado

Las casillas de verificación 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

Page 55: Delphi 3

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 ejecútalo. Observa que podemos activar 4, 3, 2 , 1 o ninguno de los “CheckBoxs” de manera que no son excluyentes, es decir no hay ninguna relación entre ellos.

c1) El componente “RadioButton”

Los botones de opción (RadioButton: paleta de componentes standard) son otro de los componentes que permiten la elección de una opción Sí/No. Las opciones que varios botones de opción 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 opción.

- Menú File – New - Application

- Inserta un “label” con la propiedad “Caption = Curso de Delphi 7”

Page 56: Delphi 3

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 pruébalo. Observa que no puedes seleccionar más 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 opción se sitúan sobre un mismo formulario, la elección de uno de ellos excluye a los demás. Una forma de solucionar este problema es hacer “grupos” utilizando el componente GroupBox (paleta de componentes Standard)

- Menú File – New - Application

Page 57: Delphi 3

Delphi 7 Fermí Vilà 135

- Hemos de conseguir:

- Para ello, inserta dos GroupBox (paleta de componentes Standard):

con la propiedad “Caption = Estado Civil y Colaboración”

- Incluye cuatro RadioButtons en el GroupBox1 y tres en el GroupBox2 de propiedad “Caption”, la que aparece en la ilustración.

- Graba el programa como Unit096.pas – Project096.dpr y ejecútalo.

e1) La función “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:

• Sólo podemos escoger Euros o Dólares• Sólo podemos seleccionar un tipo de IVA

- Inserta un nuevo formulario (Menú File – New – Form)

- Inserta en el Form2:

Page 58: Delphi 3

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 (Cálculo 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

Page 59: Delphi 3

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;

Page 60: Delphi 3

Delphi 7 Fermí Vilà 138

end;end;

- Graba el programa con el mismo nombre: Unit097a.pas – Unit097b.pas – Project097.dpr pruébalo.

- Estudio del Project097:• Estamos suponiendo que 1 dólar = 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 produciría si lo que escribimos en el Edit

del Form1 no es un número: 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 LetraItems: Arial

CourierTimes New Roman

• RadioGroup2Caption: MonedaItems: Euros

Dólares

- Escribe los siguientes procedimientos de evento:

Page 61: Delphi 3

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+' Dólares'; end else ShowMessage('Debes seleccionar en primer lugar un tipo de letra');end;

- Graba el programa como Unit098.pas – Project098.dpr y pruébalo.

Observa que la propiedad ItemIndex del “RadioGroup” determina la opción seleccionada (empezando por 0). Si en tiempo de diseño establecemos la propiedad ItemIndex, por ejemplo igual a 1, en tiempo de ejecución 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 característica es: líneas de texto

- Propiedades más importantes:• Items: contiene los diferentes elementos de la lista.

Page 62: Delphi 3

Delphi 7 Fermí Vilà 140

• Sorted: si es “True”, los elementos del listado aparecen ordenados.• MultiSelect: si es “True”, el usuario podrá seleccionar, más de un elemento. La forma de

selección, dependerá del valor de la propiedad ExtendedSelect.• ExtendedSelect: si es “True” podremos usar el botón izquierdo del ratón y también las

teclas [Mayúsculas] y/o [Ctrl]. Encambio si es “False”, sólo podremos utilizar el ratón.• Elementos seleccionados:

o Si MultiSelect = False, entonces el valor de “ItemIndex” será el único elemento seleccionado.

o Si ItemIndex= -1, no habrá ningún elemento seleccionado.o En el caso MultiSelect = True, la propiedad SelCount contiene el número 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

- Métodos más importantes:• Add(): toma como parámetro una cadena de texto, añadiéndola al final del listado.• Insert(): toma dos parámetros. El primero determina la posición y el segundo el texto a

añadir.• 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

parámetro. Si no existe devuelve “-1”.• Move(): toma dos parámetros. 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 – New - Application

- Inserta:

Page 63: Delphi 3

Delphi 7 Fermí Vilà 141

- Código:

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 ejecútalo.

Vamos a hacer un programa que nos permita ordenar tres números enteros …

- Menú File – New - Application

Page 64: Delphi 3

Delphi 7 Fermí Vilà 142

- Insertar:

- Código:

procedure TForm1.BitBtn1Click(Sender: TObject);var a,b,c:integer; aux:integer;begin ListBox1.Clear; ListBox2.Clear; a:=StrToInt(InputBox('Primer número entero','','')); b:=StrToInt(InputBox('Segundo número entero','','')); c:=StrToInt(InputBox('Tercer número 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));

Page 65: Delphi 3

Delphi 7 Fermí Vilà 143

end;

- Graba el programa como Unit100.pas – Project100.dpr y pruébalo

- Estudio del Project100El método de ordenación que utilizamos es el uso de una variable auxiliar (variable aux). Veamos:If (a>b) then si a es el mayor entonces

Beginaux:=a; aux es el mayora:=b; a es el pequeño (b)b:=aux; b es el mayor (aux)

end; En definitiva a es menor que b

Vamos a hacer un programa que obtenga una estadística con el número de suspendidos, aprobados, notables y sobresalientes de un grupo de alumnos. La nota hemos de introducirla como un número entero entre 0 y 10

- Menú File – New - Applicatrion

- Inserta:

- Código:

procedure TForm1.BitBtn1Click(Sender: TObject);var total,alum,nota,suspen,aprob,notabl,sobres:integer;begin ListBox1.Clear; total:=StrToInt(InputBox('Número 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),''));

Page 66: Delphi 3

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 pruébalo

- Menú File – New - Application

- Inserta:

- En la propiedad MultiSelect del ListBox1, considera el valor Tru

- Código:

procedure TForm1.FormCreate(Sender: TObject);begin Edit1.Text:=''; ListBox1.Items.Add('A Coruña'); ListBox1.Items.Add('Girona'); ListBox1.Items.Add('Granada');end;

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

Page 67: Delphi 3

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 ejecútalo. Prueba la opción [Eliminar de la lista] si tienes más de un elemento seleccionado.

h1) El componente “ComboBox”

El control ComboBox, de la paleta de componentes Standard no es más que la unión de un Edit con un “ListBox”. Sus propiedades y métodos son básicamente los mismos que un “ListBox”, exceptuando la propiedad Style, que puede valer:- csDropDown (defecto): aspecto de un cuadro de texto con un botón 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 botón, 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:

Page 68: Delphi 3

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

- Código:

procedure TForm1.FormCreate(Sender: TObject);begin ComboBox1.Items.Add('Dólares'); 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;

- Grábalo como Unit103.pas – Project103.dpr y ejecútalo.

Page 69: Delphi 3

Delphi 7 Fermí Vilà 147

Ejercicios

1) Repite el ejercicio ProjectEjer26 que servia para simplificar fracciones pero de forma “visual”.Grábalo como Ejer32.pas / ProjectEjer32.dpr

Nota:Si en lugar de “Edits” utilizas “Memos” podrás centrar su contenido (Alignment = taCenter)

2) Repite el ejercicio ProjectEjer27 que servia para sumar fracciones pero de forma “visual”. Grábalo como Ejer33.pas / ProjectEjer33.dpr

3) Repite el ejercicio ProjectEjer29, que servia para calcular el área de un triángulo en el espacio, pero de forma “visual”.

Page 70: Delphi 3

Delphi 7 Fermí Vilà 148

Grábalo 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 número de multiplicaciones que queremos hacer.- En los campos “Edit3” y “Edit4” aparecen dos números aleatorios entre 1 y 9- En el “Edit5” escribimos el resultado de la multiplicación 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 contestación correcta.

Page 71: Delphi 3

Delphi 7 Fermí Vilà 149

- Los cuadros “Edit6” y “Edit7” cuentan el número de respuestas correctas e incorrectas respectivamente.- El botón [Otro Producto] sirve para que aparezca otra multiplicación.- En el campo “Edit2” aparece en cada momento el número de multiplicaciones pendientes.- Al acabarse todas las multiplicaciones, en el cuadro de texto “Edit9” aparece la nota cualitativa (ProjectEjer09) y el botón [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 líneas verticales es:• Inserta un Panel (paleta de componentes Standard):

Page 72: Delphi 3

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 ecuación de 2º grado.

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

Page 73: Delphi 3

Delphi 7 Fermí Vilà 151

- Al iniciarse el programa: el botón [Tirada] y el mensaje “SELECCIONA LOS …” desaparecen:

- Al hacer clic en [Empezar partida] aparecen los valores “aleatorios” de los 5 dados y el botón [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:

Page 74: Delphi 3

Delphi 7 Fermí Vilà 152

- Al hacer clic en [Tirada], los dados que habían desaparecido se hacen visibles con otros valores “aleatorios”:

8) Crea un programa de nombre Ejer39.pas / ProjectEjer39.dpr que sirva para enseñar las diferentes partes de un ordenador a un niño.De la siguiente forma:

Al hacer clic en una de las tres partes del ordenador, debajo de éste aparece el nombre de la parte correspondiente:

Page 75: Delphi 3

Delphi 7 Fermí Vilà 153

Indicación:Coloca tres labels que “tapen” las tres partes del ordenador con las propiedades:

AutoSize: FalseCaption:Transparent: True

9) Crea un programa de nombre Ejer40.pas / ProjectEjer40.dpr que simule el funcionamiento de una lámpara de la siguiente forma:

- Al ejecutar el programa:

- Al hacer clic en [Encender]:

Page 76: Delphi 3

Delphi 7 Fermí Vilà 154

- Al hacer clic en [Apagar] volvemos a la situación inicial.

10) Crea un programa de nombre Ejer41.pas / ProjectEjer41.dpr que sirva para calcular la media aritmética de una serie de números de la siguiente forma:

a) Al escribir un número en el campo “Número” y pulsar [Return] o al hacer clic en [Introduce el número], éste se coloca en el listado:

b) Al escribir un número en el campo “Lugar” aparece automáticamente en el campo “Valor” el correspondiente valor del número que tenemos en el “listado” de orden el “Lugar” introducido (deberás utilizar el evento OnChange del control correspondiente a “Lugar”).

Page 77: Delphi 3

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 Aritmética], en el campo “M.A.” aparece la media aritmética de todos los números del “listado”

d) Hemos de tener la posibilidad de borrar todo el listado (acción del botón [Borra el listado])

e) Hemos de tener la posibilidad de borrar un determinado elemento del “listado” siempre y cuando lo seleccionemos préviamente (acción del botón [Elimina el número seleccionado])Si no hay ningún elemento seleccionado en el “Listado”, el botón anterior se encuentra desactivado

Page 78: Delphi 3

Delphi 7 Fermí Vilà 156

11) Crea un programa de nombre Ejer42.pas / ProjectEjer42.dpr, que sirva para calcular la media aritmética de una serie de números de la siguiente forma:La suma debe realizarse dentro de un bucle REPEAT, añadiéndose al contenido de una variable “suma”, el valor leído desde el teclado. La condición de salida ha de ser que dicho número sea el cero:

12) Crea un programa de nombre Ejer43.pas / ProjectEjer43.dpr, que contenga un ComboBox con el nombre de sus países. Al seleccionar un país, aparece el mapa y bandera del país correspondiente:

Para hacer este ejercicio necesitarás 6 gráficos:

Page 79: Delphi 3

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:

Page 80: Delphi 3

Delphi 7 Fermí Vilà 158

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

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

Page 81: Delphi 3

Delphi 7 Fermí Vilà 159

17) Crea un programa de nombre Ejer48.pas / ProjectEjer48.dpr, que calcule la división entera pero por el método 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 números entre dos dados

19) Crea un programa de nombre Ejer50.pas / ProjectEjer50.dpr, que acepte números hasta un máximo de 20 y luego obtiene el porcentaje de números positivos sobre el total de números distintos de cero.

Page 82: Delphi 3

Delphi 7 Fermí Vilà 160

20) Crea un programa de nombre Ejer51.pas / ProjectEjer51.dpr, que acepte números hasta un máximo de 50 y luego obtiene el número 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 teléfono de una serie de personas. Posteriormente, dando el “nombre”, nos contesta con su número de teléfono:

Page 83: Delphi 3

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 más joven y de la persona más vieja.

El mejor componente para trabajar con fechas es el dateTimePicker que encontrarás en la página de componentes win32.

El “array” correspondiente de fechas, debes declarlo como: fechas: array [1..50] of TDateTimeUna variable ‘tipo fecha’ sería: fecha:TDateTime

La fecha que contiene el control DateTimePicker queda determinada por DateTimePicker1 .Date