Lazarus Project: Introducción a la programación

Julián Andrés Rincón Penagos Edgar Javier Carmona Suárez Jorge Hernán Aristizábal Zapata
Armenia Universidad del Quindío Grupo de Estudio y Desarrollo de Software (GEDES)
2012

Copyright © 2012 ( Lazarus Project: Introducción a la Programación)

No está permitida importar, vender, difundir y exportar total o parcialmente esta obra, ni su tratamiento o transmisión por cualquier método sin autorización escrita de la editorial. El contenido y los derechos de la presente obra son excluidos de los autores.

Julián Andrés Rincón Penagos
Licenciado en Matemáticas (Universidad del Quindío). Docente Universidad del Quindío.

Edgar Javier Carmona Suárez.
Ingeniero de Sistemas (Universidad Incca de Colombia)
Magíster en Ciencias de la Computación (Instituto Tecnológico de Costa Rica)

Doctor en Tecnologías de la Información (Universidad de las Palmas de Gran Canaria
-España).
Docente Universidad del Quindío.

Jorge Hernán Aristizábal Zapata.
Licenciado en Matemáticas y Computación (Universidad del Quindío) Magíster en Educación (Universidad Católica de Manizales). Docente Universidad del Quindío.

Revisión de estilo:
Yolanda María Hurtado Arias
Licenciada en Español y Literatura (Universidad del Quindío)
Candidata a Magíster en Educación: Desarrollo Humano (Universidad de San

Buenaventura Cali)

ELIZCOM S.A.S
www.elizcom.com
ventas@elizcom.com
ISBN: 978-958-57703-6-2 Cel: (57)3113349748, Fax: (57)(6)7493244
200 Ejemplares Armenia, Quindío

Grupo de estudio y desarrollo de software (GEDES) II INTRODUCCIÓN A LA PROGRAMACIÓN

A DIOS creador de la ciencia, de la vida y de todo lo existente, a mis padres y hermana por la compañía e ideas que me dan cada día.

Julián Andrés Rincón Penagos.

A mis hijos que hacen que la llama del futuro permanezca prendida.

Edgar Javier Carmona Suárez.

A mi esposa y a mi hijo que son lo más importante en mi vida y que son el motor que me impulsa a seguir adelante.

Jorge Hernán Aristizábal Zapata.

Julián Rincón, Edgar Carmona y Jorge Aristizábal III

Introducción

Los computadores, para todos sus procesos, utilizan un sistema binario. Cada letra, dato, documento, archivo de sonido, video, juego o cualquier recurso digital está compuesto de una combinación de unos y ceros, dado que es la forma como la era digital permite que se guarden y manipulen los datos. Para que la información pueda circular de un lado a otro, para que se vean reflejados en la pantalla o impresos, requieren de instrucciones que el hombre debe suministrar. Dado que el computador no entiende nuestra lengua, se hace necesaria la existencia de un lenguaje que sea capaz de entender tanto el humano como el del computador y éste es el lenguaje de programación.

Desde los primeros computadores creados a mediados del siglo XX, el hombre ha utilizado diferentes lenguajes para que la máquina sea capaz de asimilar las instrucciones que se le dan y luego ejecutarlas. Cada conjunto de instrucciones que responden a una tarea específica, se guardan en un archivo llamado “programa”.

Los lenguajes de programación permiten, por un lado, escribir las operaciones que son necesarias para cumplir un objetivo, que consiste en resolver el problema de la vida diaria; para ello se utiliza un algoritmo o conjunto de pasos lógicos para la resolución del problema. De otro lado, el lenguaje de programación también se encarga de traducir el algoritmo al lenguaje máquina (binario) en un proceso que se denomina compilación. Este último proceso a su vez se encarga de varias cosas: primero, velar para que las instrucciones estén correctamente escritas (sintaxis), y, segundo, se encarga de hacer la traducción de un lenguaje (que entiende el usuario) a otro que entiende el computador, generando una copia del programa, con capacidad para “correr” (es decir, ser ejecutado) por la máquina.

Para sintetizar el concepto de lenguaje de programación, es posible decir que, es la traducción de las instrucciones a un código que comprende el computador.

VII

Un lenguaje de programación es una notación para escribir programas, a través de los cuales podemos comunicarnos con el hardware y dar así las órdenes necesarias para la realización de un proceso o tarea. Un lenguaje está definido por una gramática o conjunto de reglas que se aplican a un alfabeto constituido por el conjunto de símbolos utilizados.

Desde la primera generación de computadores hasta la actualidad son miles los lenguajes de programación que el hombre ha utilizado, cada uno de ellos con su propia gramática, su terminología especial, una sintaxis particular y un enfoque determinado. Es así como algunos de los lenguajes de programación más utilizados han sido: BASIC, FORTRAN, Pascal, COBOL, PL/1, C, ASSEMBLER, ADA, LISP, Pascal. MODULA, entre otros, producidos en el siglo XX. De igual manera y más recientemente, han proliferado en el mercado lenguajes como C++. DELPHI, JAVA, JAVASCRIPT, PILOT, PERL, PROLOG, PHP, HTML, RUBY, entre muchos otros.

En este libro se habla sobre un lenguaje particular: “el lenguaje Pascal”, que fue creado por el matemático suizo Nicklaus Wirth en el año 1970, basándose en el lenguaje ALGOL, en cuyo diseño había participado en los años sesenta. Su nombre proviene del filósofo y matemático francés del siglo XVII, Blaise Pascal, que inventó la primera máquina mecánica para sumar. Aunque en principio la idea del diseñador era proporcionar un lenguaje adecuado para la enseñanza de los conceptos y técnicas de programación; con el tiempo ha llegado a ser un lenguaje ampliamente utilizado en todo tipo de aplicaciones, que posee grandes facilidades para la programación de sistemas y diseño de formularios.

Son varias las versiones de Pascal que se han producido desde su creación. Es así como podemos mencionar las siguientes: en el año 1989, aparece la versión 5.5 con un aporte importante “incorpora facilidades para realizar programación orientada a objetos (OOP, Object-oriented Programming)” (Hernandez 2012).

En 1991, Borland lanzó Turbo Pascal 6, que añadía nuevas herramientas de programación orientada a objetos. A finales de 1992, dos nuevos productos se lanzaron por la casa Borland: Turbo Pascal 7.0 y Borland Pascal 7.0. Pascal ha sido el compilador más vendido de la historia de la informática. Su poderoso entorno de programación, la solidez del lenguaje y su economía, hicieron de este compilador la mejor herramienta para trabajar en el viejo sistema operativo DOS y en los aún existentes Windows. El despegue de Internet en 1993 con la aparición de la Web, de Tim Berners-Lee, la implementación progresiva en las

Grupo de estudio y desarrollo de software (GEDES) VIII INTRODUCCIÓN A LA PROGRAMACIÓN

universidades, en la industria del software y en las empresas, en general, de los lenguajes C y posteriormente C++, Java y C#, unidos a los nuevos lenguajes para la programación de Internet, HTML y XML, fueron relegando a Pascal. Pero, la aparición de nuevas versiones de Pascal en la segunda mitad de la década de los 90, desarrolladas bajo la filosofía del software libre y gratuito, ha hecho que Pascal siga gozando de gran popularidad (Muñoz 2007).

Free Pascal es un compilador multi-sistema-operativo y multi-CPU. El compilador implementa los dialectos de Borland Pascal (Turbo Pascal y Delphi) así como las construcciones de MacPascal y está disponible para la mayoría de los sistemas operativos. Free Pascal se conoce originalmente como FPK Pascal, en honor de su autor (Florian Paul Klämpfl). El compilador fue escrito en el Turbo Pascal y finalizado 1997, se cambió el nombre del proyecto por Free Pascal Compiler (FPC) para evitar confusiones, debido a que contribuyeron númerosas personas al proyecto. Las primeras versiones incorporaban características de Delphi.

Free Pascal se ha convertido, desde su aparición, y sobre todo desde 2005, en uno de los compiladores más importantes de código abierto (Open Source). Aunque Turbo Pascal (de Borland ofrece gratis en su sitio web la versión 5.5) sigue siendo utilizado por númerosos programadores y, principalmente, como primera herramienta básica de iniciación a la programación. Free Pascal es el compilador elegido por profesores y estudiantes para el estudio de cursos como éste, de Introducción a la Programación, usando Lazarus Project.

“Lazarus es una herramienta de desarrollo libre y de código abierto para el compilador Free Pascal (Object Pascal o Pascal orientado a objetos), que a su vez lo es también. El IDE (Integrated Development Environment) de Lazarus, es un entorno de programación estable y con abundantes características para

Julián Rincón, Edgar Carmona y Jorge Aristizábal IX

crear aplicaciones, tanto con interfaz gráficas como de consola. Actualmente funciona en sistemas operativos Linux, FreeBSD, Mac y Windows 32 y 64 bits, proporciona un editor de código fuente personalizable y un entorno visual para crear formularios, junto a un generador de paquetes, un depurador y una completa integración del GUI (Interfaz Gráfica del Usuario) en inglés (Graphic User Interface) con el compilador FreePascal”¹.
Se introduce en este texto el lenguaje de programación Free Pascal adoptado porque presenta una estructura de programación de alto nivel, y en el cual se puede encontrar una plataforma de diseño para ventanas, formularios y otras aplicaciones que son más llamativas, para usuarios y programadores, además de integrarse con imágenes para hacer más llamativo el entorno.

En este caso, puede acogerse el entorno de desarrollo Lazarus Project que trabaja en el lenguaje de programación Free Pascal y sobre el cual se desarrollarán aplicaciones muy interesantes.

En cuanto al aprendizaje de la programación y de la aprehensión de una estructura que facilite la creación de aplicaciones óptimas, se creará una secuencia didáctica adecuada pues motivará al estudiante programador, a avanzar cada vez más en la programación y en la solución de problemas complejos y del desarrollo de aplicaciones.

Como integrantes de la Licenciatura en Matemáticas de la Universidad del Quindío, varios ejemplos y ejercicios están orientados a los estudiantes de dicho programa académico, en la cual, teniendo como contexto el curso de informática básica y los cursos de tópicos I, II y III del mismo.

¹De acuerdo con http://wiki.Lazarus.FreePascal.org/Lazarus_Tutorial/esGrupo de estudio y desarrollo de software (GEDES) X

1

Cómo utilizar el libro

Las problemáticas propuestas en este libro se basan en situaciones reales de la vida cotidiana, estudiadas en el entorno de las matemáticas.

La programación se hace interesante, en la medida que las problemáticas propuestas, presentan soluciones muy atractivas y útiles. Es decir, soluciones traducidas en programas o aplicaciones que el programador pueda distribuir, o que pueda seguir usando.

La secuencia a seguir, es controlar una serie de problemáticas, en las cuales usan herramientas del entorno y del lenguaje de programación utilizado, creando una estructura que permita al programador, resolver problemas propuestos en el estudio de las matemáticas.

Con la propuesta planteada, se pretenden llevar de la mano, una serie de construcciones o análisis en cuanto a: las matemáticas y la programación, orientada a objetos y a la lógica.

1.1

Símbolos usados en el libro

En el desarrollo de este libro vamos a utilizar una serie de símbolos que facilitarán la comprensión y aprehensión de los conceptos de programación, los cuales describirán qué tipo de actividad se realizara.

Pregunta .
Introducción a un nuevo concepto, pregunta sobre situaciones o problemas presentes en la vida cotidiana. Por medio de estas preguntas se introducen nuevos conocimientos a través de los ya adquiridos o aprhendidos.

Explicar .
Símbolo que identifica la descripción del problema que se va a trabajar en la clase

Enunciar .
Símbolo empleado para describir los problemas que pueden ser resueltos con el concepto propuesto.

Problema

. Símbolo que identifica la descripción del problema de programación el cual se desarrollará en casa.

2

Entorno de desarrollo IDE

Lazarus es más que un editor de código fuente, es un entorno de desarrollo integrado.

Un entorno de desarrollo integrado, también llamado también IDE (Integrated Development Environment), es un software compuesto por un conjunto de herramientas de programación que puede dedicarse a varios lenguajes de programación o dedicarse para uno exclusivamente. Un IDE es un entorno de programación que se ofrece como una aplicación; es decir, consiste en un editor de código, un compilador, un intérprete, un depurador y un constructor de interfaz gráfica (GUI). Los IDEs pueden ser aplicaciones por sí solas o pueden ser parte de aplicaciones existentes.

El entorno de desarrollo se compone de una serie de páneles que permiten la integración del diseño y desarrollo de aplicaciones. Está compuesto principalmente por el panel principal, donde se encuentran los menús, las herramientas y los componentes; un panel para modificar las propiedades de cada componente usado en el formulario; un editor de código; una ventana para ver los errores de compilación y depuración así como un formulario sobre el cual se hace el diseño de la aplicación.

Figura 2.1: Entorno de diseño y desarrollo de Lazarus Project Free Pascal

El IDE despliega varias ventanas; para cada una de los formularios, para el código fuente, para revisar los errores (ventana de mensajes). También se pueden diseñar ventanas (formularios), escribir código fuente, compilar, ejecutar los programas y depurarlos, si es el caso.

Los programas que se desarrollan, constan de un formulario base, donde el programador colocará los elementos como botones etiquetas (avisos), como son zonas de diseño visibles para el programador quien puede diseñar cómo verá el usuario su programa cuando se ejecute.

El formulario, tiene asociados varios elementos como: botones, cuadros de dibujo, etiquetas y una serie de propiedades que se muestran y en el inspector de objetos.

Figura 2.2: Entorno de diseño y desarrollo de Lazarus Project Free Pascal Algunas de las propiedades más usadas en el formulario son:

Caption: es el texto que se observa en la parte superior como título de la ventana.

Left: se refiere a la ubicación del formulario, a lo largo de la pantalla gráfica del sistema.

Top: se refiere a la ubicación del formulario, a lo alto de la pantalla gráfica del sistema.

Nota: las dos (2) propiedades anteriores asumen la posición teniendo como referencia la esquina superior izquierda de la pantalla.

Width: se refiere al ancho del formulario. Esta medida se da en pixeles.

Height: referente al alto del formulario.

BorderStyle: opción mediante la cual se determinara el tipo del formulario:

• Diálogo (bsDialog). El formulario sólo contiene el botón para cerrar la ventana, no se permite escalarla, es decir cambiarle de tamaño.

• Escalable (bsSizeable). El formulario se puede maximizar o cambiar de tamaño.

• Sin bordes (bsNone). El formulario no contiene bordes, es del tipo splash, muy útil para hacer aplicaciones a pantalla completa, en especial, software educativo.

Color: color del fondo del formulario.

Name: nombre del formulario con el cual se hace referencia a algunas tareas específicas; por defecto, el nombre que el sistema le asigna es FORM1, al crear otro componente¹ u otro formulario se continúa con una cuenta numérica teniendo en cuenta este número.

¹Un componente, es un elemento que se ubica en el formulario como parte del diseño de éste. Vea el capítulo. 3

Figura 2.3: Ejemplo de formulario, donde se muestra: el título, el tamaño y la posición.

2.1

Diseño de aplicaciones

El formulario o (Form) es la principal herramienta de programación para que usuario y computador se comuniquen. El formulario es la ventana o ventanas que se despliegan cuando se ejecuta un programa.

Un adecuado diseño, permite al usuario tener una visión clara de la ejecución del programa y, por consiguiente, facilita la búsqueda de soluciones, tanto en matemáticas como en otras ciencias.

El diseño de formularios es muy importante, no sólo para el usuario final, sino para la adecuada resolución de problemas en matemáticas y en variadas ciencias formales, en las cuales es pertinente ver o representar los datos de forma detallada para el usuario y el programador.

2.1.1

Pasos para construir una aplicación

Cuando se habla de la necesidad de seguir unos pasos, se hace con el fin del que el programador forme una estructura lógica para programar (algoritmo). Se ha observado entonces que los pasos más pertinentes para el diseño y desarrollo adecuado de una aplicación son:
1. Modelar el problema: es útil para encontrar una secuencia de pasos que

resuelvan el problema, o simplemente encontrar una ecuación que sustente una situación. Vale la pena recordar que el computador no resuelve ningun problema, sólo utiliza un algoritmo que es la solución al problema o situación.

2. Diseño del formulario: ya teniendo bien definido el modelo matemático se procede a diseñar el formulario con los elementos necesarios para dar una buena presentación al problema, forma tal, que tanto el programador como el usuario de la aplicación puedan tener resultados bien organizados.

3. Codificación del modelo matemático: se codifica el modelo matemático, llevándolo al código fuente, el cual se hace creando variables, procesos, funciones, ciclos y estructuras que se verán más adelante.

4. Depuración de la aplicación: el último paso y tal vez el más importante, es el de depurar la aplicación, mediante el ingreso de datos de un problema concreto, el cual fue resuelto antes, de forma analítica.

Ejemplo 1

. Mi primer programa

Al abrir Lazarus Project saldrá la distribución de ventanas que se mostraron al inicio de este capítulo.

Del menú principal, busque el objeto “botón” y el “objeto” etiqueta.

Figura 2.4: Selección de los Primeros Objetos.

Haga doble clic sobre ellos y aparecerán sobre el formulario de diseño, organícelos de la siguiente manera:

Figura 2.5: Diseño del Formulario

Cuando los objetos esten sobre el formulario, haga doble clic sobre el botón, y en la ventana del código fuente aparecerá lo siguiente:

Figura 2.6: Código generado por Lazarus.

Luego dentro de las palabras Begin y End coloque el siguiente código:

Figura 2.7: Modificación del código.

Lo que se ha hecho, es que cuando se dé clic sobre el botón, la etiqueta cambiará su contenido.

Label1, es el nombre que trae por defecto la etiqueta, que se ha puesto sobre su formulario.

Para acceder al texto de la etiqueta (escribir texto) se accede a la propiedad caption colocando un punto después del nombre de la etiqueta.

En Lazarus para asignar un valor a una variable o propiedad, se usan dos puntos y el igual; el igual (=) se usa para hacer comparaciones.

Para escribir textos (cadenas “strings”) se usan los comillas simples.

Finalmente, cada línea de código debe terminar con un punto y coma, indicandole a Lazarus que se iniciara una nueva línea de código.

Para ver cómo funciona la aplicación, se hace clic sobre el botón de “ejecutar la aplicación” o pulsando la tecla F 9.

Figura 2.8: Ejecutando la Aplicación

Después de ejecutar la aplicación en pocos segundos saldra una ventana como la siguiente.

Figura 2.9: Aplicación en ejecución

Ejemplo 2

. Guardar un proyecto de Lazarus Free Pascal

Para guardar la aplicación, acceda al menú Archivo Guardar o usando el acceso corto Ctrl+S y cree una carpeta nueva que se llame Suma_de_números. Es muy importante que el nombre de la carpeta no contenga caracteres extraños, sólo las letras de la A a la Z, mayúsculas y minúsculas, números y el guión bajo, esto le garantizara ahorrarse algunos problemas de compilación de la aplicación, debido a tales caracteres.

Lazarus guarda varios archivos en la carpeta que se ha creado, como son:

Archivo *.lpi (Lazarus Project information), es donde se guardan los cambios que se hagan al proyecto.

Archivo *.lpr (Lazarus Project resource), contiene el programa principal del proyecto.

Archivo *.pas (Código fuente Pascal), contiene el código del programa, los procesos y funciones escritas por el programador, a este archivo se le conoce como una unidad del programa.

Archivo *.lfm (Lazarus form main), contiene la descripción y el número de componentes que se encuentran en el formulario.

Figura 2.10: Creando una Nueva Carpeta para Guardar el Proyecto

Ahora se abre la carpeta donde deberá guardar el primer archivo con extensión *.lpi*, con el mismo nombre de la carpeta:

Figura 2.11: Guardando el Archivo del Proyecto.

Seguidamente guarde el archivo con extensión *.pas* con el nombre de la carpeta, pero antepondiendo alguna palabra, por ejemplo: und_Suma_de_números, lo cual indica que el archivo es una unidad de código fuente:

Figura 2.12: Guardando el archivo del código fuente

Esta secuencia se recomienda para iniciar con exito la programación en Lazarus Project, debido a que las rutas de compilación pueden variar según sea la codificación de caracteres, además pueden ocurrir errores que no dependen del código de la aplicación.

Ejemplo 3 . Tomar un texto de una caja de texto

Hasta este punto ya se sabe manipular el evento; de clic en un botón, ahora se capturará el texto (string) de una caja de texto.

En el primer formulario que se ha diseñado, se agregará una caja de texto, que se encuentra al lado de la etiqueta.

Figura 2.13: Guardando el Archivo del Código Fuente

Luego, en el código del botón se hace la siguiente modificación.

Figura 2.14: Modificando el código fuente

Se ha quitado parte del texto y se agrega (mediante el signo más, que indica que al texto ’Hola ’ se le agregara el contenido de la caja de texto) el contenido de la caja de texto, que se obtiene mediante la propiedad Text.

2.1.2

Operaciones con cadenas de texto

Dos (2) textos pueden ser concatenados

²

, representados en programación con el signo (+).

²Concatenar es unir dos (2) o más textos almacenados en variables u ubicados dentro de comillas simples

Por ejemplo, si:

₁ a := ’ La suma es ’ ;
₂ b := ’ diferente de ’ ;
₃ c := ’ la división ’ ;

Con la siguiente operación, se crea una variable d que contiene a otras variables de tipo string.

₁

d := a+b+c ; La variable d contiene ahora:

’La suma es diferente de la división’

Figura 2.15: Modificando el código fuente

Mediante estos tres (3) objetos, ya se pueden crear otras aplicaciones más elaboradas.

Ejecutar el programa . Cada vez que se quiera probar el programa, se debe cerrar la ventana que se genero para poder ejecutar de nuevo el programa si se ha hecho alguna modificación al código.

Seguidamente, se explica cómo funciona la conversión de valores, para realizar otro tipo de aplicaciones donde requiera caracteres alfanuméricos (letras y números).

2.1.3

Conversión de tipos de valores

En Lazarus Project se hacen operaciones con variables, las cuales son de varios tipos siendo variables de tipo:

String (o cadena que simboliza un texto), un Intiger, (define un número entero) y un Real (dependiendo el lenguaje, se utiliza float), los tres (3) tipos más comunes. Pero es frecuente que exista la necesidad de hacer conversiones de variables para pasar de unos tipos a otros veamos los siguientes ejemplos:

• Se necesita convertir un texto a un valor numérico entero, se presenta el siguiente esquema:

Texto (String)−→ Z (Integer) donde Z, representa un número entero.

Los textos en Lazarus se tipifican con String y los números enteros con Integer, ahora la codificación quedará así

Texto (String) −→ Z (Integer)

Lo cual facilitará el uso en cualquier aplicación de forma fácil. Así, tomando las primeras tres (3) letras de cada código obtendremos la función

StrToInt(valor);

donde el valor dado será un texto y esta función devolverá un número entero; si y sólo si, el texto contiene un número entero.

Por ejemplo, sea la variable:
Cadena := ’123’;
Al realizar el proceso de conversión:
ValorNumerico := StrToInt(Cadena); éste hará que la variable V alorNumerico tome el número entero 123.
• Por otra parte, se hace

Z −→ Texto Integer −→ String

Generando la función: IntToStr(); que toma como argumento un número entero convirtiendolo a una cadena de texto.

¿En qué casos se deben usar estas funciones? .
Antes de dar respuesta a esta pregunta, es necesario entender como se realiza el procesamiento de la información

A continuación se presenta un diagrama que expresa tal acción.

Figura 2.16: Diagrama: Procesamiento de la Información

3

Para tal situación, se selecciona la primera función StrToInt(), para convertir los datos textuales a datos numéricos.

³Es un diagrama de tipo ilustrativo, en el cual se introducen unos datos, se realizan los cálculos con ellos, finalmente, se muestran los resultados.

Después de realizar los cálculos se deben mostrar los resultados, este proceso se hace a través de la segunda función IntToStr().

₁ { Los datos son los números 10 y 5}
₂ a := 10;
₃ b := 5;

4

₅

{ Se hace la conversión }

₆

c := ’ La suma es : ’ +IntToStr ( a+b ) ;

2.1.4

Otros tipos de funciones de conversión

Los cálculos realizados en las aplicaciones, no siempre arrojaran números enteros, por lo tanto, se necesitan dos (2) funciones más para el trabajo con números reales, y estas son:

FloatToStr(), convierte un número real a una cadena de texto. StrToFloat(), convierte un texto a un número real; si y sólo si el texto contiene un número real.

Ejemplo 4

. Calcular el área de un rectángulo

Problema:

. construir una aplicación para calcular el área de un rectángulo

Siguiendo los pasos descritos anteriormente procedemos a diseñar y desarrollar la aplicación.

Modelar el problema . Se tiene un rectángulo de base (b) y altura (h) así, su área está definida como A = b ∗ h.

Diseñar el formulario . Como se tienen dos (2) variables, en las cuales el usuario va introducir los datos al formulario, se necesitan dos TEdit o cajas de texto para ingresar los datos. Un botón para guardar las instrucciones necesarias para calcular el área.
Un TLabel para mostrar el resultado.

Figura 2.17: Diseño del Formulario para Calcular el Área de un Rectángulo

Escribir el código . Para escribir el código, se debe tener en cuenta que cuando, el usuario haga clic en botón se realizaran los cálculos.

Al hacer doble clic en el botón calcular, aparecerá en código fuente el proceso Onclick, al calcular le agregamos el siguiente código (resaltado por los recuadros):

Ejemplo 5

. Aplicaciones dinámicas

¿Cómo generar aplicaciones dinámicas? .
En aplicaciones de geometría, tales como el GeoGebra, se puede notar que las construcciones se vuelven dinámicas, y una de las herramientas más usadas para tal fin, son los deslizadores;a con ellos, el usuario a cambio de introducir números con el teclado, puede introducir valores usando los deslizadores

aUn deslizador es un componente a forma de regleta donde se mueve una guía, la cual toma valores según su posición sobre la regleta, ver página 70.

TTrackBar: En Lazarus un deslizador, es del tipo TTrackBar, el cual simula un deslizador.

Este tipo de deslizadores manejan unas propiedades y eventos importantes para el trabajo con aplicaciones dinámicas.

Construyamos ahora la misma aplicación para calcular el área de un rectángulo pero haciéndolo de una forma dinámica.

El componente TTrackBar, maneja la propiedad Min, precisando el valor mínimo que puede tomar. La propiedad Max, especificando el valor máximo que puede tomar. La propiedad Position, especifican la posición en la que se encuentra el indicador.

Ahora, el diseño del formulario cambiará, véase en la siguiente figura:

Figura 2.18: Formulario, área del Rectángulo en forma Dinámica Ahora debemos cambiar el evento OnChange de cada uno de los deslizadores que llamaremos desH y desB, respectivamente.

₁ { Cambio del deslizador de la base }
₂ procedure TForm1. desBChange ( Sender : TObject ) ;
₃ begin
₄ EtBase . Caption := ’ Base = ’ + IntToStr ( desB . Position ) ;
₅ base := desB . Position ;

₆

area := base * altura ;

7

₈

Etiqueta . Caption := ’ área : ’ + IntToStr ( area ) ;

₉ end

;

₁ { Cambio del deslizador de la altura }
₂ procedure TForm1. desHChange ( Sender : TObject ) ;
₃ begin
₄ EtAltura . Caption := ’ Altura =

5

₆

altura := desH . Position ;

⁷

area := base * altura ;

8

’ + IntToStr ( desH . Position ) ;

₉

Etiqueta . Caption := ’ área :

₁₀ end

;

’ + IntToStr ( area ) ;

Finalmente, se tiene una aplicación para calcular el área de un rectángulo en forma dinámica.

Figura 2.19: Resultado, Área del Rectángulo en Forma Dinámica

Ejercicios

.

Realizar una aplicación dinámica para los siguientes problemas.

1. Área de un triángulo.
2. Área de un círculo.
3. Área de un trapecio.

Ejercicios .
A continuación se propone una lista de ejercicios para profundizar más en el diseño y desarrollo de formularios, para aplicaciones matemáticas.

1. Encontrar el área que esta por fuera del cuadro y por dentro del círculo:

Si el lado del cuadrado es la c parte del radio (c es una proporción del radio) de la circunferencia.

2. Encontrar el área el volumen de un cubo de arista n.
3. Encontrar el área y el volumen de un tetraedro de arista n.
4. Calcular el área y el volumen de una esfera de radio r.

5. Diseñar una aplicación dinámica para calcular el área y el perímetro de un triángulo rectángulo.

6. Dada la función y = f (x), calcular una tabla de valores para 10 valores de x. 7. A partir de una aplicación dinámica determinar cuando un triángulo y un rectángulo tienen la misma área, o cuando tienen el mismo perímetro.

3

Componentes de Lazarus Project

El entorno de desarrollo de Lazarus muestra en la parte superior una barra con varias pestañas, en las cuales hay varios botones, correspondientes a cada uno de los componentes con los cuales se diseña la aplicación.

Los componentes se disponen en el formulario como el programador lo desee, creando variadas aplicaciones; estos componentes presentan una serie de propiedades, que se explican a continuación.

3.1

Propiedades

Una propiedad es una característica de un componente (alto, ancho, color, tipo de fuente, etc). Las propiedades de cada componente se observan y se modifican en el panel de propiedades o inspector de objetos.

Todos los componentes tienen distintas propiedades, sin embargo existen propiedades que son comunes a muchos componentes, estas se describen a continuación.

Con la propiedad Align se alinean los componentes al formulario. En la propiedad Aligment se alinea el texto contenido dentro del componente, a la izquierda justificado, a la derecha Justificado o al centro. En la propiedad BorderStyle, se quita o colocar los bordes de un componente.

31 Con la propiedad Caption, se modifica la etiqueta que trae por defecto el componente, está relacionado con el nombre y muestra un texto o título sobre el componente.

En la propiedad CharCase, se restringe la escritura solo a letras mayúsculas, solo a letras minúsculas o a libre uso del usuario. La propiedad Checked, selecciona o deselecciona, cuando se intercambian los valores True o False.

Con la propiedad Color, se cambia el color del fondo del componente. Con la propiedad Enabled, se habilita o inhabilita el componente, intercambiando los valores True y False.

Con la propiedad de la Font, se modifica el tamaño, el color y el tipo de letra que tiene la etiqueta del componente.

La propiedad Heigth, permite cambiar el alto del componente. Con las propiedades Hint y ShowHint, se muestra un mensaje de ayuda, acerca de la función que hace el componente.

Con las propiedades Left y Top, se cambia la posición del componente dentro del formulario.

Con la propiedad MaxLength se restringe el máximo de caracteres que se pueden introducir en el componente de tipo texto.

En la propiedad PasswordChar se cambia el carácter que modifica la mascara de entrada, para formar componentes de texto del tipo contraseñas.

Con la propiedad PopupMenu, se selecciona un menú flotante para el componente.

Con la propiedad ReadOnly, se restringe al componente a modo de sólo lectura, colocando a True.

La propiedad State, permite definir el estado del componente:

• Chequeada : cbChecked.
• No Chequeada : cbUnchecked.
• Seleccionada : cbGrayed.

En la propiedad ScrollBars se modifica el tipo de barras deslizantes:

• ssAutoBoth : las barras se modifican, según el ancho y el alto del texto.
• ssAutoHorizontal: las barras se modifican horizontalmente.
• ssAutoVerical: las barras se modifican verticalmente.

Con la propiedad Text accede al texto que se ha escrito en el componente de texto.

Con la propiedad Visible se esconde o ver el componente, según sean los valores asignados True o False.

Con la propiedad Width, se modifica el ancho del componente.

La propiedad WordWrap, permite el rompimiento de las líneas de texto, si su valor esta en modo True.

3.2

Eventos

Un evento es el proceso que se ejecuta cuando se hacen cambios en un componente. De otra forma los componentes tienen sensores que están pendientes de las acciones que se dan en el sistema, por ejemplo cuando se da clic sobre un botó ó cuando se cambia el texto de una caja.

Para cada componente, están asociados una lista de eventos o sensores que pueden ser programados y combinados para distintas tareas.

Con el evento OnChange, se determina en que momento se cambio el estado de selección del componente.

Con el evento Onclick se determina cuál es la función que hace el componente cuando se da clic sobre él.

Con los eventos OnDragDrop y OnDragOver, se recibe información, datos y variables al componente, provenientes de otros componentes. Con el evento OnKeyDown, se crean funciones para el componente, usando el teclado y el mouse.

Con el evento OnKeyPress, se restringe la escritura de algunos caracteres.

Con los eventos OnMouseDown, OnMouseMove y OnMouseUp, se puede mover el componente por el formulario o caja que lo contiene.

Con los eventos OnMouseEnter y OnMouseLeave, se puede crear una animación en el componente.

3.3

Componentes Standard

Son un conjunto de componentes reunidos en la pestaña estandar (Standar), son los elementos básicos o más comunes para hacer los diseños en el formulario.

Figura 3.1: Barra de Componentes Standard

A continuación, se describen algunos de los componentes ubicados en la pestaña Standard.

Para crear un componente, selecciónelo y dibuje un rectángulo en el formulario, allí aparecerá el componente en modo edición, para hacer las modificaciones necesarias.

Algunas de las propiedades, eventos y combinación de eventos de las subsecciones (3.1), (3.2) y (3.10), son aplicables a los componentes de esta sección.

3.3.1

Menú (TMainMenu)

El menú es un componente con el cual se pueden crear menús para los programas que construimos en Lazarus, conteniendo un gran número de usos y funciones importantes, que harán más fácil el trabajo en el programa que se está desarrollando.

Figura 3.2: Edición de Menús (TMainMenu)

Para agregar un menú al formulario, se situa el componente

sobre el formulario, haga doble clic sobre el ícono para abrir el editor de menú.

Para agregar más menús horizontales, de clic derecho sobre la cajita que aparece en el editor, New Item1, presionamos las opciones Insertar Nuevo Elemento (después) ó Insertar New Elemento (antes).

Cada una de las opciones de menú puede contener un submenú, para crear un submenú vertical sobre una de los menús que tiene diseñado, haga clic derecho en una de las cajas de menú y seleccione la opción Crear Submenú.

El único evento asociado a los menús, es cuando se da clic sobre tal menú, es decir el evento Onclick. También se pueden agregar casillas de verificación, para determinar que hay una opción activa.

En los menús se pueden colocar accesos cortos, usando la combinación de teclas Alt, Ctrl, Shitf, las letras, los números y las funciones.

Otra opción importante en Lazarus, es crear un menú que contenga íconos, para ello se deben diseñar los íconos y luego llamarlos desde el inspector de objetos. Nota: los íconos deben estar en el formato BMP.

3.3.2

Menú Flotante (TPoupMenu)

El menú flotante es al que se puede acceder desde muchos componentes, dando clic derecho sobre una región del componente (en tiempo de ejecución).

Figura 3.3: Edición de Menús (TPopupMenu).

Para editar los menús haga doble clic en el ícono que ha creado. Para crear menús dé clic derecho a la caja que aparece y seleccione las opciones Insertar Nuevo Elemento (antes) o (después).

Para crear submenús en los menús, haga clic derecho sobre el menú y seleccione la opción Crear Submenú.

Dentro de las opciones del menú flotante están, organizar los menús moviéndolos hacia arriba o abajo, también, procesar el evento cuando se hace clic sobre el menú, guardar como plantilla e insertar desde plantilla.

A este tipo de menús, es posible agregar un ícono que expresara la acción del menú. Este ícono se puede cargar en la propiedad Bitmap del menú.

Es importante aclarar que, para cambiar la etiqueta de los menús, es necesario modificar la propiedad caption en la cuál se podrá colocar tal información.

En algunas ocasiones es necesario agregar una verificación para indicar que hay alguna configuración u opción activa dentro del programa, por ejemplo: las barras de herramientas. Esta propiedad se cambia en Checked de verdadero a falso y viceversa. Por ejemplo, si presionamos clic derecho sobre el inspector de objetos, éste mostrará el siguiente menú, donde aparece una opción chequeada, lo cual revela que, en el momento se está mostrando el árbol de componentes, de lo contrario no se mostraría.

Figura 3.4: Mostrando el Árbol de componentes

Para agregar accesos rápidos a los menús, basta con dirigirse a la propiedad ShorCut y realizar la combinación de teclas para el acceso rápido. Un acceso rápido es aquel que se hace con las teclas, por ejemplo Ctrl+V comúnmente pega el texto, imagen o información copiada. De esta manera, configuramos los menús con este tipo de teclas, para acceder más rápido a ellos.

Figura 3.5: Edición de Menús.

3.3.3

Botón (TButton)

Los botones son componentes, que permiten el acceso rápido a procedimientos y funciones del programa, tales como: hacer cálculos, cambiar vistas, etc.

Figura 3.6: Edición de Botones (TButton)

Por defecto, un botón trae el nombre Button1, Button2 y así sucesivamente en la medida que se van creando más botones.

Se puede cambiar el nombre al botón modificando la propiedad Name colocando un nombre adecuado al botón. El texto que coloque allí en esta propiedad sera la misma que contendrá como etiqueta, si desea cambiarlo en la propiedad Caption se puede hacer.

Si busca un mejor aspecto para el botón, cambie la fuente que se encuentra en la propiedad Font, también puede modificar el tamaño del botón, cambiando las propiedades Width y Height, y agregar un mensaje de ayuda, si lo desea en la propiedad Hint.

Al hacer doble clic en el botón se crea un procedimiento en el código fuente, dentro del cual se agregan los procesos y funciones que se requiere que haga el botón.

3.3.4

Etiqueta (TLabel)

La etiqueta es un objeto útil para mostrar información en el formulario.

Figura 3.7: Edición de Etiquetas (TLabel).

Para cambiar el texto de la etiqueta busque en el inspector de propiedades la propiedad Caption y agregue un nuevo texto, del mismo modo puede cambiar el estilo de la etiqueta, cambiando su color o modificando la fuente que se encuentra en las propiedades Font.

Al usar los eventos OnMouseEnter, OnMouseLeave y Onclick, puede crear un hipervinculo a alguna función del programa, para lo cual, en el evento OnMouseEnter, cambiar el color de la fuente de la etiqueta, subrayarla. En el evento OnMouseLeave restaurar la etiqueta y el evento Onclick realizar alguna función de programa, como mostrar una información, etc.

3.3.5

Caja de Texto (TEdit)

Las cajas de texto, son componentes sobre los cuales se puede escribir texto, son el instrumento con el que el usuario introduce datos al computador.

Figura 3.8: Edición de Cajas de Texto (TEdit).

Puede cambiar el nombre de la caja de texto en la propiedad Name, texto que también quedará almacenado en la propiedad Text. Si desea borrar o extraer el contenido de la caja de texto, se debe usar la propiedad Text, la cual devuelve una cadena de texto.

En ocasiones, resulta necesario deshabilitar la caja de texto (no permitiendo que en tiempo de ejecución se pueda escribir o acceder al texto contenido en la caja), para ello, se usa la propiedad Enabled, que debe ponerse con el valor False, pero si se quiere que la caja sea de sólo lectura (es decir que no se puede modificar el texto de la caja), se accede a la propiedad ReadOnly, poniendo el valor True.

Si se quiere crear una caja para ingresar una contraseña, basta con poner en la propiedad PasswordChar un *, $, %, o # que enmascaran los caracteres que se ingresan.

Por último, para dar una bonita apariencia a la caja de texto, se puede modificar la propiedad Color; para agregar un color, o la propiedad Font para modificar el tamaño, color o tipo de letra que se escribe en la caja de texto.

Ejemplo 6

. Sumar dos números enteros

Suma de dos números

. Se desea construir una aplicación sencilla para sumar dos números

¿Cómo se hace? . Para construir tal aplicación se usan los primeros cinco (5) componentes vistos para explicar más en detalle cual es su funcionamiento

Se Abre Lazarus Project Free Pascal y sobre el formulario que aparece por defecto

se agrega un componente de menú

, un menú flotante

, una etiqueta

,

dos cajas de texto

, un botón

, y otra etiqueta para mostrar el resultado.

Ahora, la distribución de componentes de la aplicación es la siguiente:

Figura 3.9: Formulario con Componentes.

Usando las propiedades, cambiamos la información de la etiqueta (L_Etiqueta) en la propiedad caption, y la podemos alinear a la parte de arriba con la opción alTop, cambiar la fuente y colocarla de color azul.

Figura 3.10: Configurando las Propiedades

Se alinean las cajas de texto en la parte de arriba, colocando la propiedad Align en la opción alTop, se coloca la alineación del texto en el centro Alignment (taCenter), y el botón con una alineación en la parte de arriba opción alTop, la etiqueta del resultado con la misma configuración que la primera etiqueta.

Figura 3.11: Configurando las Propiedades de los Componentes

Esta alineación permitirá, que al maximizar la ventana, los componentes también cambien de tamaño y no se altere su posición.

Figura 3.12: Maximizando la Ventana

¿Cómo crear los elementos del menú? .
Para crear los menús, hacemos doble clic en el componente MenuP y con clic derecho sobre la ventana que aparece, empezamos a agregar opciones

Figura 3.13: Creando Nuevos Opciones
Para cambiar el texto que aparece en el inspector de propiedades y en la propiedad Caption ubicamos otro texto

Figura 3.14: Cambiando las Etiquetas de las Opciones.

Para crear un submenu hacemos clic derecho sobre una de las opciones y seleccionamos la opción Crear Submenú en la propiedad Caption se cambia también su etiqueta.

Figura 3.15: Creando Submenús

¿Cómo poner íconos al menú? .
Para poner íconos al menú, debe tenerse en cuenta que para un buen aspecto sólo deben colocarse imágenes de 16 × 16 pixeles, en formato bmp

Para agregar una imagen, seleccione una de las opciones del menú y en el inspector de propiedades busque la imagen que ha diseñado o buscado, esto para las opciones a las que desea agregar un ícono

Figura 3.16: Creando Submenús

En la siguiente imagen, se han agregado cuatro (4) opciones más, las operaciones básicas de la artimetica con el fin de explicar otras opciones del menú.

Figura 3.17: Menú de la Aplicación.

Para grabar un acceso rápido, vamos al inspector de propiedades y buscamos la propiedad ShortCut, y buscamos una combinación de teclas, por ejemplo para sumar las teclas Ctrl+S.

Figura 3.18: Grabando un ShortCut.

Análogamente, para las opciones, deseamos que tengan acceso rápido desde el teclado.

Figura 3.19: Menú con Acceso Corto

Ahora, vamos a crear el menú emergente o flotante que se crea de la misma forma que el anterior, las etiquetas, los submenús y los íconos se ubican de la misma forma.

Figura 3.20: Menú Flotante.

En la figura anterior se puede obeservar un chulo (tambiém conocido como viñeta), que marca a la opción suma y a la opción Activadas, esto se hace cambiando la propiedad Checked a True desde el inspector de propiedes o desde el código sabiendo en este caso, por ejemplo cual es la operación por defecto.

¿Cómo crear el evento clic en el menú? .
Ahora, para hacer efectivos estos menús, vamos al primer menú y hacemos clic en la primera opción que es sumar, la cual generará automáticamente un código, sobre el cual acabaremos de escribir el algoritmo de la suma.

₁ {sumar los números }
₂ procedure TForm1. MenuItem3clic ( Sender : TObject ) ;
₃ begin

4

₅ end

;

Este procedimiento es un sensor, que se activa cuando seleccionamos la opción [Sumar] del menú de la aplicación.
En este procedimiento, vamos a tomar los valores de las cajas de texto en dos (2) variables de tipo entero, que vamos a crear en la sección de variables.

₁ var
₂ Form1: TForm1;
₃ a , b : Integer;
₄ res : Integer;

Para tomar los valores de las cajas de texto, se hace lo siguiente:

₁ {sumar los números }
₂ procedure TForm1. MenuItem3clic ( Sender : TObject ) ;
₃ begin
₄ a := StrToInt (E_Num1.Text) ;
₅ b := StrToInt (E_Num2.Text) ;
₆ end;

Donde: E_Num1 y E_Num2 son las cajas de texto que contiene los números. Para saber un poco más acerca de la conversión de tipos de datos, revise la en la página 24.

Para hacer la correspondiente suma se hace:

₁ {sumar los números }
₂ procedure TForm1. MenuItem3clic ( Sender : TObject ) ;
₃ begin
₄ a := StrToInt (E_Num1.Text) ;
₅ b := StrToInt (E_Num2.Text) ;

6

₇ res := a+b ;
₈ L_Resultado . Caption := ’ La suma es : ’ +IntToStr ( res ) ;
₉ end;

Análogamente se hace para las otras operaciones, que no estan dentro del objetivo de este ejemplo, pero que se dan para explicar los menús.

Para hacer por ejemplo, la operación por defecto del menú flotante se hace lo siguiente:
₁ { Hacer la operación por defecto }
₂ procedure TForm1. MenuItem13clic ( Sender : TObject ) ; ₃ begin
₄ { s i la operación por defecto es la suma i r a la suma} ₅ i f MenuItem9 . Checked then
₆ begin
₇ MenuItem3clic ( S e l f ) ;
₈ end;
₉ end;

Esto quiere decir que SI la opción del menú está activa, es decir que, Checked es igual a True entonces activamos el procedure que se hizo anteriormente para capturar los números de las cajas de texto y sumarlas.

Si hubiera otra operación activa también se toma en cuenta y se pone la condición dentro del procedimiento anterior.

¿Cómo cambiar a otra operación? .
Creamos cada evento clic de los menús, y el menú que quedara con la opción de operación por defecto, se da la propiedad Checked en True y las demás en False

Por ejemplo, cambiar a restar:

₁ { cambiar a restar }
₂ procedure TForm1. MenuItem10clic ( Sender : TObject ) ;
₃ begin
₄ MenuItem9 . Checked:=False;
₅ MenuItem10 . Checked:=True;
₆ MenuItem11 . Checked:=False;
₇ MenuItem12 . Checked:=False; end;

La unica opción que se mostrara es la de restar.

Figura 3.21: Cambiando de Operación por Defecto

¿Cómo activar o desactivar las cajas de texto?

.

Onclick, en las opciones de menú Esto se logra mediante el evento de las Cajas de Texto

El código es sencillo:

₁ { Activar cajas }
₂ procedure TForm1. MenuItem16clic ( Sender :
₃ begin
₄ E_Num1. Enabled := True;
₅ E_Num2. Enabled := True;
₆ MenuItem16 . Checked := True;
₇ MenuItem17 . Checked := False;
₈ menu
₉ end;

10

₁₁ { Desactivar cajas }
₁₂ procedure TForm1. MenuItem17clic ( Sender :
₁₃ begin
₁₄ E_Num1. Enabled := False;
₁₅ E_Num2. Enabled := False;
₁₆ MenuItem16 . Checked := False;
₁₇ MenuItem17 . Checked := True;
₁₈ end;

TObject ) ;

TObject ) ;

Cuando se da clic en el ítem de activar, se activan las dos (2) cajas de texto mediante la propiedad Enabled que se pone a True, se coloca la verificación a la opción activados y se quita a la opción desativados. De igual forma se hace cuando se da clic en la opción desactivar, pero colocando las propiedades de las cajas de texto a False.

Figura 3.22: Activando y Desactivando las Cajas de Texto.

¿Cómo hacer que el botón ejecute una operación? . Simplemente se da clic en la opción Onclick para que ejecute la acción del menú [Hacer operación por defecto]

Seleccionamos el botón y vamos al inspector de propiedades y eventos.

Figura 3.23: Redireccionando el Evento Onclick.

Cuando se presiona el botón, éste hará lo mismo que la opción [Hacer operación por defecto].

Figura 3.24: Realizando la Operación

¿Cómo restringir la escritura a sólo números? .
Éste se hace mediante el evento OnKeyPress de una de las cajas, se busca el evento y se crea presionando el botón de los tres (3) puntos

₁ { r e s t r i n g i r valores }
₂ procedure TForm1. E_Num1KeyPress ( Sender : TObject ; var Key : char) ;
₃ begin
₄ i f not ( key in [ ’ 0 ’ . . ’ 9 ’ , ’−’ , # 8 ] ) then
₅ begin
₆ key := #0;
₇ end;
₈ end;

esto quiere decir que si la tecla (Key) no esta en el conjunto de los números del 0 al 9, a el signo menos (-) o la tecla de borrar (#8) entonces que no escriba nada, es decir (#0).

3.3.6

Memos (TMemo)

El Memo es una caja de texto, que contiene varias líneas de texto, a modo de block de notas.

Figura 3.25: Edición de Memos (TMemo).

Para cambiar el nombre al Memo, localice la propiedad Name. También puede agregar un color de fondo al Memo en la propiedad Color, o modificar el aspecto del texto que se escribe en la propiedad Font.

Si el Memo quedara dentro de imágenes, puede quitar el borde del Memo en la propiedad BorderStyle dando la opción bsNone.

El Memo pueden ser de escritura y lectura, si quiere que sólo esté disponible para leer, puede cambiar el valor de la propiedad ReadOnly a False, para evitar la escritura, o puede deshabilitar las dos (2) opciones, cambiando la propiedad Enabled a False.

Los Memos pueden ajustarse al formulario, para ello debe cambiar la propiedad Align a alClient. La forma como se escribe el texto, puede ser alineada a la izquierda, a la derecha o centrada, todo depende del valor de la propiedad Alignment, al igual que si desea que sólo se pueda escribir texto en mayúsculas, minúsculas, modificando las opciones de la propiedad CharCase.

Por último si desea limitar el Memo a una cantidad máxima de caracteres, puede agregar esta cantidad a la propiedad MaxLength.

3.3.7

Caja de Verificación (TCheckBox)

La caja de verificación es un componente que permite cambiar de un estado de verdad a falsedad y viceversa, usando para ello opciones de configuración, modificación o verificación de actividades.

Figura 3.26: Edición de Cajas de Verificación (TCheckBox).

Para cambiar el nombre, busque la propiedad Name en el inspector de objetos. Es importante cambiar la etiqueta que identifica la función del componente, además puede agregar texto de información en la propiedad Hint y cambiar el estado de verdad de la propiedad ShowHint a True.

Para determinar en el programa, cuando la caja ha cambiando de estado, puede usarse el evento OnChange, que determina cuándo se ha dado el cambio de uno de los ítems. Este cambio puede darse de tres formas cbUnchecked, cbChecked o cbGrayed, es decir, no seleccionado, o seleccionado que se pueden modificar en la propiedad State del componente.

El aspecto de las cajas puede variar, según los cambios que se hagan de color del fondo en la propiedad Color, o de la fuente, en la propiedad Font.

3.3.8

Radio Botón (TRadioButton)

El radio botón es un pequeño botón con una etiqueta el cual puede ser seleccionado de un conjunto de radios botones. Es muy útil para hacer cuestionarios con preguntas de selección múltiple con única respuesta.

Figura 3.27: Edición de Radio Botones (TRadioButton).

Puede agrupar varios Radios Botones y modificar su aspecto visual desde la propiedad Color o desde la propiedad Font.

Se puede determinar cuando un radio botón ha cambiando de estado implementando el procedimiento OnChange o analizando cuál es su estado, desde la propiedad Checked.

Estos componentes por sí solos no son de gran relevancia, es por ello que vienen acompañados de una etiqueta que servirá de información, la cual se puede cambiar desde la propiedad Caption.

En el diseño de preguntas, es útil deshabilitar el radio botón, para ello se puede cambiar la propiedad Enabled a False, o se puede optar por esconder el componente, haciendo uso de la propiedad Visible en modo False.

3.3.9

Lista de Selección (TListBox)

Las listas son componentes, donde se dispone de un conjunto de opciones elegibles.

Figura 3.28: Edición de Listas (TListBox).

El aspecto visual de una lista es muy importante, para ello, se cuenta con un conjunto de propiedades que permitirán tal mejora. En la propiedad Color se puede cambiar el color del fondo de la lista. En la propiedad Font, se modifica el tamaño, color y estilo del texto que se escribe en la lista. En la propiedad Columns se puede colocar más de una columna.

Para determinar si se ha seleccionado algún elemento de la lista, se usa el evento Onclick, sobre el cual se determina, por medio de la función ItemIndex, si algún elemento está seleccionado.

Los elementos de una lista, se pueden ordenar alfabéticamente, cambiando el valor a True de la propiedad Sorted, o pueden borrarse, modificarse. Se puede deshabilitar la lista, cambiando el valor de la propiedad Enabled a False, puede esconderse cambiando el valor de la propiedad Visible a False.

3.3.10

Caja de Selección (TComboBox)

Las cajas de selección, son tal vez una combinación entre una lista de selección de opciones y una caja de texto, dado que se pueden seleccionar opciones de ella, pero también se pueden escribir texto, tal como se hace en un TEdit.

Figura 3.29: Edición de Cajas de Selección (TComboBox)

En la propiedad ítems, se pueden agregar, modificar o borrar los elementos de la caja de selección.

Para visualizar la lista en distintos de la propiedad Style, las cuales csOwnerDrawFixed, csOwnerDrawVariable y csSimple, que permitirán la edición o no de texto, mostrar la flecha para seleccionar otros elementos, etc. aspectos se modifican las opciones

son: csDropDown, csDropDownList,

Otra forma de modificar el aspecto, es mediante la modificación del color en la propiedad Color, o la Fuente en la propiedad Font.

Al igual que las cajas de texto, pueden ser de sólo lectura, propiedad ReadOnly, visibles o invisibles propiedad Visible, habilitadas o deshabilitadas, propiedad Enabled.

El texto de una caja de selección puede accederse desde la propiedad Text, el cual puede encontrarse en letras mayúsculas o minúsculas, modificando las opciones de la propiedad CharCase.

3.3.11

Barra deslizante (TScrollBar)

El componente barra deslizante permite seleccionar en un intervalo de números enteros, un número, según como se mueva el deslizador. Este tipo de componente tiene un uso más del tipo de cálculos, ya que no tiene opciones para modificar su apariencia física.

Figura 3.30: Edición de Barras Deslizantes (TScrollBar).

Para cambiar la orientación, cambie las opciones de la propiedad Kind. Este componente puede deshabilitarse desde la propiedad Enabled, esconderse desde la propiedad Visible, mostrar un mensaje, especificando cuál es su uso, mediante la propiedad Hint.

En cuanto al intervalo de números, puede obtenerse o modificarse el mínimo valor en la propiedad Min y el máximo valor en la propiedad Max.

3.3.12

Panel (TPanel)

El panel es una caja que contiene otros componentes, estos suelen ser de gran utilidad cuando se requiere cambiar rápidamente la posición de un conjunto de componentes, deshabilitarlos o esconderlos.

Figura 3.31: Edición de páneles (TPanel).

El panel posee propiedades que permiten cambiar su color, y fuente. Para agregar más componentes a los páneles, seleccione un componente y dibuje con el mouse un rectángulo sobre el panel deseado, así el componente actuará como conjunto de elementos que contiene una cantidad determinada de subcomponentes.

El panel se puede alinear en toda la zona del formulario, aplicando la opción alClient de la propiedad Align, es posible quitarles el borde, accediendo a la propiedad BorderStyle.

Ejemplo 7

. Área y perímetro de un rectángulo

Para esta

Área y perímetro de figuras planas .
Construir una aplicación para calcular el área y el perímetro del rectángulo, triángulo y círculo, de forma dinámica

aplicación, vamos a usar algunos de los componentes vistos anteriormente, para explicar más su funcionalidad.

Creamos un formulario y agregamos un ComboBox, al cual le damos las opciones [Rectángulo,Triángulo,Círculo].

Figura 3.32: Combobox

¿Cómo agregar opciones al combobox? .
Seleccionamos el combobox, en el inspector de propiedades buscamos la propiedad (ítems) y presionamos el botón de los tres puntos.

Figura 3.33: Agregando las opciones.

Ahora, agregamos un panel, dentro de él, dos barras deslizadoras, y unas etiquetas de la siguiente manera:

Figura 3.34: Agregando más Componentes.

La idea es que por medio de los deslizadores se calcule el área y el perímetro del rectángulo. El CkeckGroup de la derecha contendra dos opciones, que se agregan como en el caso del Combobox, buscando la propiedad ítems y agregando tantas opciones como se desee.

Figura 3.35: Agregando las opciones al grupo de CheckBox.

¿Cómo hacer los cálculos? .
Los cálculos se hacen cuando se muevan los deslizadores o barras deslizantes. Esto se hace en el evento OnChange tomando la posición del deslizador y evaluando que se debe calcular.

Creamos las variables base, altura, área y perímetro en la sección de variables globales del programa.

₁ var
₂ Form1: TForm1;
₃ base : Real;
₄ altura : Real;
₅ area : Real;
₆ perimetro : Real;

Ahora creamos el evento OnChange de los deslizadores, seleccionando el deslizador y en el inspector de objetos pulsando el botón de los tres (3) puntos.

₁ procedure

TForm1. SB_Base_RectChange ( Sender : TObject ) ;

₂ begin

3

₄ end

; Dentro de este procedimiento, vamos a tomar el valor de la base y de la altura, para hacer los correspondientes cálculos.

₁ procedure TForm1. SB_Base_RectChange ( Sender : TObject ) ;
₂ begin
₃ base := SB_Base_Rect . Position ;
₄ altura := SB_Altura_Rect . Position ;

5

₆

area := base*altura ;

⁷

perímetro := 2*base+2*altura ;

₈ end

;

La base y la altura son los valores que toman los deslizadores, valores que se pueden tomar mediante la propiedad (Position). Luego se hacen los cálculos respectivos.
Para determinar si se muestran o no los resultados, usamos los checkbox de la siguiente manera:

₁ procedure TForm1. SB_Base_RectChange ( Sender : TObject ) ;
₂ begin
₃ base := SB_Base_Rect . Position ;
₄ altura := SB_Altura_Rect . Position ;

5

₆

area := base*altura ;

⁷

perímetro := 2*base+2*altura ;

8

₉ { D e f i n i r s i se muestra e l área }
₁₀ i f CG_Opciones . Checked [ 0 ] then
₁₁ begin
₁₂ L_Area_Rect . Caption := ’ Área : ’ + FloatToStr ( area ) ; ₁₃ end;

14

₁₅ { D e f i n i r s i se muestra e l perímetro }
₁₆ i f CG_Opciones . Checked [ 1 ] then
₁₇ begin
₁₈ L_perímetro_Rect . Caption :=
₁₉ ’ perímetro : ’ + FloatToStr ( perímetro ) ;
₂₀ end;
₂₁ end;

Para saber si una de las opciones del grupo de checkbox está activada se usa la función Checked[index] la cual dado un índice (index) devuelve verdadero si esta activa o falso si esta desativado.

Los índices se empiezan a contar desde cero (0) e incrementan según el número de opciones.

Corremos la aplicación pulsando la tecla F9 para ver el resultado.

Figura 3.36: Ejecución de la aplicación

Para dar funcionalidad al otro deslizador, creamos su evento OnChange y escribimos lo mismo que se hizo en el evento del otro deslizador.

¿Cómo usar el combobox? .
Se utiliza para intercambiar y mostrar diferentes opciones (área y perímetro del rectángulo, área y perímetro del triángulo y área y perímetro del círculo ).

Construimos un panel por encima del que ya está y agregamos los componentes para hacer los calculos del triángulo.

Figura 3.37: Creando el Panel de Opciones del Triángulo
Seleccionamos el Combobox y creamos el evento OnChange que se activará cuando se cambie de opción.
₁ procedure TForm1. Tipo_FiguraChange ( Sender : TObject ) ;
₂ begin

3

₄ end

;

Vamos a crear una variable de tipo entero (index) para capturar el índice del combobox y saber cual es la opción que se deba cambiar.

₁ procedure TForm1. Tipo_FiguraChange ( Sender : TObject ) ;
₂ var
₃ index : Integer;
₄ begin
₅ index := Tipo_Figura . ItemIndex ;
₆ end;

Hacemos la evaluación, y si el índice vale cero (0) entonces dejamos visible el panel de las opciones del rectángulo y se Respectivamente se hace con las demás opciones. ocultan los otros páneles.

₁ procedure TForm1. Tipo_FiguraChange ( Sender :
₂ var
₃ index : Integer;
₄ begin
₅ index := Tipo_Figura . ItemIndex ;

6

₇ i f index = 0 then
₈ begin
₉ P_Rectangulo . V i s i b l e := True; ₁₀ P_Triangulo . V i s i b l e := False; ₁₁ end;

12

₁₃ i f index = 1 then
₁₄ begin
₁₅ P_Rectangulo . V i s i b l e := False;
₁₆ P_Triangulo . V i s i b l e := True;
₁₇ end;
₁₈ end;

TObject ) ;

Cuando se diseñe el otro panel, se incluye un tercer condicional evaluando si el índice es dos (2), escondiendo los demás páneles y dejando visible el de las opciones del círculo.

¿Cómo visualizar el panel que queda en la parte inferior? . En el inspector de propiedades seleccionamos el panel, damos clic derecho y seleccionamos la opción Orden Z, mover al frente o mover al fondo.

Figura 3.38: Visualizando un Panel Oculto por Otro Panel

3.4

Componentes de Additional

Los componentes adicionales se muestran en la segunda pestaña y contiene elementos para complementar los estándares ,tales como: insertar botones, imágenes, formas, cajas de colores, etc., tal como se observa en la siguiente figura:

Figura 3.39: Barra de Componentes Additional

Algunas de las propiedades, eventos y combinación de eventos de las subsecciones (3.1), (3.2) y (3.10), son aplicables a los componentes de esta sección (caption, top, left, etc).

3.4.1

Botón con imagen (TBitBtn)

El botón con imagen es como su nombre lo indica, un botón que contiene una imagen con una etiqueta.

Figura 3.40: Edición de Botones con Imagen (TBitBtn).

Para cambiar la etiqueta, se busca la propiedad Caption y se modifica el texto. Otra posibilidad es buscar la propiedad Kind, y buscar una de las opciones por defecto, (desde bkAbort, hasta bkYesAll), los cuales predefinen el ícono y el texto que aparecerá en el botón.

Si se considera necesario, se puede poner otra imagen, y otra etiqueta. La imagen puede cargarse desde la propiedad Glyph, la cual pide como parámetro una imagen de tipo BMP.

Puede también habilitar o deshabilitar el botón por medio de la propiedad Enabled, o también ocultar, desocultar por medio de la propiedad Visible.

Para determinar qué debe hacer el botón cuando se hace clic sobre él, se usa el evento Onclick.

3.4.2

Texto Estático (TStaticText)

Los textos estáticos son textos como su nombre lo indica, están fijos en el formulario y se presentan con el fin de mostrar información de manera más detallada que las etiquetas (Labels).

Figura 3.41: Edición de Textos Estáticos (TStaticText).

El texto se puede alinear al centro, izquierda o derecha por medio de la propiedad Alignment, se puede poner o quitar el borde usando la propiedad BorderStyle. Para modificar el texto, use la propiedad Font, modificando el color, el tamaño y tipo de letra. El tamaño se puede modificar desde las propiedades Height y Width.

3.4.3

Imagen (TImage)

En los componentes TImage se pueden agregar imágenes desde el disco, o se pueden gráficar desde el código Canvas. (En la página 133 se explica en detalle como funciona tal código).

Figura 3.42: Edición de imágenes (TImage)

Este componente se puede alinear, tomando todo el tamaño del formulario desde la propiedad Align. Si la imagen cargada es más pequeña que el componente, se puede centrar desde la propiedad Center. También se puede activar la propiedad Stretch para estrechar la imagen al componente. Se puede deshabilitar o habilitar desde la propiedad Enabled y esconder o visualizar desde la propiedad Visible. El tamaño se puede controlar desde las propiedades Height y Width.

Si carga imágenes del tipo PNG, puede hacer que parte de la imagen sea transparente, usando un color en la imagen cargada del tipo standard, por ejemplo el blanco o negro, esta propiedad se puede activar desde Transparent. También puede exportar la imagen desde otros programas dando la posibilidad que tenga la propiedad de transparencia.

3.4.4

Imagen con Forma (TShape)

Las imágenes con forma, son zonas para dibujar por medio del objeto Canvas, que puede presentar distintas formas, como se puede observar en la figura 3.43. En la propiedad Brush se modifica el color de fondo de las imágenes. Con las propiedades Height y Widht se modifica el tamaño de la imagen. Con las propiedades Enabled y Visible, puede habilitar, deshabilitar ocultar y desocultar la imagen. En la propiedad Shape puede elegir el tipo de forma que quiere dar a la imagen.

Figura 3.43: Edición de Imágenes con Forma(TShape).

3.4.5

Caja de Texto con Etiqueta (TLabelEdit)

Las cajas de texto con etiquetas son una combinación entre las etiquetas (TLabel) y las cajas de texto (TEdit), de tal forma que son más usadas que las anteriores puesto que se puede mostrar una información adicional acerca de lo que se debe ingresar en la caja de texto.

Figura 3.44: Edición de Cajas de Texto con Etiqueta (TLabelEdit).

Para quitar los bordes a la caja de texto use la propiedad BorderStyle. Si desea agregar un color a la caja, use la propiedad Color. Use la propiedad Enabled para habilitar o deshabilitar la caja de texto con la etiqueta. Mediante la propiedad Font, se modifica el tamaño de la letra, el color y el estilo.

Al ubicar en diferentes posiciones la etiqueta de la caja de texto, se debe usar la propiedad LabelPosition. Si se quiere restringir el máximo de caracteres a ingresar en la caja de texto, asigne un número a la propiedad MaxLength. Cuando se desea simular un editor de contraseñas, cambie la propiedad PasswordChar por un carácter enmascarador (*). Si la caja de texto sera de solo lectura active la propiedad ReadOnly a True. En la propiedad Text se captura el texto que se ha introducido en la caja de texto. Por último si quiere esconder o hacer visible la caja de texto con la etiqueta use la propiedad Visible, cambiando sus estados de verdad.

3.4.6

Botón Rápido (TSpeedButton)

Los botones rápidos son aquellos que pueden contener una imagen y una, de modo similar a los botones con imagen, con la diferencia que pueden contener solo la imagen. Pueden constituir una barra de herramientas. Para agregar una imagen con la propiedad Glyph puede cargar tal imagen, que debe estar en formato BMP.

Figura 3.45: Edición de Botones Rápidos (TSpeedButton).

3.4.7

Tabla (TStringGrid)

Las tablas son arreglos de cajas de texto, en forma de matriz, que permiten visualizar como su nombre lo indica tablas de datos. Estas contienen sólo cadenas de texto, de esta manera, es importante saber que al momento de extraer algún dato numérico, hay que realizar una conversión de tipos.

Figura 3.46: Edición de Tablas (TStringGrid)

Las tablas pueden contener diferente cantidad de datos, que dependen del número de filas y de columnas, pueden presentarse con diferentes colores, columnas y filas fijas, fuente entre otras.

Para cambiar el número de columnas, en el inspector de propiedades se cambia la propiedad ColCount al número de columnas deseadas, de igual forma, se hace para el número de filas, modificando la propiedad RowCount al número de filas deseadas.

Si se requiere más de una columna o filas fijas, se modifican las propiedades FixedCols y FixedRows al número de filas y columnas que se quieren tener fijas.

El color de fondo de modifica en la propiedad Color. El color de las filas y columnas fijas en la propiedad FixedColor. El color alterno de filas en la propiedad AlternateColor.

Si se quiere que las columnas, tomen el ancho automático de la zona de la tabla se pone True la propiedad AutoFillColumns. Si se quiere que la tabla ocupe toda la zona del formulario, se pone la propiedad Align en alClient.

3.4.8

Lista de Colores (TColorListBox)

Las listas de colores proporcionan colores que pueden ser usados para la modificación de colores de otros componentes en el programa, en tiempo de ejecución.

Figura 3.47: Edición de Listas de Colores (TColorListBox).

Para saber cual es el color que se ha seleccionado, se usa la propiedad Selected que devuelve el color seleccionado.

Los eventos descritos en las subsubseccesiones 3.10.1,3.10.2,3.10.3 y 3.10.5, son compatibles con este componente.

3.5

Componentes de Common Controls

A continuación se describen algunos de los componentes ubicados en la pestaña de componentes Common Controls.

Figura 3.48: Barra de componentes de common controls

Algunas de las propiedades, eventos y combinación de eventos de las subsecciones 3.1, 3.2 y 3.10, son aplicables a los componentes de esta sección.

3.5.1

Deslizador (TTrackBar)

Los deslizadores son barras que poseen un indicador para seleccionar números en un intervalo de números enteros dado. Tienen un uso similar a las barras deslizantes de la pestaña de componentes Standard, pero se diferencian en su apariencia y elegancia.

Figura 3.49: Edición de Deslizadores (TTrackBar).

Para alinear el deslizador al formulario, use la propiedad Align. Con la propiedad Enabled puede habilitar o deshabilitar el deslizador. En las propiedades Max y Min puede cambiar el intervalo de números enteros del deslizador. Para cambiar la orientación, use las opciones de la propiedad Orientation. Para determinar la posición en la que se encuentra el indicador del deslizador, use la propiedad Position, que devuelve un número del tipo Integer.

Si se desea iniciar el indicador en forma contraria de derecha a izquierda, puede habilitar la propiedad Reversed.

Para visualizar o esconder el deslizador, cambie los valores de la propiedad Visible.

3.5.2

Barra de progreso (TProgressBar)

Las barras de progreso, son como su nombre lo indica, barras en lad que se puede expresar de forma gráfica, el progreso que lleva algún proceso dentro del programa.

Figura 3.50: Edición de Barras de Progreso (TProgressBar).

Las propiedades más relevantes, tienen que ver con la posición en la que se encuentran modificable desde la propiedad Position, la orientación modificable desde las opciones de la propiedad Orientation, el incremento que toma en la propiedad Step, los valores máximo y mínimo del intervalo de números enteros desde las propiedades Max y Min.

En la propiedad Style se puede configurar desde sus opciones, si el progreso este en modo de lectura (pbstMarquee) o en modo de progreso (pbstNormal). El tamaño se puede controlar desde las propiedades Width y Height. Finalmente se puede habilitar o deshabilitar de la propiedad Enabled y ocultar o visualizar desde la propiedad Visible.

3.5.3

Árbol (TTreeView)

Figura 3.51: Edición de Árboles (TTreeView).

El árbol es el componente donde se organizan secciones de forma jerárquica. Cada uno de los ítems se llaman nodos, y cada nodo contiene tantos subnodos como se desee. Un ejemplo claro de este componente, es la lista de carpetas que posee disco duro, cada carpeta, puede contener tantas carpetas como sea necesario, y cada una de estas subcarpetas, tantas carpetas como se desee, formando en si un árbol de carpetas.

Es útil para interactuar con el componente TPageContrl, activando cada una de sus páginas y subpáginas.

Las propiedades más usadas en este componente son:

La propiedad ítems sirve para agregar, modificar o borrar los elementos. Para definir el espacio de indentación de los subnodos, cambiar el valor de la propiedad Indent.

En los eventos se sabe que se ha cambiado de nodo cuando se implementa el evento OnChange, o se puede determinar cuál es el elemento seleccionado con el evento Onclick o OnMouseDown.

3.5.4

Lista de Elementos (TListView)

Es una base de datos, donde la información se muestra de manera tradicional (filas y columnas).

Figura 3.52: Edición de Lista de Elementos (TListView).

Este componente permite ver la información de distintas formas, tanto en tiempo de ejecución como en tiempo de diseño, las cuales se pueden modificar en la propiedad ViewStyle, estas vistas son:

Estilo de Vista vsIcon

vsReport

vsList

vsSmallIcon Descripción
Muestra los elementos como íconos de tamaño normal.
Muestra las columnas, según las especificaciones que se hayan dado en columnas.
Muestra los elementos como una lista de columnas.
Muestra los elementos como íconos pequeños.

Mediante la propiedad CheckBoxes se pueden agregar cajas de verificación para seleccionar una fila completa de la base de datos que se tenga.

Para agregar varias columnas, haga clic derecho sobre el componente en el formulario, y seleccione la opción Editar columnas, agregando (+) tantas como desee o (-) para borrar las que ya no necesite.

Para agregar nuevos elementos a la lista, use la propiedad ítems. Cuando se agregan nuevos elementos a la lista, y se han creado varias columnas, es necesario que el primer elemento tenga un subelemento, éste subelemento otro subsubelemento, y así sucesivamente, hasta completar el número de columnas definidas.

Para ver los datos en columnas, se debe usar la opción vsReport de la propiedad ViewStyle.

Si desea que se puedan seleccionar varias filas a la vez, puede usar la propiedad MultiSelect cambiando el estado de verdad a True.

También, puede dar a la lista un estado de sólo lectura, activando la propiedad ReadOnly.

3.5.5

Página de Control (TPageControl)

La página de control es un componente que posee unas pestañas y se visualizan como páginas, como se observa en la figura 3.53, que posee tres (3) pestañas cada una referenciada con nombre distinto y contienen distintos componentes.

Figura 3.53: Edición de Páginas de Control.

En cada una de las páginas se pueden organizar y distribuir distintos componentes logrando una gran cantidad de diseños para un programa. Algunas de las propiedades más importantes de este componente son:

Activar la propiedad MultiLine para ver las pestañas en varias líneas, si se encuentra desactivada, se agregan automáticamente dos (2) botones de navegación por si el número de pestañas no son visibles en la zona de la pagina.

En la propiedad ActivePage se puede determinar cuál de las pestañas está activa, para realizar así algún proceso específico.

Otra propiedad importante, en cuanto a la visualización es la posición de las pestañas que puede cambiarse desde la propiedad TabPosition.

3.6

Componentes de Dialogs

La cuarta pestaña de la barra de componentes muestra los íconos correspondientes a los diálogos.

Figura 3.54: Barra de Componentes Dialogs.

Figura 3.55: Edición de Diálogos

Los diálogos que se mostrarán a continuación, se ejecutan o muestran, agregando en un proceso (procedure) el código.

Nombrediálogo.Execute;

Éste abrirá la ventana de diálogo y recibira las configuraciones y datos que el usuario manipule y las guardará en las variables que maneja el objeto.

3.6.1

Abrir (TOpenDialog)

Este componente no sera visible en la ventana una vez que se ejecute el programa. El componente de abrir proporciona una ventana, en la cual se pueden buscar archivos en el disco duro del computador, para posteriormente leer los datos y mostrarlos en el programa.

Figura 3.56: Edición de Dialgos (TOpenDialog).

En la propiedad Filter, se puede manejar un conjunto de extensiones para los programas que se desean buscar y abrir, por ejemplo (*.txt, *.pdf, *’docx). En la propiedad Title se agrega un texto, el cual indica el título de la ventana cuando se abre. En la propiedad InitialDir se puede agregar la ruta de una carpeta en la que se quiere que el programa habilite la búsqueda de archivos al ejecutar el diálogo.

En la propiedad FileName, se guarda el nombre del archivo que se seleccionó.

3.6.2

Guardar (TSaveDialog)

El componente de guardar proporciona una ventana, donde se pueden buscar directorios en el disco duro del computador, que posteriormente guardará los datos generados por el programa.

Figura 3.57: Edición de Diálogos (TSelectDirectoryDialog).

Los filtros de tipos de archivos funcionan de la misma forma, que en el componente anterior.

3.6.3

Selección de Directorio (TSelectDirectoryDialog)

El componente (TSelectDirectoryDialog) proporciona una ventana, donde se pueden buscar directorios en el disco duro del computador, para posteriormente guardar o abrir los datos generados o requeridos por el programa.

Figura 3.58: Edición de dialgos (TSelectDirectoryDialog)

3.6.4

Cuadro de colores (TColorDialog)

El componente de diálogo para el color, maneja una propiedad básica que es precisamente la del color (Color), Ella devuelve un número hexadecimal que representa la conversión de colores RGB.¹, y una propiedad Title para agregar un título a la ventana de colores.

Figura 3.59: Edición de Diálogos (TColorDialog).

3.6.5

Fuentes (TFontDialog)

El componente de diálogo para la fuente, posee una propiedad Title para colocar un título a la ventana de la fuente.

¹Los colores en programación se representan mediante tres (3) muestras: rojo verde y blanco.

Figura 3.60: Edición de Diálogos (TFontDialog).

La propiedad Font, contiene otras subpropiedades que se necesitan para ejecutar el programa y son:

Subpropiedad Color

Style

Name

Size Descripción
Color seleccionado en el diálogo de fuente.
Estilo de fuente seleccionado, que puede variar así:

fsBold (Negrita)
fsItalic (Cursiva)
fsUnderline (Subrayada)

Toma el nombre de la fuente (Arial, TimesNewRoman, etc), seleccionada en el diálogo de fuente.
Toma el tamaño de la fuente,
seleccionada en el diálogo de fuente.

Cuadro 3.1: Propiedades del Diálogo Fuente

3.6.6

Encontrar (TFindDialog)

Este diálogo provee de una ventana, que tiene como función encontrar palabras y frases dentro de un texto.

Figura 3.61: Edición de Diálogos (TFindDialog).

La propiedad principal es FindNext, para agregar allí el texto que se desea encontrar.

3.6.7

Reemplazar (TReplaceDialog)

Este diálogo provee una ventana que tiene como función, encontrar palabras y frases dentro de un texto, y reemplazarlas por otras.

Figura 3.62: Edición de Dialogos (TReplaceDialog)

Las propiedades principales son FindText y ReplaceText para agregar allí el texto que se desea encontrar y por el cual se desea reemplazar.

3.6.8

Abrir Imagen (TOpenPictureDialog)

El componente de abrir imagen proporciona una ventana, en la que se puede cargar la imagen buscada en el programa. La ventana permite elegir una carpeta o disco duro.

Figura 3.63: Edición de Diálogos (TOpenPictureDialog).

En la propiedad Filter, se puede manejar un conjunto de extensiones para los programas que se desean buscar y abrir, por ejemplo: *.png, *jpg, *bmp, que ya se encuentran predefinidas en este diálogo. En la propiedad Title se agrega un texto, el cual indica el título de la ventana cuando se abre. En la propiedad InitialDir se puede agregar la ruta de una carpeta en la que se quiere que el programa habilite la busqueda de directorios al ejecutar el diálogo.

En la propiedad FileName, se guarda el nombre de la imagen que se quiere cargar en el programa.

3.6.9

Guardar Imagen (TSavePictureDialog)

El componente de guardar imagen proporciona una ventana, en la cual se puede guardar una imagen generada en el programa. La ventana permite elegir la carpeta o directorio para guardar la imagen.

Figura 3.64: Edición de Diálogos (TSavePictureDialog).

El filtro y los tipos de archivos se usan de la misma forma que en el componente anterior.

3.6.10

Calendario (TCalendarDialog)

El calendario es un componente que muestra un arreglo rectángular de números, precisamente muestra un calendario.

Figura 3.65: Edición de Diálogos (TCalendarDialog)

La propiedad Date, devuelve la fecha que se ha seleccionado, y es del tipo TDateTime.

3.6.11

Calculadora (TCalculatorDialog)

La calculadora es un componente que permite hacer cuentas, y cuyos resultados pueden ser leidos para agregar esta información al programa.

Figura 3.66: Edición de Diálogos (TCalculatorDialog).

Para leer los cálculos se usa la función CalcDisplay; para leer la Memoria, se usa la función Memory y para leer valores se usa la función Value.

Algunas de las propiedades, eventos y subsecciones 3.1, 3.2 y 3.10, son aplicables a los componentes de esta sección.

3.7

Componentes de Misc

combinación de eventos de las

Figura 3.67: Barra de Componentes Misc.

3.7.1

Botón de color (TColorButton)

Los botones de color, son los que abren el diálogo de color tomando dentro de sí el color que se ha seleccionado. La propiedad principal sera tomar el color para usarlo en otros procesos, lo cual se puede obtener desde Color.

Figura 3.68: Edición de Botones de Color (TColorButton)

3.7.2

Incremento de Enteros (TSpindEdit)

Este componente muestra un número entero que está en el intervalo MinValue y MaxValue, propiedades que se pueden modificar a valores enteros cualesquiera .

Figura 3.69: Incremento de Enteros (TSpindEdit)

En la propiedad Increment se puede determinar de cuanto en cuanto se hacen los incrementos cuando se suben o bajan los botones del componente. Con la propiedad Value, se determina cual es el valor que se encuentra en la caja de texto.

3.7.3

Incremento de Reales (TFloatSpinEdit)

Figura 3.70: Incremento de Reales (TFloatSpindEdit). Este componente muestra un número real que esta en el intervalo MinValue y MaxValue, propiedades que se puede modificar a valores reales cualesquiera .

En la propiedad Increment se puede determinar de cuánto en cuánto se hacen los incrementos cuando se suben o bajan los botoncitos del componente. Con la propiedad Value, se determina cuál es el valor que se encuentra en la caja de texto.

3.7.4

Calendario (TCalendar)

El componente calendario, es de tipo visual, similar al componente de diálogo Calendario.

Figura 3.71: Calendarios (TCalendar)

La propiedad principal es Date o DateTime, donde, está contenida la fecha que esta seleccionada en el componente. Desplagará el tiempo de ejecución un calendario en la posición que el programador le dé.

3.7.5

Botón de Edición (TEditButton)

Es un una combinación entre un botón y una caja de texto, útil para realizar operaciones con el texto que se encuentra en el TEdit, por ejemplo: abrir un archivo de texto direccionado en el texto.

Figura 3.72: Botones de Edición (TEditButton).

La propiedad ButtonWidth permite cambiar el ancho del botón de edición. En la propiedad Glyph, se puede agregar una imagen de tipo BMP al botón.

Puede usarse este tipo de componentes para editar en otra ventana, el valor de la caja de texto, de tal forma que se pueda, ver distinta la aplicación.

3.7.6

Edición de Nombre de Archivo (TFileNameEdit)

Este componente resulta de la combinación de una caja de texto, un botón y el diálogo de abrir.

Figura 3.73: Nombres de Archivos (TFileNameEdit).

Cuando se oprime el botón, éste llama al diálogo abrir; cuando se selecciona un archivo la ruta queda almacenada en la caja de texto.

Para extraer la ruta de la caja de texto, se debe usar la propidad FileName. Para especificar un filtro se puede hacer desde la propiedad Filter. Para aumentar el tamaño del botón, desde la propiedad ButtonWidth. Para especificar el directorio inicial de búsqueda, modificar la propiedad InitialDir. Para activar la propiedad de solo lectura en la caja de texto, poner a True la propiedad ReadOnly.

3.7.7

Edición de Directorio (TDirectoryEdit)

Este componente resulta de la combinación de una caja de texto, un botón y el diálogo de selección de directorio.

Figura 3.74: Rutas de Directorios (TDirectoryEdit).

Cuando se oprime el botón, éste llama al diálogo de selección de directorio; cuando se selecciona un directorio, la ruta queda almacenda en la caja de texto.

Para extraer la ruta de la caja de texto se debe usar la propidad Directory. Para aumentar el tamaño del botón, desde la propiedad ButtonWidth. Para activar la propiedad de sólo lectura en la caja de texto, poner a True la propiedad ReadOnly.

3.7.8

Edición de Fecha (TDateEdit)

Figura 3.75: Edición de Fechas (TDateEdit).

Este componente es una combinación entre una caja de texto, un botón y el diálogo del componente calendario.

Cuado se da clic al botón este despliega el calendario de tal forma que se puede seleccionar una fecha, y esta queda registrada en la caja de texto. En la propiedad Date, se puede extraer la fecha de la caja de texto. En la propiedad DateOrder, se puede especificar el orden que tendra la fecha, doDMY, doMDY, doYDM y doNone. En la propiedad ButtonWidth se puede cambiar el ancho del botón de edición.

3.7.9

Árbol de Directorios (TShellTreeView)

Es un componente que permite ver un árbol a modo de TTreeView de todos los directorios que hay contenidos en el computador.

Figura 3.76: Edición de Árbol de Directorios

Con la propiedad Indent, puede aumentar o disminuir la indentación de los subdirectorios.

3.7.10

Lista de Archivos (TShellListView)

Muestra la descripción de los archivos que se encuentran en tal directorio, nombre tamaño y tipo de archivo.

Figura 3.77: Edición de Menús.

En la propiedad Root se agrega la ruta para leer los archivos. Se pueden leer todo tipo de archivos y carpetas, pero no los archivos de un subdirectorio, por medio de la activación de las opciones de la propiedad ObjectTypes. En la propiedad ShellTreeView se asigna el nombre del componente ShellTreeView, para que compartan información entre ellos. Cuando se selecciona un directorio en el componente ShellTreeView, aparecen los archivos en el componente ShellListView.

3.8

Componentes de Data Controls

Grupo de componentes utilizado para la manipulación de bases de datos.

Figura 3.78: Barra de Componentes Data Controls.

3.8.1

Navegación (TDBNavigator)

Este componente sirve para facilitar la navegación, se presenta en forma de panel, que contiene una serie de botones para navegar sobre los registros, eliminar los registros, poner en modo de edición la tabla, insertar registros y actualizar los datos.

En la propiedad DataSource se agrega el componente que servirá como enlazador, entre la tabla de base de datos y el componente de navegación.

Los botones del navegador son:

Botón nbFirst

nbPrior

nbNext

nbLast

nbInsert

nbDelete

nbEdit

nbPost

nbCancel

nbRefresh Descripción
Salta al primer registro de la tabla. Desactiva los botones First y Prior y Activa Next y Last si no estaban activados.
Retrocede al registro anterior del actual, activa Next y Last.
Avanza al registro posterior al actual, activa First y Prior.
Salta al último registro de la tabla, deshabilita Next y Last y activa First y Prior.
Inserta un nuevo registro en la posición anterior al registro actual, modifica el estado de la tabla a modo de edición.
Borra el registro actual y se posiciona en el registro siguiente.
Pone la tabla en modo de edición, con lo cual se pueden modificar los datos del registro.
Escribe en la base de datos, los cambios realizados sobre el registro activo.
Cancela la edición del registro activo y recupera los datos anteriores.
Refresca la tabla o la actualiza.

3.8.2

Texto (TDBText)

Este componente muestra información de una base de datos. En la propiedad DataSource se añade el enlazador a la tabla de datos, y en la propiedad DataField se selecciona uno de los campos de la tabla el cual se quiere seleccionar para mostrar datos.

Este componente por ser similar al TLabel, se puede aplicar las mismas propiedades y los mismos eventos del TLabel.

3.8.3

Caja de Texto (TDBEdit)

Este componente se usa para visualizar o introducir datos en una tabla. En la propiedad DataSource se añade el enlazador a la tabla de datos. En la propiedad DataField se selecciona uno de los campos de la base de datos con los cuales se trabajará para ingresar datos.

Este componente es semejante al componente TEdit, puede usar y modificar las propiedades así como eventos, al igual que se hace con el componente TEdit.

3.8.4

Tabla (TDBGrid)

Este componente es usado para visualizar la información que se encuentra en tablas de datos, permite hacer modificaciones y crear nuevos datos en las tablas.

En la propiedad DataSource, es donde se agrega el enlazador para manipular los datos del componente TDataSet.

Para crear columnas para los campos de los datos, haga doble clic sobre la rejilla y a cada columna agregue un título, accediendo a la propiedad Title en la subpropiedad Caption.

3.9

Componentes de System.

Los componentes de la pestaña System son componentes que en tiempo de ejecución no son visibles, proporcionan datos a la aplicación, que desde la programación es un poco más complejo hacerlo.

Figura 3.79: Barra de Componentes de la Pestaña System.

3.9.1

Tiempo (TTimer)

Por medio de este componente se puede controlar el tiempo dentro de la aplicación. En la propiedad Interval especifique cuántos milisegundos quieren que transcurran por cada paso de tiempo. En el evento OnTimer determine qué se debe hacer cada que pasa un intervalo de tiempo.

Figura 3.80: Edición de Tiempo.

Ejemplo 8

. Temporizador

¿Cómo hacer un temporizador? .
Un temporizador es un cronómetro que cuenta el tiempo hacia atrás, dados unas horas minutos y segundos, empieza un retroceso hasta llegar a cero.
Para el diseño de un temporizador, necesitamos toma los datos de las horas, minutos y segundos, además de mostrar segundo a segundo, cómo el tiempo disminuye.

El formulario contendrá, 3 TLabelEdit

, los cuales representarán las horas, minutos y segundos, un TButton

para inicializar el temporizador y un TLabel

para mostrar el tiempo.

El diseño sería algo como:

Figura 3.81: Diseño del Formulario para Hacer un Temporizador

El Label para mostrar el tiempo tiene una fuente de tipo números de reloj digital, la cual se puede descargar desde internet.

¿Cómo controlar el tiempo? .
Buscamos en la pestaña de componentes System y agregamos un TTimer, al cual le colocamos como nombre Temporizador.

Figura 3.82: Diseño del Formulario para Hacer un Temporizador Creamos tres (3) variables globales de tipo entero, h,m y s en referencia a horas, minutos y segundos, y, una variable contar de tipo booleana, para saber si se puede contar o no.

₁ var
₂ Form1: TForm1;
₃ h, m, s : integer;
₄ contar : boolean;

Hacemos doble clic al botón para tomar los datos de las horas minutos y segundos. Es importante restringir la entrada de las cajas textos mediante el evento OnKeyPress de una de las cajas de texto.

₁ procedure TForm1. CajaHorasKeyPress ( Sender : TObject ; var Key : char) ;
₂ begin
₃ i f not ( key in [ ’ 0 ’ . . ’ 9 ’ , ’−’ , # 8 ] ) then key := #0;
₄ end;

En el proceso del botón se recogen los datos.

₁ { Leer los valores de las cajas de t e x t o }
₂ procedure TForm1. I n i c i a r c l i c ( Sender : TObject ) ;
₃ begin
₄ h := StrToInt ( CajaHoras .Text) ;
₅ m := StrToInt ( CajaMinutos .Text) ;
₆ s := StrToInt ( CajaSegundos .Text) ;

7

₈

contar :=

True

;

₉

TemporizadorTimer ( S e l f ) ;

end

;

Se toman los datos, se da como verdadero el valor de contar y se llama al proceso TemporizadorTimer(Self), donde Self es así mismo:

₁ procedure TForm1. TemporizadorTimer ( Sender : TObject ) ;
₂ begin
₃ i f contar then
₄ begin
₅ Dec ( s ) ;

₆ i f s <= 0 then
₇ begin
₈ Dec (m) ;
₉ s := 59;
₁₀ i f m <= 0 then
₁₁ begin
₁₂ Dec ( h ) ;
₁₃ m := 59;
₁₄ i f h <= 0 then
₁₅ begin
₁₆ contar := False;
₁₇ ShowMessage ( ’ El tiempo ha terminado ’ ) ; end;
₁₈ end;
₁₉ end;

20

₂₁ Contador . Caption := IntToStr ( h)+ ’ : ’ +IntToStr (m)+
₂₂ ’ : ’ +IntToStr ( s ) ;
₂₃ end;
₂₄ end;

El proceso consiste en ir decrementando el valor de los segundos hasta que llegue a cero, en ese momento se decrementa el valor de los minutos y se siguen decrementando los segundos. Cuando los minutos lleguen a cero se decrementan las horas hasta que lleguen a cero, es así donde para el tiempo y se da el valor de falso a la variable contador, para que no siga contando.

Figura 3.83: Temporizador en ejecución

Si en algún momento quisiéramos pausar el temporizador o pararlo, no habría como hacerlo, así vamos a crear dos (2) nuevos botones, [pausar] y [parar].

Figura 3.84: Agregando el Botón Pausar y Parar

Para pausar el temporizador, hacemos doble clic sobre el botón pausar y agregamos la línea:

₁ { Pausar e l temporizador }
₂ procedure TForm1. Pausarclic ( Sender : TObject ) ;
₃ begin
₄ contar :=not contar ;
₅ end;

Cuando el valor de contar es falso entonces no se contara más, dado que en el evento TemporizadorTimer, la condición para contar es que su valor sera verdadero. Al volver a pulsar el botón pausar seguirá contando puesto que la negación de falso es verdadero, y así sucesivamente, cada vez que se pulse el botón para o continua.

Luego, en el evento “parar”, hacemos algo similar pero damos a las variables de h, m y s los valores de cero.

₁ { para e l temporizador }
₂ procedure TForm1. Pararclic ( Sender : TObject ) ;
₃ begin
₄ contar :=False;
₅ h:=0;
₆ m:=0;
₇ s :=0;
₈ Contador . Caption := ’ 00:00:00 ’ ;
₉ end;

Se pueden hacer muchos arreglos al temporizador, incluso agregar imágenes y botones.

Figura 3.85: Temporizador en Ejecución.

3.9.2

Procesos (TProcess)

El componente proceso, permite llamar a programas externos para que se ejecuten, generen datos y archivos y además puedan ser leidos desde el programa.

En la propiedad CommandLine se escriben los parámetros que quiere que el programa a llamar ejecute, tales parámetros, pueden ser la ruta donde se encuentra el archivo.

En la propiedad Options puede activar un conjunto de opciones que manejaran la ejecución al programa externo.
Opción
poNoConsole
poStderrToOutPut

poUsesPipes

poWaitOnExist Descripción
No permite ver consolas.
Redirige los errores a la salida de datos.
Envía los datos generados por el programa externo a la Memoria, para ser leidos por el programa que lo ejecuta (programa hecho en Lazarus). Espera hasta que el programa externo termine los procesos.

Ejemplo 9

. Correr programar externos

¿Cómo correr un programa externo a Lazarus? .
Se usa el componente Tprocess para llamar al programa externo ejecutándolo desde algun procedimiento (procedure)

Para este ejemplo tenemos una calculadora con sus botones, los cuales van registrando en una caja de texto las operaciones.

Como Free Pascal es un lenguaje compilado no se presta para evaluar expresiones, mientras que por ejemplo python sí.

Se tiene por ejemplo el siguiente programa en PYTHON:

from math import *
import os
Expresion = ”
if os.path.exists(’Calculo.txt’):

fcalc = open(’Calculo.txt’,’r’) for linea in fcalc:
Expresion = linea
break
fcalc.close()
Error = ”
if not (Expresion == ”):

try:

Valor = str(eval(Expresion))
except ZeroDivisionError:
Error = ’Division Por Cero’
except SyntaxError:
Error = "Error de Sintaxis"
except TypeError:
Error = "La funcion no tiene argumentos" except NameError:
Error = "Error de Sintaxis"
except ValueError:
Error = "número Imaginario"

else:

Error = ’Vacio’

fresult = open(’Ans.txt’,’w’)
fresult.write("[Calculos]"+"\n")
if not (Error == ”):

fresult.write("Error="+Error)

else:

fresult.write("Valor="+Valor)

fresult.close()

Se compila y se crea el ejecutable. Este programa de python lee un valor de una archivo de texto (Calculo.txt), lo evalua determina si tiene errores de SINTAXIS matemática y devuelve el resultado en un archivo de texto (Ans.txt).

La calculadora esta diseñada de la siguiente manera:

Figura 3.86: Diseño de la calculadora

el botón igual contiene el procedimiento Onclick sobre el cual se va a programar la ejecución del programa externo (Ejecutable de la calculadora en PYTHON).

El procedimento es el siguiente:

₁ procedure TCalculadora . t I g u a l c l i c ( Sender : TObject ) ;
₂ var
₃ ArcEntrada : TextFile ;
₄ Proceso : TProcess ;
₅ ArcSalida : T I n i F i l e ;
₆ begin
₇ AssignFile ( ArcEntrada , ’ Calculo . t x t ’ ) ;
₈ Rewrite( ArcEntrada ) ;

9

₁₀WriteLn

( ArcEntrada , EntradaCalculadora .

Text

) ;

₁₁

CloseFile ( ArcEntrada ) ;

12

₁₃ Proceso := TProcess . Create ( n i l ) ;
₁₄ Proceso .CommandLine := ’ Calculadora 1.0. exe ’ ;
₁₅ Proceso . Options := Proceso . Options + [ poNoConsole ,
₁₆ poWaitOnExit ] ;
₁₇ Proceso . Execute ;

18

₁₉

ArcSalida := T I n i F i l e . Create ( ’Ans . t x t ’ ) ;

20

₂₁ i f ArcSalida . ValueExists ( ’ Calculos ’ , ’ Error ’ ) then
₂₂ begin
₂₃ ErrorCalc .Text := ArcSalida . ReadString ( ’ Calculos ’ ,
₂₄ ’ Error ’ , ’ ’ ) ;
₂₅ end;

26

₂₇ i f ArcSalida . ValueExists ( ’ Calculos ’ , ’ Valor ’ ) then
₂₈ begin
₂₉ PantallaCalculadora . ítems .Add ( ArcSalida . ReadString (
₃₀ ’ Calculos ’ , ’ Valor ’ , ’ ’ ) ) ;
₃₁ ErrorCalc .Text := ’ ’ ;
₃₂ t a c c l i c ( tac ) ;
₃₃ end;

34

₃₅

ArcSalida . Free ;

36

₃₇ end

;

Se crean dos (2) variables, que son archivos de texto, los cuales serán usados para escribir las expresiones matemáticas y leer los resultados.

Se abre el archivo de texto (Calculo.txt) en modo de escritura (Rewrite), el cual escribe y guarda lo que contiene la caja de texto de la calculadora.

Luego se inicia el proceso de llamar a la aplicación externa, cuya línea de comandos (CommandLine) es el nombre del programa que se ejecutará. Las opciones Options que se le dan al proceso externo son poNoConsole no muestra la consola y poWaitOnExit, Lazarus espera hasta que el programa termine la ejecución externa.

Como el archivo externo gerenera un archivo de texto (Ans.txt), se lee el resultado creando la variable de texto ArcSalida, mostrando el resultado o error en la calculadora.

3.10

Combinación de Eventos en un Componente

En Lazarus Free Pascal, un componente tiene asociados varios eventos, cuando se combinan varios de ellos en un componente se pueden lograr algunas tareas que dan mejor funcionalidad al programa, tal como se muestra a continuación.

3.10.1

Mostrar ayuda de un componente

Cuando se deja el mouse encima de un componente (en tiempo de ejecución), éste puede mostrar un mensaje especificando cuál es la función de tal componente.

Para mostrar un recuadro de ayuda de algún componente, se debe usar la combinación de propiedades Hint y ShowHint del componente al cual se desea agregar el mensaje de ayuda.

En la propiedad Hint agregue el texto que quiere que salga en el mensaje, y en la propiedad ShowHint, coloque el valor a True para mostrar la ayuda.

3.10.2

Acceso a un menú flotante

En un formulario se pueden asignar varios menús flotantes, pero en la mayoría de los componentes está presente la propiedad PopupMenu, la cual permite asignarle un menú flotante a un componente en particular.

Para ello, seleccione el componente, al cual desea agregar el menú flotante y en la propiedad PopupMenu, seleccione unos de los menús flotantes que ha prediseñado.

3.10.3

Movimiento y ubicación de un componente en el formulario

Los componentes pueden moverse de su posición original de diseño en tiempo de ejecución del programa, haciendo uso de las propiedades Left y Top, y de los eventos OnMouseDown, OnMouseMove y OnMouseUp.

Por ejemplo: si deseamos mover un componente se deben crear tres (3) variables una de las cuales será de tipo Boolean y las otras dos (2) del tipo Integer. Estas variables se declaran en la sección de variables globales.

₁ var
₂ Cambio : Boolean;₃

PosX , PosY :

Integer

;

Crear los tres (3) eventos mencionados y sobre el evento OnMouseDown modificar las variables declaradas en la sección de variables.

₁ { Evento OnMouseDown}
₂ procedure tform1 .ComponenteMouseDown( sender :
₃ button : tmousebutton ; s h i f t : t s h i f t s t a t e ;
₄ x , y : integer ) ;
₅ begin
₆ Cambio := True;
₇ PosX := x ;
₈ PosY := y ;
₉ end;
tobject ;

₁ { Evento OnMouseMove}
₂ Procedure tform1 . ComponenteMouseMove ( sender :
₃ s h i f t : t s h i f t s t a t e ; x , y : integer ) ; tobject ;

₄ Begin
₅ I f Cambio then
₆ Begin
₇ Componente . L e f t := Componente . L e f t +x−PosX ;
₈ Componente . Top := Componente . Top+y−PosY ;
₉ End;
₁₀ End;

₁ { Evento OnMouseUp}
₂ Procedure tform1 .ComponenteMouseUp ( sender : tobject ;
₃ button : tmousebutton ; s h i f t : t s h i f t s t a t e ;
₄ x , y : integer ) ;
₅ Begin
₆ Cambio := False;
₇ End;

Como se puede observar en el código del procedimiento, si la variable cambio es verdadera, se puede modificar la posición del componente, modificando las propiedades Left y Top del componente.

Suponiendo que el componente se toma en la posición (P osX, P osY ), y que ahora se está moviendo junto las coordenadas del cursor del mouse, se debe tomar la ubicación donde esta, sumarle la posición del cursor pero restarle la posición de la ubicación original de donde se tomo para que no se altere el movimiento.

Figura 3.87: Relación del Movimiento del Mouse y del Componente.

Para finalizar el movimiento, en el evento OnMouseUp, se cambia el valor de la variable Cambio a Falso para que así en el procedimiento OnMouseMove no se realice ninguna acción, dado que el condicional está actuando.

3.10.4

Arrastrar y halar información de un componente a otro

Puede ser muy útil intercambiar información mediante dos (2) ó más componentes tan solo con halar y soltar. Esta tarea puede realizarse usando los eventos OnDragOver y OnDragDrop.

Se deben crear los procedimientos de los eventos mencionados, en el procedimiento OnDragOver, debe agregar la línea de código.

₁ { Evento OnDragOver }
₂ Procedure tform1 . ComponenteDragOver ( sender , source :
₃ tobject ; x , y : integer; state : tdragstate ;
₄ Var accept : boolean) ;
₅ Begin
₆ accept := source i s TComponent ;
₇ end;

Donde TComponent es el tipo de componente desde donde se envió la información, por ejemplo: TTreeView, TEdit, TLabel, TImage etc.
En el evento OnDragDrop, simplemente se hacen las modificaciones necesarias para escribir o configurar la información que se ha pasado.

Por último en el componente desde donde se quiere halar la información, bien sea con el evento OnMouseDown o OnStarDrag, se agrega la linea.

₁

Componente . BeginDrag (

True

)

3.10.5

Alinear componentes

La alineación de componentes es usada para permitir una mejor presentación en el formulario, cuando este se maximize o minimize, permitiendo que los objetos alineados se ajusten al tamaño del formulario, cuando este cambie de tamaño.

Las opciones de alineación son:

alBotton: el componente se alinea a lo ancho del formulario en la parte inferior.

alTop: el componente se alinea a lo ancho del formulario en la parte superior.

alLeft: el componente se alinea a lo alto del formulario en la parte izquierda.

alRight: el componente se alinea a lo alto del formulario en la parte derecha. alClient: el formulario toma todo el tamaño de la pantalla.

3.10.6

Restringir valores en componentes de almacenamiento de texto

Los componentes que poseen el evento OnKeyPress están disponibles, para hacer una validación del texto que se introduce sobre ellos.

Para ello, debe crearse el evento OnKeyPress del componente y agregar algunas restricciones.
Por ejemplo, se desea que al ejecutar la aplicación sólo se aceptan las letras minúsculas, entonces se hace sobre el evento OnKeyPress.

₁ { Evento OnKeyPress }
₂ Procedure tform1 . Componentekeypress ( sender : tobject ;
₃ Var key : char) ;
₄ Begin
₅ I f not ( key in [ ’ a ’ . . ’ z ’ ] ) then key := #0;
₆ end;

4

Estructuras de programación

En programación es necesario acudir a diferentes estrategias de tipo lógico para realizar las diferentes tareas, algunas de ellas sencillas y requieren poco esfuerzo para el diseño del algoritmo que lo resuelve. Tal es el caso de los problemas con solución no lineal que necesitan de estructuras complejas para atacar a problemas de esta naturaleza. En esta unidad se hace un repaso de lógica y trata los siguientes estructuras de programación.

1. Estructura condicional (Si o If).

2. Estructura repetitiva (Para o For).

3. Estructura repetitiva condicional (Mientras o While).

4. Estructura de casos.

Al analizar la función de cada una de estas estructuras, se tendrán las herramientas para desarrollar aplicaciones de cualquier tipo.

4.1

Repaso de lógica

La estructura condicional, es una estructura que evalúa una proposición y su veracidad; en caso de que sea verdadera, ejecuta una acción, y si fuera falsa,

107

ejecutará otra acción según lo que se le programa.

Esta estructurá tiene la siguiente forma:

₁ i f ( proposicion es verdadera ) then
₂ begin
₃ { Ejecuta código }
₄ end
₅ else
₆ begin
₇ { Ejecuta otra acción s i es f als o }
₈ end;

La proposición dada tiene que generar un valor de verdad, bien sea verdadero (True) o Falso (False).

4.1.1

Proposiciones lógicas

Las proposiciones lógicas, son expresiones que al ser evaluadas generan un valor de verdad, como se mencionó, verdadero o falso.

Un ejemplo de una proposición lógica puede ser:

Un divisor de 10 es 2, expresión que es verdadera. Otro ejemplo es 6 es un número primo, proposición que es falsa, porque 6 no es un número primo.

Este tipo de proposiciones no son tan fuertes si no existiesen conectores que permitan construir proposiciones más complejas.

4.1.1.1 Conector lógico (∧)

Este conector, hace verdadera una proposición, si las dos (2) proposiciones conectadas por él son verdaderas. Este tipo de definición se vera más fácil al analizar cada uno de los casos sobre una tabla, lo que se denomina tabla de verdad.

La tabla de verdad para una proposición que contiene dos expresiones conectadas con el conector lógico∧.

p q p ∧ q V V V V F F F V F F F F

Como se ha definido, la proposición, sólo es verdadera si las proposiciones p y q son verdaderas.

4.1.1.2 Conector lógico (∨)

Este conector, hacer verdadera la proposición, si algunas de las dos (2) proposiciones que lo conforman es verdadera, de lo contrario sera falsa. Como en el conector anterior, una tabla de verdad aclarara tal definición.

p q p ∨ q V V V V F V F V V F F F

En este caso, hay tres (3) ocasiones en la que la proposición es verdadera.

4.1.1.3 Negación de proposiciones (∼)

La negación de proposiciones, básicamente cambia el valor de verdad de una proposición, dado que si se dice que algo no es verdadero, es por que es falso. Veamos la tabla de verdad.
p ∼ p V F V F F V F V

4.1.1.4 Conector lógico (⇒)

En lógica, se busca la equivalencia entre proposiciones, para permitir hacer diferentes tipos de análisis a situaciones problémicas, o simplemente para realizar fácilmente una demostración.

Cuando se habla de equivalencia entre conjuntos, se encuentra el término tautología, que indica que dos (2) proposiciones son equivalentes o simplemente iguales.

La proposición p ⇒ q es equivalente a∼ p ∨ q, demostrando su equivalencia a partir de una tabla de verdad.

p q p ⇒ q ∼ p ∼ p ∨ q V V V F V V F F F F F V V V V F F V V V

Nótese que las columnas de las proposiciones p ⇒ q y∼ p ∨ q son las mismas, luego las proposiciones son equivalentes.

4.1.1.5 Conector lógico (⇔)

Al igual que se hizo en el conector lógico⇒, se desea encontrar una tautología para el conector lógico⇔.

Así la proposición p ⇔ q es equivalente a (p ⇒ q) ∧ (q ⇒ p), pero se había visto que p ⇒ q es equivalente a∼ p ∨ q, luego, p ⇔ q es equivalente a (∼ p ∨ q) ∧ (∼ q ∨ p).

4.1.2

La lógica en la programación

Es necesario repasar un poco la estructura lógica de las proposiciones, porque en programación se necesitan de ellas para realizar algoritmos óptimos.

El lenguaje Free Pascal codifica los conectores de la siguiente manera: Conector lógico (∧): and
Conector lógico (∨) : or
Negación lógica (∼) : not

Para los otros dos (2) conectores, se hace la conversión tautológica, luego (⇒) es equivalente a:

(not p) or q

y para el conector lógico (⇔) se tiene:

((not p) or q) and ((not q) or p)

Es por tal razón que se estudiaron las equivalencias de estos conectores.

4.1.3

Variables booleanas y operadores de relación

Las variables booleanas son variables que contienen sólo dos (2) valores, True o False, a las cuales se les puede asignar una proposición lógica.

Por otra parte los operadores de relación son los que indican la relación entre dos (2) o más expresiones.

Los operadores de expresión son los siguientes:
< : menor que.
<= : menor o igual que.
> : mayor que.
>=: mayor o igual que.
=: igual que.
<>: Diferente.

Ejemplo. Se tienen dos (2) variables numéricas; a = 5 y b = 6 luego se puede formar la proposición lógica.

ValorVerdad := ((a div 5) = 1) and ((b div 3) >= 2); Evaluemos la expresión en forma analítica.

Como a es igual a 5 entonces el cociente entre 5 y 5 es 1; luego, como 1 es igual a 1 entonces la primera proposición es verdadera. Luego b es igual a 6, y el cociente entre 6 y 3 es 2, así como 2 ≥ 2 la segunda posición es verdadera, y por el conector lógico and la proposición es verdadera, por lo tanto, la variable V alorV erdad contiene el valor T rue.

Nótese que este tipo de expresiones suelen darse en las matemáticas y más aún en problemas que se resuelven a partir de algoritmos.

4.2

Estructura condicional

Las estructuras condicionales, son las que me permiten evaluar un parámetro y determinar qué hacer frente a la evaluación que se tenga de este.

Por ejemplo, tenemos un programa que calcula el promedio de notas de un grupo de estudiantes, y debe determinar cuales son los estudiantes que ganan, entonces se debe evaluar, cada una de las notas por encima de un valor establecido.

También, podríamos pensar en la evaluación de un disco duro, si nuestro programa detecta que el disco duro no tiene la capacidad para almacenar un archivo, entonces, se abortará el almacenamiento de tal archivo.

Este tipo de estructura tiene variadas sintaxis, dependiendo del lenguaje de programación que se esté trabajando, en este caso, se está trabajando con Free Pascal, veamos:
₁ If (Condición es Verdadera) then ₂ begin
₃ {Ejecuta Acción}
₄ end
₅ else
₆ begin
₇ {De lo contrario ejecuta otra acción} ₈ end;

Siendo esta la estructura completa, también se puede simplemente evaluar, y en caso de no ser cierta la evaluación, continuar con los siguientes pasos.

₁ if (Condición es Verdadera) Then
₂ begin
₃ {Ejecutar acción}
₄ end;

Esta estructura es útil para la toma de desiciones dentro del programa.

Ejemplo 10

. Mayor entre dos números enteros

Problema

. Construir una aplicación para determinar cuál de dos (2) números es mayor.

En este tipo de problemas y retomando lo visto en el módulo 2, primero se debe hacer un bosquejo del modelo matemático que explica la problemática.

Sean a, b ∈ Z se tiene que a es mayor que b si se cumple que a > b y recíprocamente, se tiene que bes mayor que a si se cumple que b > a. Con esta definición, procedemos al diseño del formulario, que básicamente sera de la siguiente manera:

Figura 4.1: Diseño del Formulario para la Aplicación (Evaluar cuál de dos números es el mayor)

Para realizar la evaluación hacemos doble clic sobre el botón Evaluar, el cual genera el código del proceso automáticamente, y sobre el cual haremos:

₁ { proceso para evaluar cual es e l número mayor}
₂ procedure TForm1. Evaluarclic ( Sender : TObject ) ;
₃ var
₄ a , b : Integer;
₅ begin
₆ { 1. Tomar los valores de las cajas de t e x t o }
₇ a := StrToInt ( número1.Text) ;
₈ b := StrToInt ( número2.Text) ;

9

₁₀ { 2. Realizar la evaluación }
₁₁ i f a>b then
₁₂ begin
₁₃ Resultado . Lines .Add ( IntToStr ( a)+ ’
₁₄ end
₁₅ else
₁₆ begin
₁₇ Resultado . Lines .Add ( IntToStr ( b)+ ’
₁₈ end;
₁₉ end;

es mayor que ’ +IntToStr ( b ) ) ;

es mayor que

El resultado después de correr el programa será: ’ +IntToStr ( a ) ) ;

Figura 4.2: Ejecución de la Aplicación (Evaluar cuál de dos números es el mayor)

Problema

. Restringir qué valores se pueden escribir en una caja de texto

Si se intenta correr la aplicación anterior escribiendo letras en cambio de los números, el programa lanzara un error de conversión de tipos, puesto que un carácter no se puede convertir a un número entero mediante la función IntToStr().

Para evitar este error, pues se hace una restricción de los caracteres que se pueden escribir en las cajas de texto, mediante la estructura condicional.

Las cajas de texto, y otros componentes que admiten la escritura de o sea, caracteres, poseen un evento que se llama OnKeyPress, que quiere decir evento cuando se presiona una tecla, así se pueden delimitar aquellas letras que se pueden escribir en determinado componente de edición de textos.

El código sería algo como lo que sigue:

₁ { R e s t r i c c i ó n de caracteres }
₂ procedure TForm1. número1KeyPress ( Sender : TObject ;
₃ var Key : char) ;
₄ begin
₅ i f not ( key in [ ’ 0 ’ . . ’ 9 ’ , ’−’ , # 8 ] ) then key := #0;
₆ end;

Es un código sencillo, que utiliza la negación proposicional, y la pregunta es muy clara: Si la tecla (Key) no esta dentro de los números del 0 al 9, o no es la tecla (−) , o la tecla de borrar, entonces vuélva la la tecla vacía.

Este ejemplo será muy útil para evitar tantos errores de conversión de tipos en las aplicaciones.

Ejemplo 11

. Conversiones angulares

Conversión entre grados y radianes . Crear una aplicación, con una única caja de texto, dos radios de selección y un botón para convertir un ángulo dado ya sea de grados a radianes o de radianes a grados.

El diseño del formulario, es sencillo, ya que se están dando las condiciones dentro del mismo problema:
₇ { 1. Tomar e l valor de selección del t i p o } ₈ Seleccion := Tipo . ItemIndex ;

Figura 4.3: Diseño del Formulario de la Aplicación (Conversión angular).
Veamos cómo se implementa la estructura condicional:

₁ { Conversión angular }
₂ procedure TForm1. Convertirclic ( Sender : TObject ) ;
₃ var
₄ Seleccion : integer;
₅ Alfa , Beta : real;
₆ begin

9

₁₀ { 2. V e r i f i c a r s i se ha seleccionado algun t i p o }
₁₁ i f Seleccion >−1 then
₁₂ begin
₁₃ { 2.1. Determinar s i la conversión es de grados a radianes }
₁₄ i f Seleccion = 0 then
₁₅ begin
₁₆ Alfa := StrToFloat ( Angulo .Text) ;

17

₁₈

{ 2.1.1 Convertir e l ángulo a radianes }

₁₉

Beta := (

Alfa

* pi ) / 180;

20

₂₁ { 2.1.2 Mostrar e l resultado }
₂₂ Resultado . Lines .Add ( FloatToStr (Alfa) + ’ deg es igual a ’ + FloatToStr ( Beta ) + ’ rad ’ ) ;
₂₃ end;

24

₂₅ { 2.2. Determinar s i la conversión es de radianes a grados }
₂₆ i f Seleccion = 1 then
₂₇ begin
₂₈ Alfa := StrToFloat ( Angulo .Text) ;

29

₃₀

{ 2.2.1 Convertir e l ángulo a radiantes }

₃₁

Beta := (

Alfa

* 180) / pi ;

32

₃₃ { 2.1.2 Mostrar e l resultado }
₃₄ Resultado . Lines .Add ( FloatToStr (Alfa) + ’ rad es igual a ’
₃₅ +FloatToStr ( Beta ) + ’ deg ’ ) ;
₃₆ end;
₃₇ end;
₃₈ end;

Donde la variable Seleccion toma el valor del grupo de radiosbuttons, para determinar cual es el tipo de conversión es la que se realizará: para ello se usa un primer condicional, que verifica si se han seleccionado algunos de los dos (2), medido por un índice que tiene que se mayor que−1 el valor por defecto. Luego si el valor es cero (0) entonces se hace la conversión de grados a radianes, y de otro modo se hace la conversión de radianes a grados, si el índice toma el valor de uno.

Como los resultados se muestran en un Memo, entonces pueden hacerse muchos ejercicios, aprovechando así al máximo la aplicación.

Figura 4.4: Diseño del Formulario de la Aplicación (Conversión angular)

Ejemplo 12

. Tablas de verdad de proposiciones lógicas

Como ejercicio, vamos a desarrollar el programa para generar la tabla de verdad, del conectivo lógico∧.

Para esta aplicación, se necesita un StringGrid que servirá para ilustrar la tabla.

Figura 4.5: Diseño del Formulario de la Aplicación (Conectivo lógico ∧). Se puede observar que, en el formulario se ha dispuesto un StringGrid, con alineación alTop, de tres (3) columnas (ColCount := 3), sin columnas fijas (FixedCols := 0), de cinco filas (RowCount := 5), con el cual se desarrollará la tabla de verdad, además que el formulario contiene un botón para realizar el cálculo de la proposición lógica∧.

Luego, al programar el evento Onclick del botón Calcular, tendremos el siguiente código:

₁ { Hallar la tabla de verdad de la proposición l ó g i c a Y}
₂ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₃ var
₄ ProposicionP , ProposicionQ : array[ 1 . . 4 ] of Boolean;
₅ begin
₆ { 1. Dar los valores de verdad y
₇ falsedad a los vectores P y Q}
₈ ProposicionP [ 1 ] := True;
₉ ProposicionP [ 2 ] := True;
₁₀ ProposicionP [ 3 ] := False;
₁₁ ProposicionP [ 4 ] := False;

12

₁₃ ProposicionQ [ 1 ] := True;
₁₄ ProposicionQ [ 2 ] := False;
₁₅ ProposicionQ [ 3 ] := True;
₁₆ ProposicionQ [ 4 ] := False;

17

₁₈ { 2. Mostrar los resultados en la tabla }
₁₉ ConectivoY . Cells [ 0 , 0 ] := ’ p ’ ;
₂₀ ConectivoY . Cells [ 1 , 0 ] := ’ q ’ ;
₂₁ ConectivoY . Cells [ 2 , 0 ] := ’ pyq ’ ;

22

₂₃ { 2.1 Hacer la condición para cada valor de
₂₄ verdad de la proposición P}
₂₅ i f ProposicionP [ 1 ] then ConectivoY . Cells [ 0 , 1 ] := ’V ’ ;
₂₆ else ConectivoY . Cells [ 0 , 1 ] := ’F ’ ;

27

₂₈ { 2.2 Hacer la condición para cada valor de verdad }
₂₉ i f ProposicionP [ 2 ] then ConectivoY . Cells [ 0 , 2 ] := ’V ’ ;
₃₀ else ConectivoY . Cells [ 0 , 2 ] := ’F ’ ;

31

₃₂ { 2.3 Hacer la condición para cada valor de verdad }
₃₃ i f ProposicionP [ 3 ] then ConectivoY . Cells [ 0 , 3 ] := ’V ’ ;
₃₄ else ConectivoY . Cells [ 0 , 3 ] := ’F ’ ;

35

₃₆ { 2.4 Hacer la condición para cada valor de verdad }
₃₇ i f ProposicionP [ 4 ] then ConectivoY . Cells [ 0 , 4 ] := ’V ’ ;
₃₈ else ConectivoY . Cells [ 0 , 4 ] := ’F ’ ;

39

₄₀ { 3.1 Hacer la condición para cada valor de
₄₁ verdad de la proposición Q}
₄₂ i f ProposicionQ [ 1 ] then ConectivoY . Cells [ 1 , 1 ] := ’V ’ ;
₄₃ else ConectivoY . Cells [ 1 , 1 ] := ’F ’ ;

44

₄₅ { 3.2 Hacer la condición para cada valor de verdad }
₄₆ i f ProposicionQ [ 2 ] then ConectivoY . Cells [ 1 , 2 ] := ’V ’ ;
₄₇ else ConectivoY . Cells [ 1 , 2 ] := ’F ’ ;

48

₄₉ { 3.3 Hacer la condición para cada valor de verdad }
₅₀ i f ProposicionQ [ 3 ] then ConectivoY . Cells [ 1 , 3 ] := ’V ’ ;
₅₁ else ConectivoY . Cells [ 1 , 3 ] := ’F ’ ;

52

₅₃ { 3.4 Hacer la condición para cada valor de verdad }
₅₄ i f ProposicionQ [ 4 ] then ConectivoY . Cells [ 1 , 4 ] := ’V ’ ;
₅₅ else ConectivoY . Cells [ 1 , 4 ] := ’F ’ ;

56

₅₇ { 4.1 Hacer la condición para cada valor de
₅₈ verdad de la proposición Q}
₅₉ i f ProposicionP [ 1 ] and ProposicionQ [ 1 ] then
₆₀ ConectivoY . Cells [ 2 , 1 ] := ’V ’ ;
₆₁ else ConectivoY . Cells [ 2 , 1 ] := ’F ’ ;

62

₆₃ { 4.2 Hacer la condición para cada valor de verdad }
₆₄ i f ProposicionP [ 2 ] and ProposicionQ [ 2 ] then
₆₅ ConectivoY . Cells [ 2 , 2 ] := ’V ’ ;
₆₆ else ConectivoY . Cells [ 2 , 2 ] := ’F ’ ;

67

₆₈ { 4.3 Hacer la condición para cada valor de verdad } ₆₉ i f ProposicionP [ 3 ] and ProposicionQ [ 3 ] then

₇₀

ConectivoY . Cells [ 2 , 3 ] := ’V ’ ;

₇₁else

ConectivoY . Cells [ 2 , 3 ] := ’F ’ ;

72

₇₃ { 4.4 Hacer la condición para cada valor de verdad }
₇₄ i f ProposicionP [ 4 ] and ProposicionQ [ 4 ] then
₇₅ ConectivoY . Cells [ 2 , 4 ] := ’V ’ ;
₇₆ else ConectivoY . Cells [ 2 , 4 ] := ’F ’ ;
₇₇ end;

El resultado de este programa sería el siguiente:

Figura 4.6: Ejecución de la Aplicación (Conectivo lógico∧).

Como se puede observar, es un código bastante largo para un resultado tan pequeño, pero que se da así por la deficiencia o por el no conocimiento de otras estructuras que permitan minimizar al máximo tal código.

4.3

Estructuras Repetitivas for

Estas estructuras se repiten en un intervalo de números enteros, incluyendo las cotas (números que toman las variables de control).

Hay una variable de control, que va contando unidad a unidad, los ciclos que va dando la estructura.

Entre los casos más frecuentes en los que se usa este tipo de estructura es cuando se requiere llenar por ejemplo un vector o mostrar las notas de 100 estudiantes, que están almacenadas en un arreglo de números reales. Para dar más claridad a este código, vamos a realizar un programa, que dada una función cuadrativa, genera una tabla de valores en el intervalo que seleccionemos. Para ello, aprovechamos parte del diseño del programa de la ecuación cuadrática, para tomar los valores de los coeficientes.

Diseño del Formulario

Figura 4.7: Diseño del Formulario para hallar una Tabla de Valores de una Función cuadratica.

₁ procedure TForm1.Calcularclic(Sender: TObject);
₂ var
₃ a,b,c : Real;
₄ i,j,x : Integer;
₅ y : Real;
₆ begin
₇ {Capturar los valores de a,b,c}
₈ a := StrToFloat(ValorA.Text);
₉ b := StrToFloat(ValorB.Text);
₁₀ c := StrToFloat(ValorC.Text);

11

₁₂ {capturar los valores de los extremos del
₁₃ intervalo}
₁₄ i := StrToInt(DesdeA.Text);
₁₅ j := StrToInt(HastaB.Text);

16

₁₇ {Realizar el calculo de la tabla y mostrarlo
₁₈ en el Memo}
₁₉ {Limpiar Memo}
₂₀ Resultados.Lines.Clear;

21

₂₂ for x:=i to j do
₂₃ begin
₂₄ y := a*x*x+b*x+c;
₂₅ Resultados.Lines.Add(’x = ’+IntToStr(x)+
₂₆ ’ y = ’+FloatToStr(y));
₂₇ end;
₂₈ end;

¿Cómo funciona el algoritmo?

Aprovechando también parte del código del programa de ecuaciones de segundo grado, se capturan los valores de los coeficientes a, b y c de la ecuación y los extremos del intervalo, donde se quiere hallar la tabla.

Limpiar el Memo, es clave, para realizar varios ejercicios.

₁ for x:=i to j do
₂ begin
₃ {Código a ejecutar}
₄ end;

x toma el valor más pequeño del intervalo, y se le indica que debe ir hasta el valor de j, tomando incrementos de uno en uno.

Como x es la variable que toma los valores cada que se incrementa dentro del ciclo, entonces se calcula el valor de la ecuación para cada valor de x y se agrega al Memo.

Figura 4.8: Ejecución del Programa para Hallar una Tabla de Valores de una Función Cuadrática.

4.4

Estructuras Repetitivas Condicionales

Este tipo de estructuras hacen parte de una combinación de las estructuras condicionales y de los ciclos repetitivos en un intervalo, con la ventaja de que se puede evaluar cuando los valores que se incrementan, o las condiciones ya han superado el objetivo propuesto.

Por ejemplo, si reestructuramos el código anterior por medio de esta estructura repetitiva condicional, tendríamos lo siguiente:

₁ procedure TForm1.Calcularclic(Sender: TObject);
₂ var
₃ a,b,c : Real;
₄ i,j,x : Integer;
₅ y : Real;
₆ begin
₇ {Capturar los valores de a,b,c}
₈ a := StrToFloat(ValorA.Text);
₉ b := StrToFloat(ValorB.Text);

₁₀

c := StrToFloat(ValorC.

Text

);

11

₁₂ {capturar los valores de los extremos del
₁₃ intervalo}
₁₄ i := StrToInt(DesdeA.Text);
₁₅ j := StrToInt(HastaB.Text);

16

₁₇ {Realizar el cálculo de la tabla y mostrarlo
₁₈ en el Memo}
₁₉ {Limpiar Memo}
₂₀ Resultados.Lines.Clear;

21

₂₂

x:=i;

23

₂₄ while x<j do
₂₅ begin
₂₆ y := a*x*x+b*x+c;
₂₇ Resultados.Lines.Add(’x = ’+IntToStr(x)+
₂₈ ’ y = ’+FloatToStr(y));
₂₉ x := x+1;
₃₀ end;
₃₁ end;

¿Cuál es la diferencia? .
Inicialmente damos a x el valor de i que es el extremo inferior del intervalo para construir la tabla, luego entramos evaluando que se repita el código dentro del begin y el end, mientras que x < j, dado que dentro de esta estructura debemos aumentar el valor de x unidad por unidad

Es decir, sólo habría que hacer estos dos (2) cambios y el código funciona perfectamente.

¿Tiene más ventajas esta estructura? .
Es evidente, que para realizar el algoritmo anterior, no complicaremos el algoritmo usando la estructura while do, simplemente lo hacemos con for do.
Pero, hay problemas donde se hace necesario la estructura while do
Cuando se quiere crear una lista de números del 1 al 10, pero con la condición de que sean aleatorios y que ninguno se repita. Es aquí, donde se debe usar esta estructura.

Nota: en ocasiones, resulta muy conveniente combinar varias estructuras, para lograr códigos increíbles.

Ejemplo 13

. Primeros n números primos Crear un programa que me genere los primeros n números primos.

₁ {Procedimiento para hallar los n primeros
₂ números primos}
₃ procedure TForm1.Generarclic(Sender: TObject);
₄ var
₅ n : Integer;
₆ i,j,cont : Integer;
₇ contPrimos : Integer;
₈ begin
₉ n := StrToInt(números.Text);

10

₁₁ cont := 0;
₁₂ contPrimos := 0;
₁₃ j:=2;
₁₄ while contPrimos<=n-1 do
₁₅ begin
₁₆ {determinar si el número es primo}

17

₁₈ for i:=1 to j do
₁₉ begin
₂₀ if (j div i)*i = j then cont += 1;
₂₁ { (j/i)-int(j/i) = 0}
₂₂ end;

23
₂₄ if cont = 2 then

₂₅ begin
₂₆ númerosPrimos.Lines.Add(IntToStr(j));
₂₇ contPrimos += 1;
₂₈ end;

29

₃₀ cont := 0;
₃₁ j +=1;
₃₂ end;
₃₃ end;

4.5

Selección de Casos

La selección de casos, es de uso común aun en el diario vivir, por ejemplo: los estudiantes cada noche preparan sus útiles para ir al colegio al día siguiente, inmediatamente se hace la siguiente evaluación: Mañana es jueves, así que tengo que llevar utensilios...

Ejemplo 14

. Días de la semana

Supongamos ahora, que queremos hacer un programa que dado un número, determine a qué día de la semana corresponde, y si se sale del rango de números del 1 al 7, entonces genere un mensaje de error.

Diseñemos del Formulario

Figura 4.9: Diseño de Formulario para Seleccionar un día de la Semana.

Como se puede observar, para hacer nuestro cálculo, presionamos el botón ver, el cual tiene el siguiente código.

₁ procedure TForm1.Verclic(Sender: TObject);
₂ var
₃ Dia : Integer;
₄ SDia : String;
₅ begin
₆ {Capturamos el día}
₇ Dia := StrToInt(DiasSemana.Text);

8

₉ {Determinar en qué caso esta}
₁₀ Case Dia of
₁₁ 1 : SDia := ’Lunes’;
₁₂ 2 : SDia := ’Martes’;
₁₃ 3 : SDia := ’Miércoles’;
₁₄ 4 : SDia := ’Jueves’;
₁₅ 5 : SDia := ’Viernes’;
₁₆ 6 : SDia := ’Sábado’;
₁₇ 7 : SDia := ’Domingo’;
₁₈ else SDia := ’Indefinido’;
₁₉ end;

20

₂₁

ShowMessage(’El día que usted ingresó es ’+SDia);

₂₂ end

;

Ejecutando nuestro programa tenemos:

Figura 4.10: Ejecución de Programa para Determinar Día de la Semana.

Como el ocho no está definido dentro de los días de la semana, se llega a evaluar el código else (De lo contrario).

Figura 4.11: Ejecución de Programa para Determinar Día de la Semana.

¿Cómo funciona esta estructura? .
Si observamos el codigo se tiene en la lista de números, que dado uno de ellos se ejecuta el codigo que sigue despues de los dos puntos, y termina en el (end). Siguiendo con el resto del programaa, en este caso muestra el resultado en una ventana flotanta

Nota: si usted no desea mostrar los resultados en Memos como se hizo anteriormente, también lo puede hacer con el procedimiento (ShowMessage(Texto : String)), que pide como parámetro un texto, y despliega el mensaje flotante.

Ejercicio . Desarrollar matemáticamente, los siguientes problemas e implementarlos en una aplicación en Lazarus Project.
1. Dados tres (3) números ordenarlos de mayor a menor.

2. Hacer una aplicación de tipo dinámico para convertir unidades de grados a radianes y vicerversa.

Observe la siguiente imagen, por medio de la cual se puede guiar.

A medida que se cambia los deslizadores, los valores van cambiando y al mismo tiempo mostrando la conversión de grados.

Nota: utilice el valor máximo de 628 para el deslizador de radianes y en el momento de la conversión lo divide por 100.

3. Desarrollar una aplicación que dado un número, determine si es negativo, positivo o cero.

4. Desarrollar una aplicación que dadas las longitudes de los lados de un triángulo (s₁, s₂, s₃), determine qué tipo de triángulo forma, según los siguientes casos:

5. Denotemos A por el mayor de s

₁

, s

₂

, s

₃

, y por B y C los otros dos (2), entonces,

Si A ≥ B + C, no se forma ningún triángulo.
Si A² = B² + C², se forma un triángulo rectángulo.
Si A² > B² + C², se forma un triángulo obtuso.
Si A² < B² + C², se forma un triángulo agudo.
Si A = B = C, se forma un triángulo equilátero.
6. Sean A, B números enteros, determinar si B es divisor de A.

7. Hacer la tabla de verdad para el conectivo lógico∨.

8. Hacer la tabla de verdad para el conectivo lógico⇒, usando la tautología ∼ p ∨ q.

9. Hacer la tabla de verdad para el conectivo lógico⇔, usando la tautología (∼ p ∨ q) ∧ (∼ q ∨ p).

5

Programación gráfica

La programación gráfica es de gran utilidad cuando se requiere hacer aplicaciones para representación gráfica de funciones, áreas, ventanas, letreros, etc.

En Lazarus, la programación depende de una clase que se llama Canvas, en la cuál se tienen algunas herramientas, tales como: el dibujo de líneas, y figuras básicas, el estilo de relleno, el estilo de las líneas, texto, etc.

5.1

Elementos básicos

La clase Canvas donde vamos a dibujar, posee unas herramientas que permitirán hacer gráficos, a partir de programación.

Canvas quiere decir el papel donde se dibujará, por medio de órdenes o parámetros. Cuando se quiere dibujar una línea sobre el lienzo de dibujo, se le da una orden al programa para que haga tal línea especificando las coordenadas donde se dibujará.

En otros términos, el canvas es equivalente a un plano cartesiano, en la cual se dibujan figuras por medio de códigos.

Para acceder a las herramientas del Canvas debemos fijar la siguiente ruta:

133

NombreImagen.Canvas._____

En nuestro ejemplo:

Fondo.Canvas._____

La línea después del punto son las herramientas, están se describen a continuación.

5.1.1

El lápiz

El lápiz es la herramienta por medio de la cual podremos dibujar líneas de todo tipo, según el movimiento que le demos al mouse.

El lápiz tiene algunos valores que se pueden configurar:

Grueso de línea

Imagen.Canvas.Pen.Width := ValorNumerico;

Color

Imagen.Canvas.Pen.Color := NombreColor

Dentro de los cuales tenemos los siguientes:
clBlack,
clSilver, clMoneyGreen, clMaroon, clRed, clSkyBlue, clGreen, clLime, clCream, clOlive, clYellow,clMedGray,clNavy, clPurple,clTeal clGray, clBlue, clFuchsia, clAqua,clWhite, clScrollBar, clBackground, clActiveCaption, clInactiveCaption, clMenu, clMenuHighlight, clMenuText, clWindow, clWindowFrame, clWindowText, clCaptionText, clActiveBorder, clHighlight, clHighlightText, clBtnFace, clInactiveCaptionText, clBtnHighlight, cl3DDkShadow, clInfoBk, clHotLight, clForm.
clInactiveBorder, clAppWorkspace

clBtnShadow, clGrayText, clBtnText, cl3DLight, clInfoText,

Modo de dibujado

Imagen.Canvas.Pen.Mode := TipoModo;

Dentro de los modos tenemos los siguientes.

El modo se refiere a la combinación de colores que hace la línea del lápiz con los pixeles, que hay dibujados en la pantalla.

La propiedad mode, tiene combinaciones.

Modo
pmBlack
pmWhite
pmNop
pmNot
pmCopyPen
pmNotCopy
pmMergePenNot

pmMaskPenNot

pmMergeNotPen

pmMaskNotPen

pmMerge

pmNotMerge

pmMask

pmNotMask

pmXor

pmNotXor varias opciones para realizar este tipo de

Color del Pixel
Siempre negro.
Siempre blanco.
No cambia.
Inverso del color de la pantalla.
Color especificado en la propiedad Color. Inverso del color pen.
Combinación de color del pen con el inverso del color de la pantalla.
Combinación del los colores comunes entre el pen y los inversos de la pantalla. Combinación del color de la pantalla y el inverso del color del pen.
Combinación de los colores comunes entre la pantalla y el inverso del pen.
Combinación del color del pen y el color de la pantalla.
Inverso del pmMerge hecho a la
combinación del color del pen y el color de la pantalla.
Combinación de los colores comunes entre el pen y la pantalla.
Inverso de pmMask, hecho a la
combianción entre los colores comunes entre el pen y la pantalla.
Combinación entre los colores del pen o de la pantalla pero no de ambos.
Inverso del pmXor

Estilo

Imagen.Canvas.Pen.Style := TipoEstilo;

La propiedad Style proporciona diferentes formas de gráficar líneas. Observe la siguiente tabla:

Estilo
psSolid
psDash
psDot
psDashDot

psClear
psDashDotDot Descripción
El lápiz dibuja una linea sólida.
El lápiz dibuja una línea por segmentos. El lápiz dibuja una linea por puntos. El lápiz dibuja una linea combinando segmentos y puntos.
El lápiz dibuja una línea del color del fondo. El lápiz dibuja una línea combinando segmento, punto, punto.

Cuadro 5.1: Lista de estilos para la propiedad PEN

5.1.2

El relleno

El relleno se utiliza para rellenar las figuras cerradas de color según algunos estilos y formas.

Color

Imagen.Canvas.Brush.Color := NombreColor;

Los colores son los mismos que se utilizan para el lápiz.

Estilos de relleno

Imagen.Canvas.Brush.Style := TipoEstilo;

El estilo de relleno tiene varias opciones las cuales se muestran en la siguiente tabla:

Estilo Representación

bsSolid

bsClear

bsHorizontal

bsVertical

bsDiagonal

bsFDiagonal

bsCross

bsDiagCross

5.1.3

Texto

En el Canvas se pueden gráficar textos por medio de las siguientes funciones o procedimientos.

₁

Canvas . TextOut (X, Y :

Integer

;

Const Text

: String ) ;

Este procedimiento coloca un texto en la coordenada (x, y) cuyo texto esta contenido en la variable Const.

Para hallar el alto y ancho de un texto para poder usarlo en el Canvas, se usan las funciones TextHeight y TextWidth, que sólo necesitan como parámetro el texto al cual se le quieren hallar tales propiedades.

Para mostrar un texto dentro de un rectángulo, se usa el procedimiento TextRect, el cual pide como parámetro una variable tipo de rectángulo, una posición (x, y) y el texto a mostrar.

Color

Imagen.Canvas.Brush.Font.Color := NombreColor;

Estilo

Imagen.Canvas.Brush.Font.Style := (Estilos separados por comas);

Dentro de los estilos están:

fsBold, fsItalic, fsStrikeOut, fsUnderline

Tamaño

Imagen.Canvas.Brush.Font.Size := ValorNumerico;

5.1.4

Formas básicas de dibujo

Se usan los siguientes procesos y funciones para dibujar formas básicas.

Líneas.

Imagen.Canvas.Line(x1,y1,x2,y2);

donde x1, y1, x2, y2 son las coordenadas de dos puntos sobre el lienzo de dibujo.

Rectángulos.

Imagen.Canvas.Rectangle(x1,y1,x2,y2);

donde x1, y1, x2, y2 son las coordenadas de las esquinas superior izquierda e inferior derecha del rectángulo.

Cuadrados.

Para dibujar cuadrados, se calcula que la distancia entre x1 y x2 sea la misma que entre y1 y y2.

Elipses.

Imagen.Canvas.Ellipse(x1,y1,x2,y2);

donde x1, y1, x2, y2 son las coordenadas de las esquinas superior izquierda e inferior derecha del rectángulo que contiene a la elipse.

Círculos.

Para dibujar círculos se calcula que la distancia entre x1 y x2 sea la misma que entre y1 y y2.

Rectángulos con esquinas redondeadas.

Imagen.Canvas.RoundRect(x1,y1,x2,y2,RX,RY);

donde x1, y1, x2, y2 son las coordenadas de las esquinas superior izquierda e inferior derecha del rectángulo, y RX y RY es el valor del radio del círculo que cortara las esquinas del rectángulo.

Texto.

Imagen.Canvas.TextOut(x,y,’Texto’);

donde x,y es la coordenada de la esquina superior derecha desde donde se dibujara el texto.

5.2

Mini paint

Para observar el gran número de herramientas que presenta esta clase Canvas, vamos a desarollar un Mini Paint, donde se podrán dibujar algunas figuras.

5.2.1

Diseño del formulario

Creamos una nueva aplicación en Lazarus, y modificamos las dimensiones del formulario. 640 pixeles de ancho (Width) y 480 pixeles de alto (Height), y cambiamos el nombre por defecto (Form1) por FMiniPaint. Agregamos un TImage

al cual le colocamos como nombre Fondo y cambiamos la propiedad Align en la opción alClient.

Figura 5.1: Diseño del Formulario MiniPaint (Agregando el Lienzo de Dibujo)

Agregamos también un TPanel

, lo denominamos (Name) Herramientas, un alto de 60 pixeles (Height).

Figura 5.2: Diseño del Formulario MiniPaint (Agregando la Barra de Herramientas)

Al panel agregamos un TImage

, al cual llamaremos FondoHerramientas

(Name) y le damos una alineación Align alClient.
Debemos tener dibujado un panel de herramientas, que contenga los siguientes botones:

1. Dibujar línea.

2. Dibujar rectángulo.

3. Dibujar cuadrado.

4. Dibujar elipse.

5. Dibujar circunferencia.

6. Dibujar rectángulo redondeado.

7. Dibujar texto.

8. Color de contorno.

9. Color de relleno

10. Borrador

11. Nuevo

12. Guardar

Doce (12) botones en total debe contener el panel de herramientas. Una idea puede ser la siguiente:

Figura 5.3: Panel de Herramientas

Esta imagen debe ser cargada en la propiedad Picture del TImage (FondoHerramientas), se construyen luego los botones correspondientes a cada uno por medio de TImage. Esta imagen es diseñada en un editor gráfico como Corel Draw, Ink Scape o en Paint.

Figura 5.4: Diseño del Formulario MiniPaint (Agregando la Imagen a la Barra de Herramientas)

Sobre el TImage FondoHerramientas, agregamos doce TImage sobre cada uno de los botones que se ven en el fondo.

Figura 5.5: Diseño del Formulario MiniPaint

Seleccionamos todas las imágenes, buscamos la propiedad Center y ponemos la opción True, esto permitirá que al cargar una imagen quede centrada, esto con el fin de colocar una animación, cuando el mouse pase por encima de cada imagen y se pueda ver sobre la cual se hará clic. La animación se hace mediante una imagen transparente que se visualiza y oculta cuando el mouse entre o salga de la imagen.

5.2.2

Animación de los botones

Para animar los botones, seleccionamos el primero de ellos y en el inspector de objetos en la pestaña de eventos, buscamos el evento OnMouseEnter y OnMouseLeave, hacemos clic sobre el botón con los tres (3) puntos, el cual generará los siguientes códigos de procedimiento sobre la ventana de código fuente.

₁ {Cuando e l mouse entra a cada imagen }
₂ procedure TFMiniPaint . b1MouseEnter ( Sender :
₃ begin

4

₅ end

;

6

₇ {Cuando e l mouse sale de la imagen }
₈ procedure TFMiniPaint . b1MouseLeave ( Sender :
₉ begin

10

₁₁ end

; A los cuales agregaremos las siguientes líneas:

En el MouseEnter: TObject ) ;

TObject ) ;

{Llamar al cuadrado redondeado transparente}

TImage(Sender).Picture.LoadFromFile(’Imagenes\AnimaBoton.png’);

En el MouseLeave:

{Borrar la imagen cargada} TImage(Sender).Picture.Clear;

Tenga en cuenta que en este caso la imagen transparente esta guardada en una carpeta llamada Imagenes dentro del directorio donde quedara el ejecutable de la aplicación.

Hasta ahora sólo hemos configurado un botón, y ¿El resto de los botones?. Para que todos los botones queden con la animación, seleccionamos el resto de ellos desde el inspector de objetos, seleccionamos la pestaña de eventos y buscamos el evento OnMouseEnter. A cambio de dar clic al botón de los tres puntos seleccionamos la flecha que aparece y seleccionamos b1MouseEnter, de igual forma se hace con el otro evento.

Figura 5.6: Selección de Animación para todos los Botones

Para continuar con el desarrollo de la idea, necesitamos comprender el movimiento del mouse y la combinación de teclas que se pueden dar para hacer los dibujos.

5.2.3

Movimiento del mouse

Casi todos las ventanas en las diferentes aplicaciones, tienen en la parte inferior una barra llamada barra de estado. En los graficadores como paint y otros, esta barra muestra las coordenadas del mouse, entendiendo que el lienzo de dibujo es como un plano cartesiano, donde cada punto tiene una coordenada vertical y una horizontal.

Para agregar una barra de estado a nuestra aplicación buscamos en la pestaña de componentes Common Controls y seleccionamos el componente TStatusBar

y le colocamos el nombre BarradeProgreso; Esta barra se acomoda inmediatamente a la parte inferior de la aplicación.

Figura 5.7: Diseño del Formulario MiniPaint.

Hacemos clic derecho sobre esta barra y seleccionamos la opción Editor de páneles, así saldrá la siguiente ventana:

Figura 5.8: Editor de Páneles

Pulsamos dos (2) veces sobre el botón Añadir y cerramos el Editor de páneles.

Al observar el inspector de objetos se tendrá:

Figura 5.9: Editor de Páneles.

El componente de barra de estado con un subcomponente que es Panels, y este tiene un cero (0) y un uno (1).

Seleccionamos el que tiene cero y cambiamos las siguientes propiedades:

Alignment := taCenter; Text := x,y;

Width := 100; Al fijarnos en el formulario, habrá cambiado.

Figura 5.10: Diseño del formulario MiniPaint

Para ver las coordenadas del Mouse, seleccionamos el TImage donde se dibujaran las formas, al que llamamos Fondo, buscamos el evento OnMouseMove y hacemos clic sobre el botón de los tres (3) puntos, generando así el código.

₁ procedure TFMiniPaint . FondoMouseMove ( Sender : TObject ;
₂ Shift : TShiftState ; X, Y : Integer ) ;
₃ begin

4
₅ end;

Los parámetros de este proceso, son una variable de cambio Shift, que guarda la combinación de teclas:

ssShift : tecla Shift.

ssAlt : tecla Alt.

ssCtrl : tecla Ctrl.

ssLeft : botón izquierdo del mouse.

ssRight : botón derecho del mouse.

ssMiddle : botón medio del mouse.

ssDouble : doble clic.

Las variables de tipo entero x, y guardan la posición del mouse.

Para mostrarlas en la barra de estado, copiamos las siguiente líneas dentro del proceso anterior (OnMouseMove).

BarradeEstado.Panels[0].Text := IntToStr(x)+’,’+IntToStr(y);

Lo que quiere decir que a la barra de estado, en el panel cero (0), agregamos el texto (Text), convirtiendo las variables enteras a texto, mediante la función IntToStr().

En la siguiente figura se observa cuál es la posición del mouse.

Figura 5.11: Ejecución del MiniPaint.

5.2.4

Creando un nuevo lienzo de dibujo en el MiniPaint

Ya se vio que el lienzo de dibujo tiene algunas herramientas; para crear un nuevo lienzo de dibujo, tal como se hace por ejemplo en el Paint de Windows, se crea un rectángulo del tamaño de la imagen de color blanco.

Para ello se ha creado el botón de nuevo, al cual damos doble clic, éste genera el procedimiento Onclick sobre el cual agregamos el siguiente código.

₁ { Crear un nuevo l i e n z o }
₂ procedure TFMiniPaint . b11clic ( Sender : TObject ) ;
₃ begin
₄ Fondo . Canvas . Pen . Color := clWhite ;
₅ Fondo . Canvas . Brush . Color := clWhite ;
₆ Fondo . Canvas . Rectangle (0 ,0 ,Fondo . Width , Fondo . Height ) ;
₇ end;

Asignamos el color blanco al lápiz, el color blanco al relleno de color y dibujamos un rectángulo desde la esquina superior izquierda de la imagen Fondo hasta la esquina inferior derecha, usando el ancho (Widht) y el alto (Height) de la imagen.

Figura 5.12: Ejecución del MiniPaint.

5.2.5

Dibujando sobre el lienzo

Para dibujar se debe tener en consideración que el mouse tome un punto de salida y un punto de llegada y que la herramienta de rectas este seleccionada.

Para hacer que el mouse tome un punto de salida y un punto de llegada seleccionamos el TImage Fondo y buscamos los eventos OnMouseDown y OnMouseUp, hacemos clic en los correspondientes botones que tienen los tres (3) puntos, para crear los procesos sobre la ventana del código fuente.

₁ { Primer c l i c presionado del mouse}
₂ procedure TFMiniPaint .FondoMouseDown( Sender : TObject ;
₃ Button : TMouseButton ; Shift : TShiftState ;
₄ X, Y : Integer ) ; begin

5

₆ end

;

7

₈ { Levantando e l botón presionado del mouse} ₉ procedure TFMiniPaint .FondoMouseUp ( Sender : TObject ; ₁₀ Button : TMouseButton ; Shift : TShiftState ; ₁₁ X, Y : Integer ) ;
₁₂ begin

13

₁₄ end

;

Se deben crear algunas variables para tomar los datos del mouse.

Cuando presionamos clic sobre el lienzo de dibujo, tomamos el punto de salida.

El orden para tomar los datos sera así:

1. Cuando se presiona el botón del mouse se activa el proceso OnMouseDown, allí se toma la coordenada del mouse x, y en las variables xi, yi definidas globalmente.

₁ { Primer c l i c presionado del mouse}
₂ procedure TFMiniPaint .FondoMouseDown( Sender : TObject ;
₃ Button : TMouseButton ; Shift : TShiftState ; X, Y : Integer ) ;
₄ begin
₅ xi := x ;
₆ y i := y ;
₇ end;

2. Cuando se mueva el mouse, se toma el punto de llegada en xf, yf.

₁ { Movimiento del mouse}
₂ procedure TFMiniPaint . FondoMouseMove ( Sender : TObject ;
₃ Shift : TShiftState ; X, Y : Integer ) ;
₄ begin
₅ BarradeEstado . Panels [ 0 ] .Text := IntToStr ( x )+ ’ , ’ +IntToStr ( y ) ;

6

₇ xf := x ;
₈ yf := y ;
₉ end;

dentro del cual también estaba el código que muestra la coordenada del mouse en la barra de estado.

3. ¿Donde se debe dibujar?

Cuando soltamos el mouse, se debe ver el dibujo, así usamos el proceso OnMouseUp.

₁ { Levantando e l botón presionado del mouse}
₂ procedure TFMiniPaint .FondoMouseUp ( Sender : TObject ;
₃ Button : TMouseButton ; Shift : TShiftState ; X, Y : Integer ) ;
₄ begin
₅ { Hacer selección de herramienta y dibujar }
₆ end;

Con estos tres (3) pasos ya hemos tomado el punto de salida y el punto de llegada, ahora solo falta usar el proceso Line() para dibujar la línea.

¿Cómo sabemos cuál herramienta está activa? Podemos usar la barra de estado para mostrarlo; agregamos un nuevo panel y colocamos los siguientes valores.

Figura 5.13: Visor de herramientas Además creamos una variable global de tipo entero “TipoHerramienta” en la cual guardamos con valores numéricos cual es el tipo de herramienta que estamos usando.

Tipo Herramienta Valor Líneas Rectas 1
Rectángulos 2
Cuadrados 3
Elipses 4
Círculos 5
Rectángulo redondeado 6
Texto 7
Borrador 8

Para establecer el valor del tipo de herramienta, hacemos doble clic en cada uno de los botones de herramientas y hacemos lo siguiente:

₁ {################ Herramientas ################ }
₂ { Lineas rectas }
₃ procedure TFMiniPaint . b1clic ( Sender : TObject ) ;
₄ begin
₅ TipoHerramienta := 1;
₆ BarradeEstado . Panels [ 1 ] .Text := ’ Herramienta :
₇ end;

8

₉ { Rectangulos }
₁₀ procedure TFMiniPaint . b2clic ( Sender : TObject ) ; ₁₁ begin
₁₂ TipoHerramienta := 2;
₁₃ BarradeEstado . Panels [ 1 ] .Text := ’ Herramienta : ₁₄ end;

15

₁₆ { Cuadrados }
₁₇ procedure TFMiniPaint . b3clic ( Sender : TObject ) ; Linea Recta ’ ;

Rectángulo ’ ; ₂₃ { Elipses }
₂₄ procedure TFMiniPaint . b4clic ( Sender : TObject ) ;
₂₅ begin
₂₆ TipoHerramienta := 4;
₂₇ BarradeEstado . Panels [ 1 ] .Text := ’ Herramienta : Elipse ’ ;
₂₈ end;

₁₈ begin
₁₉ TipoHerramienta := 3;
₂₀ BarradeEstado . Panels [ 1 ] .Text := ’ Herramienta : Cuadrado ’ ;
₂₁ end;

22
29

₃₀ { c í r c u l o s }
₃₁ procedure TFMiniPaint . b5clic ( Sender : TObject ) ;
₃₂ begin
₃₃ TipoHerramienta := 5;
₃₄ BarradeEstado . Panels [ 1 ] .Text := ’ Herramienta : círculo ’ ;
₃₅ end;

36

₃₇ { Rectángulos redondeados }
₃₈ procedure TFMiniPaint . b6clic ( Sender : TObject ) ;
₃₉ begin
₄₀ TipoHerramienta := 6;
₄₁ BarradeEstado . Panels [ 1 ] .Text :=
₄₂ ’ Herramienta : Rectángulo Redondeado ’ ;
₄₃ end;

44

₄₅ { Texto }
₄₆ procedure TFMiniPaint . b7clic ( Sender :
₄₇ begin
₄₈ TipoHerramienta := 7;
₄₉ BarradeEstado . Panels [ 1 ] .Text :=
₅₀ ’ Herramienta : Texto ’ ;
₅₁ end;

52

₅₃ { Borrador }
₅₄ procedure TFMiniPaint . b10clic ( Sender : TObject ) ;

TObject ) ;
₅₅ begin
₅₆ TipoHerramienta := 8;
₅₇ BarradeEstado . Panels [ 1 ] .Text := ’ Herramienta : Borrador ’ ;
₅₈ end;

Colocamos el valor del tipo de herramienta y mostramos el tipo de herramienta en la barra de estado.

Figura 5.14: Seleccionando las Herramientas

Como ya tenemos un valor para cada herramienta usamos un código de selección cuando la aplicación toma el último valor o coordenada en el evento OnMouseMove.

El código de selección funciona así:

Case Variable of

1 : Ejecuta acción 1;
2 : Ejecuta acción 2;
3 : Ejecuta acción 3;
...
else : Ejecuta acción si no esta dentro del rango de elección;

end;

En nuestro evento sería:

₁

{ Levantando e l botón presionado del mouse}

₂ procedure

TFMiniPaint .FondoMouseUp ( Sender : TObject ; Shift : TShiftState ; X, Y :

integer

) ;

₃

Button : TMouseButton ;

₄ begin

5

₆

{ Seleccionar e l t i p o de herramienta }

₇ case TipoHerramienta of ₈ 1:

₉ begin
₁₀ { s i es uno dibuja una línea recta } ₁₁ Fondo . Canvas . Line ( xi , yi , xf , yf ) ; ₁₂ end;

13

₁₄ 2:
₁₅ begin
₁₆ { s i es dos dibuja un rectángulo } Fondo . Canvas . Rectangle ( xi , yi , xf , yf ) ;
₁₇ end;

18

₁₉ 3:
₂₀ begin
₂₁ { s i es t r e s dibuja un cuadrado }
₂₂ Fondo . Canvas . Rectangle ( xi , yi , xf , xf ) ;
₂₃ end;

24

₂₅ 4:
₂₆ begin
₂₇ { s i es cuatro dibuja una e l i p s e }
₂₈ Fondo . Canvas . Ellipse ( xi , yi , xf , yf ) ;
₂₉ end;

30

₃₁ 5:
₃₂ begin
₃₃ { s i es cinco dibuja un c í r c u l o }
₃₄ Fondo . Canvas . Ellipse ( xi , yi , xf , yf ) ;
₃₅ end;

36

₃₇ 6:
₃₈ begin
₃₉ { s i es seis dibuja una rectángulo redondeado }
₄₀ Fondo . Canvas . RoundRect ( xi , yi , xf , yf ,30 ,30);
₄₁ end;

42

₄₃ 7:
₄₄ begin
₄₅ { s i es s i e t e dibuja un t e x t o }
₄₆ Fondo . Canvas . textOut ( xi , yi , ’ Texto ’ ) ;

₄₇end

;

48

₄₉ 8:
₅₀ begin
₅₁ { s i es ocho dibuja una línea recta }
₅₂ Fondo . Canvas . Rectangle ( xi , yi , xf , yf ) ;
₅₃ end;
₅₄ end;
₅₅ end;

Cuando intentemos dibujar, no veremos nada, puesto que cuando se pulsa nuevo lienzo, el color del lápiz queda blanco, así que configuraremos también los botones del color del contorno y del relleno.

En la pestaña de Dialogs buscamos un componente que es TColorDialog

y le ponemos por nombre Colores.

Hacemos doble clic sobre el botón de color de contorno y escribimos el código:

₁ { Color de contorno }
₂ procedure TFMiniPaint . b8clic ( Sender : TObject ) ;
₃ begin
₄ { Abrir la caja de colores }
₅ Colores . Execute ;

6

₇ { Seleccionar e l c o l o r }
₈ Fondo . Canvas . Pen . Color := Colores . Color ;
₉ end;

Recordando que para cambiar el color de lápiz, se hace con la ruta de propiedad que se ve en la línea 8.

En forma análoga se hace para el color de relleno.

₁ { Color de r e l l e n o }
₂ procedure TFMiniPaint . b9clic ( Sender : TObject ) ;
₃ begin
₄ { Abrir la caja de colores }
₅ Colores . Execute ;

6

₇ { Seleccionar e l c o l o r }
₈ Fondo . Canvas . Brush . Color := Colores . Color ;
₉ end;

Ahora, la aplicación está casi completa.

Figura 5.15: Probando las Herramientas

Algunas cosas fallan hasta ahora:
El borrador hace rectángulos (se colocó así para modificarlo después). Los cuadrados y los círculos no funcionan.
No se puede escribir un texto a voluntad del usuario.

Para arreglar el borrador, vamos a construir uno no tan típico„ un rectángulo de relleno y contorno blanco. Para ello debemos crear dos variables temporales que guarden el color de contorno y el color de relleno para que no se pierdan al cambiar las propiedades del borrador.

Pueden ser por ejemplo, CtColor y RnColor las cuales son del tipo TColor. Var

FMiniPaint: TFMiniPaint; xi, yi, xf, yf: integer; TipoHerramienta: integer; CtColor ,RnColor : TColor; Cuando damos clic al botón para seleccionar el borrador hacemos lo siguiente:

{Borrador}
procedure TFMiniPaint.b10clic(Sender: TObject); begin

TipoHerramienta := 8;

BarradeEstado.Panels[1].Text :=

’Herramienta: Borrador’;
CtColor := Fondo.Canvas.Pen.Color;

RnColor := Fondo.Canvas.Brush.Color; {asignar color blanco}
Fondo.Canvas.Pen.Color:=clWhite;
Fondo.Canvas.Brush.Color:=clWhite;

end;

y cuando se levanta el botón del mouse en el caso ocho:

8:

begin

{si es ocho borrar}
Fondo.Canvas.Rectangle(xi, yi, xf, yf); Fondo.Canvas.Pen.Color := CtColor; Fondo.Canvas.Brush.Color:=RnColor;

end;

Para arreglar el cuadrado y el círculo, hay que hallar la distancia entre xf y xi , así, en los casos 3 y 5:

3:

begin

{si es tres dibuja un cuadrado}

Fondo.Canvas.Rectangle(xi, yi, xf, yi+(xf-xi));

end;
5:
begin
{si es cinco dibuja un círculo}
Fondo.Canvas.Ellipse(xi, yi, xf, yi+(xf-xi));

end;

Recordando que el rectángulo forma un cuadrado si la distancia desde xi hasta xf es la misma que hay desde yi hasta yf, análogamente funciona con la elipse para formar un círculo.

Finalmente para arreglar el texto modificamos el caso 7 así:

7:

begin

{si es siete dibuja un texto}
Fondo.Canvas.TextOut(xi, yi,
InputBox(’Insercción de texto’,’Ingrese su texto’,’Texto’));

end;

Donde InputBox muestra una caja de diálogo en la que ingresamos el texto.

Figura 5.16: Probando las Herramientas

Existen otras técnicas de dibujo que permiten más utilidades, aún se podría mejorar el estilo del relleno y de los contornos, pero se deja al lector como ejercicio.

Figura 5.17: Probando Nuevos Estilos y Herramientas

6

Programación orientada a objetos

6.1

Aproximación a la programación orientada a objetos

En un colegio, se requiere de una plantilla para recoger los datos de los estudiantes que se van a matricular, esta plantilla contiene básicamente, el nombre del estudiante, el número del documento de identidad, el sexo, el año que entra a cursar y la edad.

La plantilla se diseña como sigue:

Figura 6.1: Plantilla para Matricula de Estudiantes

El colegio decide imprimir la plantilla y luego sacar 500 fotocopias para llenar los registros.

163 Hasta este punto, relacione la plantilla con una clase, cuyo nombre es (PlantillaMatricula). En programación una clase, es simplemente una plantilla, un código que resuelve un problema. Luego, cuando se imprime esta plantilla se convierte la clase en un objeto.

Este objeto sencillo, contiene cinco variables, el nombre, los apellidos, el documento de identidad, el año y la edad de un estudiante que se matriculará en dicho colegio.

Las clases pueden ser copiadas tantas veces como se desee, esto se conoce como la instancia de una clase. Cuando es copiada, toma un espacio y es real se considera como un objeto. Ahora, cada fotocopia sera diferente porque recoge varios datos.

Esta técnica para el colegio representa economía en horas de trabajo. Imagine que una secretaria escribiera 500 plantillas, sin tener la opción de copiar y pegar. La copia de las plantillas se hace muy rápido, usando la misma plantilla para recoger varios datos.

En este sentido la programación orientada a objetos ofrece solución a la compresión de algoritmos extensos formando algoritmos pequeños y reutilizables tantas veces como sea necesario.

6.1.1

Herencia

Suponiendo que la plantilla no da lugar para estudiantes nuevos, por que es necesario conocer otros datos de ellos, tales como el nombre de los padres, el número de hermanos, el estrato socio-económico y la dirección de residencia, entonces se debe crear una nueva plantilla.

No es necesario crear una plantilla desde cero (0), ya hay una que sirve, simplemente se copia la información de la primera plantilla en un documento nuevo y se agrega los ítems que hacen falta.

Se ha creado una nueva plantilla, que contiene los datos de la primera. La nueva plantilla ha heredado los datos de la primera . No es igual, pero conserva dentro de si la información de la primera.

En programación orientada a objetos, la nueva plantilla viene a ser hija de la primera, la cual ha implementado nuevas variables y heredado las variables de la clase madre.

Aún continua siendo una plantilla (clase), cuando es impresa, pasa a ser un nuevo objeto, un objeto cuyo trabajo es recoger los datos para los estudiantes nuevos que se matriculan en el colegio.

6.2

El objeto formulario

En Lazarus Project, toda la programación está orientada a objetos. Aunque no se haya mencionado con anterioridad, cuando se crearon las aplicaciones por medio de los formularios se estaba trabajando con objetos.

Como se vio en la sección anterior, un objeto hereda las propiedades, funciones y métodos de un padre o ancestro, este no utilizará todas las propiedades, funciones y métodos, puede ser posible que sean modificadas para hacer tareas más elaboradas, o que agregue nuevos procesos que no pertenecen al padre pero que toman funciones de éste.

Por ejemplo: en el diseño de una aplicación para encriptar texto, se tiene un formulario, al cual se le agregan una caja de texto, un botón y un Memo, componentes necesarios para visualizar e introducir los datos. Luego, si observamos el código, éste tiene la siguiente forma:

Figura 6.2: Código de un Formulario

Se pueden observar en el código cuatro (4) partes principales las cuales son:

1. La declaración del tipo, éste indica que un nuevo objeto o clase será declarado.

2. La declaración de una nueva clase de tipo TForm, se utiliza un nombre que se quiera dar a la clase por ejemplo TForm1 y se define a través de la palabra reservada class que heredará de TForm, esto ahora indica que TForm1 es una clase.

3. La clase contiene tres (3) variables las cuales son Encriptar que es de Tipo TButton, es decir es un botón, Resultado que es del Tipo TMemo, es un Memo y la variable T exto que es del tipo TEdit, es decir una caja de texto.

Estas son las variables de esta clase formulario que se usarán más adelante para visualizar e introducir los datos necesarios en la aplicación.

4. Otra parte es la declaración de los procesos y funciones; como se observa en el código se tiene EncriptarClick, proceso que se inicia cuando damos clic al botón Encriptar. En esta parte, se observa que la clase TForm1, hereda el método Onclick de la clase padre TForm, pero la implementa a partir del botón.

6.2.1

Creación de clases

Para crear clases, ya se vio en ejemplo del formulario, que la clase TForm1 es hija de la clase TForm. Para la creación de nuevas clases se debe saber quien sera la clase madre, con el fin de heredar los procesos, variables y funciones necesarios para la nueva clase hija.

Por ejemplo,

Figura 6.3: Jerarquáa de Clases

Para crear un formulario se han creado antes otras clases que son hijas de un antecesor. En la imagen se puede observar que la clase madre es TObject, luego se crea la clase hija TPersisten, y así sucesivamente hasta crear la clase TForm. Como se vio en la aproximación a la programación orientada a objetos, cada clase nueva implementa nuevos métodos (procesos y funciones), que se van heredando a las nuevas clases hijas.

6.2.2

¿Cuál es la diferencia entre clase y objeto?

Hay que tener en cuenta cuál es la diferencia entre una clase y un objeto. Una clase es una nueva estructura de código que define unas variables, métodos y funciones, las cuales se implementan para realizar las tareas correspondientes a la solución de un problema. En el ejemplo anterior, se ha declarado una nueva clase, pero esta aún no es un objeto.

Un objeto se crea cuando se hace una copia exacta de la clase bajo un sólo nombre. En otras palabras, un objeto se crea cuando se define una variable con el tipo de la clase que se ha creado.

En el código autogenerado por Lazarus Project se puede observar como se crea un objeto del tipo TForm1, a la cual se le llama una instancia de la clase. En estos términos, una clase es posible copiarla varias veces, creando varios objetos, en este caso, varias ventanas o formularios iguales.

Figura 6.4: Crear una Instancia (objeto) del Tipo TForm1

En la figura anterior, se observa como se crea una variable, Form1, que es del tipo TForm1. Recordando que esta es una clase que hereda las propiedades del padre TForm, entonces Form1, es una copia de la clase TForm1, y en este punto ya es un objeto.

Hay una clara diferencia simplemente ejecuta una

6.2.3

¿Qué es un proceso y qué es una función?

entre un proceso y una función. Un proceso, serie de acciones sobre un espacio, objeto o componente, sin generar un resultado tipificado (valores de reales, enteros, etc.), mientras que una función realiza una serie de pasos para devolver un resultado.

Por ejemplo, el evento Onclick es un proceso porque ejecutará una acción sobre un componente, mientras que por ejemplo, la función:

function sqrt(número : Integer) : Real;

que calcula la raíz cuadrada de un número entero dado como parámetro (valor que se escribe dentro del paréntesis), devuelve un número real, es decir la raiz cuadrada del número entero que se dio como parámetro.

6.2.4

¿Cómo se implementan las funciones y procesos de una clase?

Esto es muy sencillo de hacer, por ejemplo: al dar doble clic sobre el botón del formulario, este creara un código automático. Este código se conoce como implementación de los procesos de la clase.

Figura 6.5: Código de Implementación de un Formulario

Observe que para implementar el proceso Encriptarclic de la clase TForm1, se antepone el nombre de la clase, seguida de un punto, esto quiere decir que el proceso que se está implementando, pertenece a la clase indicada antes del punto.

Implementar, quiere decir poner en marcha el algoritmo que da solución al problema, en otras palabras, es escribir dentro del proceso las líneas que resuelven el problema.

Si la clase tiene varios procesos y funciones, todos estos se deben implementar.

Ejemplo 15

. Objeto para sumar dos números

Inicialmente se construye una aplicación en Lazarus Project, con su formulario, dos (2) cajas de texto, una etiqueta y un botón.

Figura 6.6: Diseño del Formulario (aplicación para sumar dos números).

Como se vio en la sección anterior, las clases se declaran en la sección de tipos (Types), entonces se creará una nueva clase después de la creada por el formulario.

Figura 6.7: Declaración de la Nueva Clase

Observe que la estructura de la nueva clase es similar a la del formulario, se define con el nombre TSumar, es una clase de tipo TObject, contiene dos (2) variables de tipo entero y una función para sumar los dos (2) valores.

Luego donde se crean las variables, en la sección de variables donde se ha definido el formulario Form1, se crea un objeto. Recuerde que se ha creado una clase TSumar, pero aún no se ha creado el objeto.
Para implementar el método o función Sumar de esta clase, se hace como se vio en la sección anterior.

₁ function TSumar.Sumar : Integer;
₂ begin
₃ Result := a+b ;
₄ end;

Se antepone el nombre de la clase TSumar al nombre de la función que es sumar, y dentro de la función se hacen los pasos o códigos necesarios para resolver el problema, tan simple como decir que el Resultado (Result) es la suma de las variables a y b.

Nota: cuando se esta trabajando con funciones, estas tienen asociadas una variable Result, la cual es del tipo que devuelve la función, por ejemplo si la función devuelve un número entero la variable Result es del tipo entero, de esta manera se pone el resultado en esta variable.

¿Cómo crear un objeto?

Para crear un objeto, creamos una variable del tipo TSumar, la cual será una instancia de la clase TSumar, es decir un objeto.

₁ var
₂ Form1: TForm1;
₃ Sumar1 : TSumar;

Luego, en el evento Onclick del botón sumar, se crea el objeto Sumar1.

₁ procedure TForm1. bSumarclic ( Sender : TObject ) ;
₂ begin
₃ Sumar1 := TSumar. Create ;
₄ end;

El proceso Create, se llama un constructor y es heredado por la clase TSumar del padre TObject (es la clase padre). Cuando se crea el objeto Sumar1, como se menciono antes, se está haciendo una copia exacta de la clase TSumar en la variable Sumar1, donde se pueden usar sus variables y métodos.

Figura 6.8: Declaración de la Nueva Clase

Como se ve en la figura, al acceder a las variables del objeto Sumar1 (pulsando las teclas Ctrl+Space) después del punto aparecerán las variables a,b de tipo entero, y la función sumar que devuelve un entero, luego aparecen los procesos y funciones de la clase madre o padre del cual es hij@ la nueva clase.

Por medio de estas variables de la clase, se da al objeto los valores para realizar la suma.

₁ procedure TForm1. bSumarclic ( Sender : TObject ) ;
₂ var
₃ c : Integer;
₄ begin
₅ Sumar1 := TSumar. Create ;

6

₇

Sumar1. a := StrToInt (Num1.

Text

) ;

₈

Sumar1. b := StrToInt (Num2.

Text

) ;

9

₁₀

c := Sumar1.Sumar;

11

₁₂

Resultado . Caption := i n t t o ; IntToStr ( c ) ;

13

₁₄

Sumar1. Free ;

₁₅ end

;

En este código, se extraen los valores de las cajas de texto y se introducen en las variables del objeto Sumar1. Luego la variable c que es de tipo entero, recibira el valor cuando el objeto Sumar1, realice la suma mediante su función Sumar. Se muestra el resultado en la etiqueta y se libera al objeto mediante la propiedad heredada Free.
Nota: es importante liberar los objetos, puesto que estos ocupan un espacio en la Memoria RAM del computador y se hará más lento si se crean varios objetos y no se liberan.

Figura 6.9: Ejecución del Programa

6.3

Importancia de los objetos

En el ejemplo anterior, no se ve claramente cuál es la importancia de los objetos, porque la aplicación que se le ha dado es muy sencilla.

La importancia esta en que los objetos son las instancias de las clases, es decir que se crea una clase y por medio de los objetos se copia la clase, tantas veces como se quiera.

Por ejemplo, una caja de texto es un objeto que se crea a partir de la clase TButton. Si no existiesen los objetos, habría que copiar manualmente el código de un botón cada que se quiere hacer uno sobre el formulario.

En resumen, la importancia de la programación orientada a objetos radica en la reutilización de código, hacer varias copias de una clase, como en el caso de los componentes sobre un formulario.

6.4

Componentes

Los componentes son la estructura fundamental de programación en Lazarus Project. La gran mayoría de los componentes son visibles para el usuario (programador), y existen otros pocos que proporcionan otras funciones para el programa, por lo tanto no requieren ser visibles.

Todos los componentes descienden del tipo TComponent, este tipo proporciona las caracteristicas básicas para un componente. En síntesis ser mostrado en la paleta de componentes, para ayudar al diseño del formulario.

Todos los componentes forman parte de la jerarquía de objetos denominado Visual Component Library (VCL). Cuando se crea un nuevo componente, éste deriva de un componente existente (bien sea TComponent o algún otro más especializado) y se añade al VCL.

6.4.1

¿Cómo esta formado un componente?

Un componente es un objeto formado por un código, compuesto por métodos, propiedades y eventos.

Una propiedad, tal como se muestra en el inspector de objetos, permite la modificación del objeto.

Los eventos se refieren a la conexión que hay entre los controles y el código del componente, es decir, son los sensores que recopilan información, por ejemplo: del teclado o del mouse, etc., para realizar alguna tarea dada en el código.

Los métodos, son los procesos que se escriben para realizar determinadas tareas con el componente, por ejemplo: cambiar de estado, mostrar un mensaje o hacer un cálculo.

6.4.2

Declaraciones de un componente

Al igual que una clase, un objeto posee las declaraciones de tipo privado, protegido, publico y publicado. La estructura para crear un componente, es la misma que tiene una clase.

₁ type

2

₃ TNombreComponente = class ( TAncestro )
₄ private
₅ { Private declarations }
₆ protected
₇ { Protected declarations }
₈ public
₉ { Public declarations }
₁₀ published
₁₁ { Published declarations }
₁₂ end;

En cada una de estas secciones, se hacen declaraciones para el código.

Las declaraciones de tipo privada (private) son asequibles, sólo desde la misma unidad que contiene a la clase y desde sus mismos métodos.

Las declaraciones de tipo protegidas (protected) funcionan en forma similar a las declaraciones privadas. La diferencia esta en que al declarar nuevas clases que descienden de está clase, las nuevas clases podrán referenciar este tipo de declaraciones, mientras que en las declaraciones privadas no se puede hacer.

En las declaraciones públicas (public), se agregan o definen todas aquellas variables, métodos y eventos que pueden ser accedidos por el usuario final del componente (programador).

Las declaraciones publicadas (published) son las que se muestran en el inspector de objetos, las cuales se definen como propiedades.

6.4.3

¿Cómo saber cuál será el padre (ancestro) de un componente?

Dependiendo del componente que se quiera crear, asi mismo se selecciona la clase de la cual se quiere heredar.

De la clase TComponent, descienden los componentes no visuales. De la clase TWinControl, descienden los componentes que requieren controles (handles), por ejemplo: el teclado, el mouse, etc.

De la clase TGraphicControl, descienden los componentes visuales, que no requieren controles (handles) donde se tiene como herramienta principal el canvas.

De la clase TCustromControl, descienden los componentes que tienen acceso al canvas, se pueden agregar otros componentes y tiene acceso a los controles (handles).

Cuando se crea un nuevo componente en Lazarus, éste crea un código automático, que contiene la siguiente estructura:

₁

unit NombreUnidad ;

2

₃

{$mode objfpc } {$H+}

4

₅

i n t e r f a c e

6

₇

uses

₈

{ Unidades requeridas } ;

9

₁₀ type

11

₁₂ TNombreComponente = class ( TAncestro )
₁₃ private
₁₄ { Private declarations }
₁₅ protected
₁₆ { Protected declarations }
₁₇ public
₁₈ { Public declarations }
₁₉ published
₂₀ { Published declarations }
₂₁ end;

22

₂₃ procedure

Register ;

24

₂₅

implementation

26

₂₇ procedure Register ;
₂₈ begin
₂₉ { $I ecuacionsg_icon . l r s }
₃₀ RegisterComponents ( ’ NombrePestaña ’ , [ TNombreComponente ] ) ;
₃₁ end;

32

₃₃ end

.

Es un código similar al de un objeto, dado que un componente es un objeto. Éste contiene además un proceso (Register) mediante el cual se registra el componente nuevo en una de las pestañas de componentes de Lazarus colocando su nombre, tal y como se observa en el código (NombrePestaña).

Ejemplo 16

. Un componente nuevo para Lazarus (Ecuación general de segundo grado)

En el capítulo de los componentes, se explico que existen componentes visuales y no visuales, los componentes no visuales aportan soluciones internas a la aplicación.

Para crear un componente en Lazarus, basta con hacer algunos clics, escribir el algoritmo de la solución, instalar el componente y ya esta.

En el menú Paquete hay una opción para crear nuevos componentes, se hace clic y se abre un diálogo que le pide un nombre para guardar el componente al cual se le pondrá (Pack_Ecuacion_SG).

Figura 6.10: Menú Nuevo Componente.

En la ventana que aparece se hace clic sobre el botón Añadir, y, luego se selecciona la opción nuevo componente.

Figura 6.11: Ventana para Nuevo Componente.

En la ventana que aparece seleccionamos la pestaña, nuevo componente, donde escribimos los siguientes valores.

Figura 6.12: Nuevo Componente.

1. En el tipo de ancestro, se selecciona la clase de la cual se quiere que el nuevo componente herede las propiedades, ya se ha visto cuáles son las principales clases padres para crear los diferentes tipos de componentes.

2. En el nombre de la clase, se agrega el nombre de la nueva clase, anteponiendo la letra T (la letra T se establece por nomenclatura para las clases en programación).

3. En la página de paleta, se selecciona la paleta de componentes en donde se quiere instalar el nuevo componente, o poner un nombre nuevo. 4. El nombre de archivo de la unidad y el nombre de la unidad se generan automáticamente.

5. El ícono se carga pulsando el botón. (El ícono debe tener un tamaño de 24 por 24 pixeles).

Después de pulsar el botón crear nuevo componente, Lazarus creará un código de forma automática.

₁

unit EcuacionSG ;

2

₃

{$mode objfpc } {$H+}

4

₅

i n t e r f a c e

6

₇

uses

₈

Classes , SysUtils , LResources , Forms, Controls ,

9

₁₀ type

11

₁₂ TEcuacionSG = class ( TComponent )
₁₃ private
₁₄ { Private declarations }
₁₅ protected
₁₆ { Protected declarations }
₁₇ public
₁₈ { Public declarations }
₁₉ published
₂₀ { Published declarations }
₂₁ end;

22

₂₃ procedure

Register ;

24

₂₅

implementation

26

₂₇ procedure Register ;
₂₈ begin
₂₉ { $I ecuacionsg_icon . l r s }
₃₀ RegisterComponents ( ’ Additional ’ , [ TEcuacionSG ] ) ;
₃₁ end;

32

₃₃ end

.

Graphics , Dialogs ;

El problema que se necesita resolver es la ecuación de segundo grado, entonces la nueva clase necesita variables, procesos y funciones para lograrlo.

₁

unit EcuacionSG ;

2

₃

{$mode objfpc } {$H+}

4

₅

i n t e r f a c e

6

₇ uses
₈ Classes ,
₉ Graphics , SysUtils , LResources , Forms, Controls , Dialogs , Math;

10

₁₁ type
₁₂ TSolucion = record
₁₃ x1 , x2 : string ;
₁₄ end;

15

₁₆ TEcuacionSG = class ( TComponent )
₁₇ private
₁₈ a , b , c : real;
₁₉ Sol : TSolucion ;
₂₀ protected
₂₁ { Protected declarations }
₂₂ public
₂₃ procedure FResolver ;
₂₄ published
₂₅ property ValA :
₂₆ property ValB :
₂₇ property ValC :

28

real read a write a ; real read b write b ; real read c write c ;

₂₉ property x1 :
₃₀ property x2 :
₃₁ end;

32

String

read

Sol . x1 ; String

read

Sol . x2 ;

₃₃ procedure

Register ;

34

₃₅

implementation

36

₃₇ procedure TEcuacionSG . FResolver ;
₃₈ var
₃₉ disc : real;
₄₀ rx1 , rx2 : Real;
₄₁ begin
₄₂ disc := power ( b,2)−4*a*c ;

43

₄₄ i f disc > 0 then
₄₅ begin
₄₆ rx1 := (−1*b+sqr ( disc ) ) / ( 2*a ) ; ⁴⁷ rx2 := (−1*b−sqr ( disc ) ) / ( 2*a ) ;
48

₄₉ Sol . x1 := FloatToStr ( rx1 ) ;
₅₀ Sol . x2 := FloatToStr ( rx2 ) ;
₅₁ end
₅₂ else
₅₃ begin

₅₄

rx1 := sqr ( abs ( disc ) ) / ( 2*a ) ;

⁵⁵

rx2 := sqr ( abs ( disc ) ) / ( 2*a ) ;

56

⁵⁷ Sol . x1 := FloatToStr (−1*b/(2*a ) ) + ’ +( ’ +FloatToStr ( rx1 )+ ’ i ) ’ ;
₅₈ Sol . x2 := FloatToStr (−1*b/(2*a ) ) + ’−( ’ +FloatToStr ( rx2 )+ ’ i ) ’ ;
₅₉ end;
₆₀ end;

61

₆₂ procedure Register ;
₆₃ begin
₆₄ { $I ecuacionsg_icon . l r s }
₆₅ RegisterComponents ( ’ Additional ’ , [ TEcuacionSG ] ) ;
₆₆ end;

67

₆₈ end

.

En la línea 18 se crean las variables (privadas) de la clase, y, en la línea 23, el proceso que resuelve la ecuación.

Se ha creado un nuevo record, con dos (2) variables de tipo string, para mostrar los resultados como textos, dado que la ecuación puede tener solución en los imaginarios.

Desde la línea 37 hasta la 60 se implementa el proceso dando los resultados en la variable Sol de tipo TSolucion que es un record con dos (2) valores.

En las líneas 25 a 30, se crean las propiedades que se mostrarán en el inspector de propiedades.

6.4.4

Compilar el paquete

Para compilar el paquete, se va al menú paquete y se selecciona la opción (Abrir paquete de unidad actual).

Figura 6.13: Abrir Paquete de Unidad Actual

En la ventana que aparece, se oprime el botón compilar.

Figura 6.14: Compilando el Paquete.

Si todo el código y los procesos son correctos, saldrá en la ventana de mensajes (“Compilando paquete Pack_Ecuacion_SG 0.0” completado).

6.4.5

¿Cómo instalar un nuevo paquete en Lazarus Project?

Después de compilar el paquete y obtener el mensaje “completado”, entonces en la misma ventana se pulsa el botón Usar y se selecciona la opción Instalar.

Figura 6.15: Instalar el paquete

Luego Lazarus mostrará un mensaje preguntando si desea reconstruir, en el cual pulsamos la opción SI.

Figura 6.16: Mensaje de confirmación

Despúes de que Lazarus se reconstruya, en la pestaña de componentes Additional debe estar el nuevo componente instalado, podemos crear tantas copias como se desee.

Figura 6.17: Usando el Nuevo Componente.

7

Ejemplos y prácticas

Entendiendo que la programación es una actividad que demanda ejercitación, y dando cumplimiento al objetivo planteado en este texto de formar programadores, a continuación se proponen 14 ejercicios resueltos, para los cuales se recomienda observarlos detalladamente.

7.1

Tabla de multiplicar de un número

Realizar el programa para calcular la tabla de multiplicar de un número. Una tabla de multiplicar, normalmente está constituida por los números del 1 al 10, así por ejemplo: la tabla del 7 es:

7 × 1 = 7
7 × 2 = 14
7 × 3 = 21
.
7 × 10 = 70

Para este diseño podemos utilizar por ejemplo un StringGrid.

Modificamos las siguientes propiedades:

ColCount := 2

RorCount := 10

187 AutoFillColumn := True FixedRows := 0

Luego, el formulario tendrá el siguiente aspecto:

Figura 7.1: Diseño del Formulario para Calcular una Tabla de Multiplicar

Para ingresar un número, agregamos un TLabelEdit, y un botón para realizar el cálculo:

Figura 7.2: Diseño del formulario para calcular una tabla de multiplicar

Damos doble clic sobre botón calcular y aparecerá el siguiente procedimiento:

₁ procedure

TForm1. Calcularclic ( Sender : TObject ) ;

₂ begin

3

₄ end

;

Luego, creamos una variable de tipo entero para leer el número de la caja de texto.

a : Integer;

Leemos el valor de la caja de texto:

a:= StrToInt(número.Text);

Y luego, realizar la tabla de multiplicar. Como el StringGrid, sólo recibe texto, hay que convertir los números a texto.
Recuerde que para acceder a las celdas del StringGrid, que en este caso se ha nombrado como T ablaMultiplicar, se utiliza la propiedad Cells.

Por ejemplo:

T ablaMultiplicar.Cells[i, j]accede a la columna i y al fila j. Primero, se llama a la columna y después a la fila.

Las columnas y las filas empiezan en cero, así que una matriz de 2 × 10 para ingresar los resultados de la tabla sólo tendrá las columnas 0 y 1 y las filas del 0 al 9.

₁ { Hallar la tabla de m u l t i p l i c a r de un número}
₂ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₃ var
₄ a : Integer;
₅ begin
₆ a := StrToInt ( número.Text) ;

7

₈ { Ralizar la tabla de m u l t i p l i c a r } ₉ TablaMultiplicar . Cells [ 0 , 0 ] ₁₀ TablaMultiplicar . Cells [ 0 , 1 ] ₁₁ TablaMultiplicar . Cells [ 0 , 2 ] ₁₂ TablaMultiplicar . Cells [ 0 , 3 ] ₁₃ TablaMultiplicar . Cells [ 0 , 4 ] ₁₄ TablaMultiplicar . Cells [ 0 , 5 ] ₁₅ TablaMultiplicar . Cells [ 0 , 6 ] ₁₆ TablaMultiplicar . Cells [ 0 , 7 ] ₁₇ TablaMultiplicar . Cells [ 0 , 8 ] ₁₈ TablaMultiplicar . Cells [ 0 , 9 ]

19

:= := := := := := := := := := IntToStr ( a)+ ’ x1= ’ ; IntToStr ( a)+ ’ x2= ’ ; IntToStr ( a)+ ’ x3= ’ ; IntToStr ( a)+ ’ x4= ’ ; IntToStr ( a)+ ’ x5= ’ ; IntToStr ( a)+ ’ x6= ’ ; IntToStr ( a)+ ’ x7= ’ ; IntToStr ( a)+ ’ x8= ’ ; IntToStr ( a)+ ’ x9= ’ ; IntToStr ( a)+ ’ x10= ’ ;

₂₀ TablaMultiplicar . Cells [ 1 , 0 ]
₂₁ TablaMultiplicar . Cells [ 1 , 1 ]
₂₂ TablaMultiplicar . Cells [ 1 , 2 ]
₂₃ TablaMultiplicar . Cells [ 1 , 3 ]
₂₄ TablaMultiplicar . Cells [ 1 , 4 ]
₂₅ TablaMultiplicar . Cells [ 1 , 5 ]
₂₆ TablaMultiplicar . Cells [ 1 , 6 ]
₂₇ TablaMultiplicar . Cells [ 1 , 7 ]

:= IntToStr ( a*1 ) ; := IntToStr ( a*2 ) ; := IntToStr ( a*3 ) ; := IntToStr ( a*4 ) ; := IntToStr ( a*5 ) ; := IntToStr ( a*6 ) ; := IntToStr ( a*7 ) ; := IntToStr ( a*8 ) ;

₂₈

TablaMultiplicar . Cells [ 1 , 8 ]

₂₉

TablaMultiplicar . Cells [ 1 , 9 ]

30

₃₁ end

;

:= IntToStr ( a*9 ) ; := IntToStr ( a*1 0 ) ;

Al ejecutar la aplicación, el resultado sera el siguiente:

Figura 7.3: Ejecución de la Aplicación para Calcular una Tabla de Multiplicar

7.2

Unidades de medida

Las unidades de medida son habitualmente usadas para resolver algos tipos de problemas de conversiones.

Para hacer conversiones entre unidades de medidas se usan las reglas de tres simple, esta es una composición de proporciones, donde se busca encontrar un valor desconocido a partir de tres (3) valores conocidos, tal y como se muestra a continuación:a = c

b d
donde a, b, c o d puede ser la variable a la cual queremos encontrar el valor, dados tres (3) valores conocidos.

De esta manera, existen cuatro posibles soluciones:

b × c

a = d

a × d

b = c

a × d

c = b

b × c

d = a

Por otra parte, las unidades de medida se distinguen por presentarse en algunos tipos especiales, es decir, en medidas de longitud, medidas de peso, medidas de volumen y otras más.

Diseño del formulario

Figura 7.4: Diseño del Formulario para Conversión de medidas de Longitud

En este formulario, vamos a agregar un StringGrid, que se encuentra en la pestaña de componentes de Additional, le colocamos el nombre Valores, buscamos en el inspector de propiedades la propiedad Align en la opción alTop.

Esto hará que la rejilla se alinee a la parte superior del formulario y cambie de tamaño, cuando el formulario también lo haga.

Sobre el StringGrid, modificamos los siguientes propiedades:

ColCount = 2 (Cuenta el número de columnas)
RowCount = 7 (Cuenta el número de filas)
AutoFillColumn = True (Las columnas rellenan el espacio horizontal)

Para cambiar los valores de las unidades de medidas, vamos a utilizar seis (6) deslizadores y seis etiquetas, dado que las unidades de medida a trabajar son:

Milímetros.
Centímetros.
Metros.
Decámetros.
Hectómetros.
Kilómetros.

A los deslizadores (TrackBar) les colocamos los nombres con el siguiente formato Des_NombreUnidad, es decir por ejemplo:

mm: Milímetro : Des_Milimetro
cm: Centímetro: Des_Centimetro
mt: Metro: Des_Metro
dm: Decámetros: Des_Decametros
hm: Hectómetros: Des_Hectometros
km: Kilómetro: Des_Kilometro
Y para las etiquetas que mostrarán los valores de los deslizadores, así:

mm: Milímetro : Et_Milimetro

cm: Centímetro: Et_Centimetro

mt: Metro: Et_Metro

dm: Decámetros: Et_Decametros

hm: Hetómetros: Et_Hectometros

km: Kilómetro: Et_Kilometro

Para que le queden bien distribuidos los componentes solo ubíquelos sobre el formulario de la siguiente manera:

Figura 7.5: Diseño del Formulario para Conversión de Medidas de Longitud

Luego, seleccione el primer deslizador que corresponde a Milímetros y aplíquele la propiedad Align en el valor alTop, luego siga con la etiqueta correspondiente a Milímetros.

Figura 7.6: Diseño del Formulario para Conversión de Medidas de Longitud

Nótese que han quedado en orden después de las celdas, siga en ese mismo orden, los componentes correspondientes a Centímetros, Metros, Decámetros, Hectómetros y Kilómetros, para obtener en su orden lo siguiente:

Figura 7.7: Diseño del Formulario para Conversión de Medidas de Longitud

Ahora, se puede observar el orden en el que quedan, pero quedan unos más gruesos otros más delgados. Para hacerlos más uniformes, seleccione cada deslizador, busque la propiedad Height y colóquele a todos 40 pixeles.

Figura 7.8: Diseño del Formulario para Conversión de Medidas de Longitud

Ahora, ya puede verse que la aplicación toma un estilo más armónico. Luego, faltará cambiar la justificación del texto de las etiquetas, a las cuales les cambiamos la siguiente propiedad: Aligment colocando el valor taRightJustify.

Figura 7.9: Diseño del Formulario para Conversión de Medidas de Longitud

Como parte de la formulación del problema, vamos a considerar que tenemos en los deslizadores los siguientes valores:

mm: 1000 milímetros

cm: 100 centímetros

mt: 10 metros
dm: 10 decámetros hm: 10 hectómetros km: 10 kilómetros

Así en cada deslizador correspondiente cambiamos la propiedad Max, al valor que se da.

Cambio de valores

El cambio de valores en los deslizadores se da en el evento OnChange, así vamos al inspector de propiedades, pulsamos la pestaña de eventos y damos clic en el botón de los tres (3) puntos (Estando el deslizador de Milímetros seleccionado).

Figura 7.10: Cambio de Posición de los Deslizadores

En cada caso generará el código:

₁ procedure

TForm1. Des_MilimetroChange ( Sender : TObject ) ;

₂ begin

3

₄ end

;

Variables asociadas

Dado que son seis (6) procesos diferentes, donde se cambia el valor de los deslizadores, las variables deben ser de tipo global.

Entonces creamos seis (6) variables:

₁ var
₂ Form1: TForm1;
₃ mm : Real;
₄ cm : Real;
₅ mt : Real;
₆ dm : Real;
₇ hm : Real;
₈ km : Real;

Justamente debajo de la variable Form1.

Luego, en cada deslizador, se deben realizar las reglas de tres de la siguiente manera:

En el deslizador de los milímetros:

• ¿Un milímetro corresponde a 0,1 centímetro luego a milímetros, a cuántos centímetros corresponde? Se obtiene la siguiente regla:

x = 0

,1cm× amm

= 0,1 × a

1mm

• ¿Un centímetro corresponde a 0,1 metros, luego a centímetros, a cuántos metros corresponden? Se obtiene la siguiente regla:

x = 0

,1mt× acm

= 0,1 × a

1cm

• ¿Un metro corresponde a 0,1 decámetros luego a metros, a cuántos metros corresponde? Se obtiene la siguiente regla:

x = 0

,1dm× amt

= 0,1 × a

1mt

• ¿Un decímetro corresponde a 0,1 hetómetros luego a decámetros, a cuántos decámetros corresponde? Se obtiene la siguiente regla:

x

= 0

,1hm× adm= 0,1 × a1dm

• ¿Un hetómetro corresponde a 0,1 decámetros luego a hectómetros, a cuántos kilómetros corresponde? Se obtiene la siguiente regla:

x

= 0

,1km× ahm= 0,1 × a1hm

Mediante estas fórmulas obtenemos todos los valores. Así en el proceso de cambio de valores del deslizador de mm. se obtiene:

₁

{ 1. Obtener la posición del deslizador de milímetros }

₂

mm := Des_Milímetro . Position ;

3

₄ { 2. Aplicar las formulas }
⁵ cm := 0.1 * mm;
₆ mt := 0.1 * cm;
⁷ dm := 0.1 * mt;
₈ hm := 0.1 * dm;
₉ km := 0.1 * hm;

Luego, sólo falta mostrar los resultados en la tabla de valores que se llama Valores, y el proceso completo sería éste:

₁ procedure TForm1. Des_MilimetroChange ( Sender : TObject ) ;
₂ begin
₃ { 1. Obtener la posición del deslizador de milímetros }
₄ mm := Des_Milímetro . Position ;

5

₆

{ 2. Aplicar las fórmulas }

⁷ cm := 0.1 * mm;
⁸ mt := 0.1 * cm;
⁹ dm := 0.1 * mt;
₁₀ hm := 0.1 * dm;
¹¹ km := 0.1 * hm;

12

₁₃ { 3. Mostrar los resultados }
₁₄ Valores . Cells [ 0 , 0 ] := ’ Unidades ’ ;
₁₅ Valores . Cells [ 0 , 1 ] := ’mm’ ;
₁₆ Valores . Cells [ 0 , 2 ] := ’cm ’ ;
₁₇ Valores . Cells [ 0 , 3 ] := ’mt ’ ;

₁₈ Valores . Cells [ 0 , 4 ]
₁₉ Valores . Cells [ 0 , 5 ]
₂₀ Valores . Cells [ 0 , 6 ]

21

:= ’dm ’ ; := ’hm ’ ; := ’km ’ ;

₂₂ Valores . Cells [ 1 , 0 ]
₂₃ Valores . Cells [ 1 , 1 ]
₂₄ Valores . Cells [ 1 , 2 ]
₂₅ Valores . Cells [ 1 , 3 ]
₂₆ Valores . Cells [ 1 , 4 ]
₂₇ Valores . Cells [ 1 , 5 ]
₂₈ Valores . Cells [ 1 , 6 ]
₂₉ end;

:= ’ Valor ’ ;
:= FloatToStr (mm) ; := FloatToStr (cm) ; := FloatToStr (mt ) ; := FloatToStr (dm) ; := FloatToStr (hm) ; := FloatToStr (km) ;

Análogamente se hace para los otros deslizadores.

Nota: el código quedara larguísimo, pero después se puede volver más pequeño utilizando procedimientos y funciones, para no repetir tantas veces lo mismo.

El resultado de la aplicación será el siguiente:

Figura 7.11: Ejecución de la Aplicación (Unidades de medida).
Tan solo falta hacer el cambio de las etiquetas que seria así:

₁ procedure TForm1. Des_MilimetroChange ( Sender : TObject ) ;
₂ begin
₃ { 1. Obtener la posición del deslizador de milímetros }
₄ mm := Des_Milímetro . Position ;

5

₆

{ 1.1 Cambiar la etiqueta }

₇

Et_Milímetro . Caption := ’ Milimetros : ’ +FloatToStr (mm) ;

8

₉

. . .

10

₁₁ end

;

Terminamos aquí, mostrando que la ventana se puede escalar y el contenido no cambia:

Figura 7.12: Ejecución de la Aplicación (Unidades de medida)

7.3

Distancia entre dos puntos

La distancia entre dos puntos en el plano cartesiano está definida como:

d = (x

₁

− x

₂

)

²

+ (y

₁

− y

₂

)

²

donde (x

₁

, y

₁

) es el primer punto, y, (x

₂

, y

₂

) es el segundo punto en el plano cartesiano.

Diseño del formulario

El diseño del formulario, sera sencillo, consta de cuatro (4) cajas de texto para ingresar las abscisas y las ordenadas de los dos puntos, una etiqueta para mostrar la información del problema, y un Label para mostrar el resultado.

Agregamos un Label y en la propiedad Caption escribimos:

Programa para calcular la distancia entre dos puntos

y ubicamos a la propiedad Align en el valor alTop.

Figura 7.13: Diseño del Formulario para Calcular la Distancia entre Dos Puntos

Luego seleccionamos el formulario y cambiamos la fuente en la propiedad de fuente.

Colocamos las cuatro (4) cajas de texto con sus respectivas etiquetas cuyos nombres serán:

Cx1

Cx2

Cy1

Cy2

Figura 7.14: Diseño del Formulario para Calcular la Distancia entre Dos Puntos

Falta un botón por medio del cual vamos a calcular la distancia entre los dos (2) puntos,

Figura 7.15: Diseño del formulario para calcular la distancia entre dos puntos

al cual llamamos CalcularDistancia.

Para terminar el diseño del formulario, agregamos un Label para mostrar la distancia entre los puntos.

Figura 7.16: Diseño del Formulario para Calcular la Distancia entre Dos Puntos

Programación del evento Onclick del Botón CalcularDistancia

Dando doble clic sobre el botón CalcularDistancia, se generará el código del procedimiento en la ventana del código fuente, así:

₁ procedure

TForm1. CalcularDistanciaclic ( Sender : TObject ) ;

₂ begin

3

₄ end

;

Dentro de él vamos a agregar el código necesario para calcular la distancia entre los puntos dados.

¿Qué se necesita?

Necesitamos dos (2) variables de tipo entero (Integer) para guardar las abscisas de los puntos, y dos variables de tipo entero (Integer) para guardar las ordenadas de los puntos.

Una variable de tipo Real (Real) para guardar el cálculo de la distancia. De esta manera se tiene:

₁ procedure TForm1. CalcularDistanciaclic ( Sender : TObject ) ;
₂ var
₃ x1 , x2 : Integer;
₄ y1 , y2 : Integer;
₅ Distancia : Real;
₆ begin

7

₈ end

; Luego extraemos los valores numéricos de las cajas de texto, usando la función StrToInt():

₁ procedure TForm1. CalcularDistanciaclic ( Sender : TObject ) ;
₂ var
₃ x1 , x2 : Integer;
₄ y1 , y2 : Integer;
₅ Distancia : Real;
₆ begin
₇ { 1. Extraer los valores de las cajas }
₈ x1 := StrToInt ( Cx1.Text) ;
₉ x2 := StrToInt ( Cx2.Text) ;
₁₀ y1 := StrToInt ( Cy1.Text) ;
₁₁ y2 := StrToInt ( Cy2.Text) ;
₁₂ end;

Finalmente, calculamos la distancia y mostramos el resultado.

₁ procedure TForm1. CalcularDistanciaclic ( Sender : TObject ) ;
₂ var
₃ x1 , x2 : Integer;
₄ y1 , y2 : Integer;
₅ Distancia : Real;
₆ begin
₇ { 1. Extraer los valores de las cajas }
₈ x1 := StrToInt ( Cx1.Text) ;
₉ x2 := StrToInt ( Cx2.Text) ;
₁₀ y1 := StrToInt ( Cy1.Text) ;

₁₁

y2 := StrToInt ( Cy2.

Text

) ;

12

₁₃

{ 2. Calcular

₁₄

Distancia :=

15

la distancia }

sqrt ( power ( x1−x2 ,2)+ power ( y1−y2 , 2 ) ) ;

₁₆

{ 3. Mostrar e l resultado }

₁₇

Resultado . Caption := ’ Distancia : ’ +FloatToStr ( Distancia ) ;

₁₈ end

;

Para obtener algunas funciones matemáticas en nuestro programa utilizamos la librería math, esta se ingresa de la siguiente manera:

Figura 7.17: Inserción de la Librería de Matemáticas

En la sección de uses, agregamos math, tal y como se ve en la figura; Esto con el fin de usar la función power() para calcular los cuadrados de las diferencias de las abscisas y las ordenadas.

La función power funciona así:

Sea x = a

b

entonces el código seria:

x=power(a,b)

Donde el primer parámetro es la base y el segundo es el exponente.

Ejecución de la aplicación

+

Figura 7.18: Ejecución de la Aplicación para Calcular la Distancia entre Dos Puntos

7.4

Lotería

En programación, no todo son programas de cálculo, matrices, ni geometría, etc.

La motivación más grande para muchas personas en programación es hacer sus propios juegos. En este curso vamos a realizar un juego de lotería, muy sencillo, pero que puede motivarlos a seguir programando.

Lo primero que vamos a hacer, es realizar el diseño del juego de la lotería en un editor gráfico, se recomienda usar el InkScape o CorelDraw.

A continuación presentamos una imagen de cómo podría ser el diseño.

En la caja de texto superior, se ingresa el número que consideramos que es el ganador, y en la caja de texto inferior se mostrará el número de la lotería. La complejidad, se hará de una (1) cifra, de dos (2) cifras de tres (3) cifras y de cuatro (4).

Añadir imágenes en Lazarus

Creamos una nueva aplicación en Lazarus, y colocamos el tamaño del formulario de 400 por 300, es decir, modificando las propiedades Width := 400 y Height := 300.

Figura 7.19: Diseño del Formulario para el Juego de Lotería

Vamos a la pestaña Additional y seleccionamos el Componente TImage

, y creamos un rectángulo sobre el formulario.

Figura 7.20: Diseño del Formulario para el Juego de Lotería Le colocamos como nombre en la propiedad Name : ImagenFondo.

En la propiedad Align, colocamos alClient, para que la imagen quede ocupando todo el espacio del formulario.

No olvide que para ver estas propiedades la imagen debe estar seleccionada.

Con la imagen seleccionada, busque la propiedad Picture, pulse en el botón de los tres puntitos, y le saldrá la siguiente ventana:

Figura 7.21: Diseño del formulario para el juego de lotería

Pulsa el botón [Cargar] y busca la carpeta donde guardo la imagen, al cargar, la imagen aparecerá

Figura 7.22: Diseño del Formulario para el Juego de Lotería

Al pulsar el botón aceptar, la imagen quedará como fondo.

Figura 7.23: Diseño del Formulario para el Juego de Lotería

Después se crean las cajas de texto donde se verán los números de la lotería y el seleccionado por el usuario, cuyo nombre será númeroUsuario.

Figura 7.24: Diseño del Formulario para el Juego de Lotería

Luego se cambia la fuente de la caja para que cuadre con el ancho del TEdit.

Figura 7.25: Fuentes de la Caja de Texto.

Figura 7.26: Diseño del formulario para el juego de lotería.

Repetimos lo mismo para crear la caja de texto en la que se mostrara el número de la lotería generada por el programa, cuyo nombre sera númeroLoteria.

Figura 7.27: Diseño del Formulario para el Juego de Lotería.

Para terminar el diseño del formulario agregamos, el botón para generar los números aleatorios de la lotería.

Esto lo hacemos con otra imagen que llamaremos BotonGenerar.

Figura 7.28: Diseño del Formulario para el Juego de Lotería

Luego cargamos la imagen como se hizo con la de fondo.

Figura 7.29: Diseño del Formulario para el Juego de Lotería

Se re-escalan las líneas segmentadas, para que tome el tamaño de la imagen cargada.

Figura 7.30: Diseño del Formulario para el Juego de Lotería
Generar los números aleatorios Para generar los números aleatorios, hacemos doble clic en el botón o imagen Tirar Número que genera el procedimiento BotonGenerarClick.
₁ procedure TForm1. BotonGenerarclic ( Sender : TObject ) ;
₂ begin
3
₄ end;
En Lazarus, los números se generan mediante la función Random(). Así creamos una variable de tipo entero local sobre el proceso creado que llamaremos número.

₁ procedure TForm1. BotonGenerarclic ( Sender : TObject ) ;
₂ var
₃ número : Integer;
₄ begin

5

₆ end

;

Entonces usamos la función Random para generar los números aleatorios, quedando el código así:

₁ procedure TForm1. BotonGenerarclic ( Sender : TObject ) ;
₂ var
₃ número : Integer;
₄ begin
₅ { 1. Obtener Número}
₆ número:=round (Random( 1 0 ) ) ;

7

₈

{ 2. Mostrar e l resultado en la caja de t e x t o }

₉

númeroLoteria .

Text

:= IntToStr ( número ) ;

₁₀ end

;

Esto mostrará en la caja de texto de la lotería, un número aleatorio entre el cero (0) y el nueve (9).

Figura 7.31: Ejecución del Juego de lLotería

Ahora, falta comparar si el número que hemos ingresado es el mismo que generó la LOTERÍA.
₁ procedure TForm1. BotonGenerarclic ( Sender : TObject ) ; ₂ var
₃ número : Integer;
₄ begin
₅ { 1. Obtener Número}
₆ número:=round (Random( 1 0 ) ) ;

7

₈

{ 2. Mostrar e l resultado en la caja de t e x t o }

₉

númeroLoteria .

Text

:= IntToStr ( número ) ;

10

₁₁

{ 3. Tomamos e l número de la caja de t e x t o del usuario }

₁₂

NumApuesta := StrToInt ( númeroUsuario .

Text

) ;

13

₁₄ { 4. Hacemos la comparación }
₁₅ i f número = NumApuesta then
₁₆ begin
₁₇ { Si son iguales , entonces se acerto e l número}
₁₈ ShowMessage ( ’ Felicitaciones , has ganado ’ ) ;
₁₉ end
₂₀ else
₂₁ begin
₂₂ {De l o c o n t r a r i o mostramos o t r o mensaje }
₂₃ ShowMessage ( ’ Lo sentimos has perdido ’ ) ;
₂₄ end;
₂₅ end;

y ya tendremos nuestro juego terminado.

Otras cosas que se le pueden agregar, es un registro para contar los puntos cuando acierta la lotería y hacer más atractivo el diseño.

Un resultado podría ser el siguiente:

Figura 7.32: Ejecución del Juego de Lotería

7.5

Área bajo la curva

En cálculo integral, el área bajo la curva se calcula mediante la suma de rectángulos inscritos en la curva, haciendo cada vez más pequeña su base e incrementando el número de rectángulos.

Se pretende entonces, construir una alineación para calcular el área bajo la curva de alguna función, mediante la suma de las áreas de tales rectángulos.

Es muy importante saber cuáles son las variables que se necesitan para realizar tal cálculo y proceder al diseño del formulario en Lazarus.

Supongamos la función:

f (x) = −x

²

+ 4x − 2

Una parábola, cuyas características son las siguientes:

Completando cuadrados se tiene: y = − x²− 4x + 2 y = − x²− 4x + 4 − 2 y = − (x − 2)²− 2 y = − (x − 2)² + 2

y − 2 = − (x − 2)

²

Una parábola con vértice en (2, 2) que abre hacia abajo.

Si y = 0 entonces

−2 = − (x − 2)

2 2

=

²

(x − 2)

x − 2 =

±√

2

x = ±√2 + 2 Luego los cortes con el eje x son: x

₁

≈ 0,5857 y x

₂

≈ 3,4142.

El área bajo la curva está dado por

ˆ

3,4142

A = (−x

²

+ 4x − 2)dx

0,5857

o

A = l´ım

b − a

n

b − a

n
→∞

n

f a + k

k=1n

Diseño del formulario

Para el diseño del formulario, simplemente hacemos un formulario de tamaño 400 por 300, modificando las propiedades Width y Height en el inspector de propiedades. También podemos cambiar el nombre del formulario en la propiedad Name a FArea.

Figura 7.33: Diseño del Formulario Área Bajo la Curva

Para ver los resultados vamos a crear un Memo, para ello dirigimos a la pestaña de componentes Standard y seleccionamos el componente

y creamos un rectángulo sobre el formulario, generando así el Memo al que cambiamos su nombre en la propiedad Name por Salida.

Figura 7.34: Diseño del Formulario Área Bajo la Curva

Buscamos la propiedad Align y seleccionamos la opción alClient para que el Memo ocupe toda el área del formulario.

Figura 7.35: Diseño del Formulario Área Bajo la Curva

Luego, vamos a crear un menú, para ello buscamos en la pestaña de componentes de Standard, el componente TMainMenu

y lo creamos en el formulario.

Figura 7.36: Diseño del Formulario Área Bajo la Curva

Hacemos doble clic sobre el ícono que aparece para agregar las opciones.

Figura 7.37: Diseño del Formulario Área Bajo la Curva Seleccionamos el ítem que aparece, en el inspector de objetos en la propiedad Caption cambiamos la etiqueta y colocamos “Cálculo”, así mismo se puede hacer clic derecho sobre este ítem, el cual muestra otras opciones tal y como se aprecia en la figura anterior. Así se pueden insertar elementos, antes o después del ítem seleccionado y crear submenús. En este caso, vamos a crear un submenú que diga Función I, para calcular el área bajo la curva de una función I.

Figura 7.38: Diseño del Formulario Área Bajo la Curva
Figura 7.39: Diseño del Formulario Área Bajo la Curva
Cuando ya se tenga listo el diseño del menú, hacemos doble clic sobre el ítem Función I, y se generará en el código fuente un procedimiento:
₁ procedure TFArea . MenuItem3clic ( Sender : TObject ) ;
₂ begin
3
₄ end;
Éste lo usaremos para realizar los cálculos del área y mostrarlos en el panel de salida.

En este procedimiento crearemos algunas variables como las siguientes:

10

₁ procedure TFArea . MenuItem3clic ( Sender : TObject ) ;
₂ var
₃ a , b : Real;
₄ n : Integer;
₅ dx : Real;
₆ Area : Real;
₇ x : Integer;
₈ begin

9

end

;

Variables que se usarán en el cálculo del área bajo la curva.

Luego dentro del procedimiento y después de declarar las variables, vamos a implementar la integral de Rieman para calcular el área.

₁ procedure TFArea . MenuItem3clic ( Sender : TObject ) ;
₂ var
₃ a , b : Real;
₄ n : Integer;
₅ dx : Real;
₆ Area : Real;
₇ x : Integer;
₈ begin

₉

{ 1. D e f i n i r los valores de los l í m i t e s de integración }

₁₀

a := 0.585786;

₁₁

b := 3.414213;

12

₁₃

{ 2. Número de p art ici one s }

₁₄

n := 10;

15

₁₆

{ 3. Cálculo del d i f e r e n c i a l }

₁₇

dx := ( b−a)/n;

18

₁₉ { 4. Cálculo del área }
₂₀ Area := 0;
₂₁ end;

₁ var
¿Como crear una función?.
Vamos a la parte inicial del código fuente, donde aparecen las siguientes líneas:

₂

FArea : TFArea ;

3

₄

implementation

₅

. . .

Antes de la sección Var, debemos agregar la función y se hace de la siguiente manera:

₁ function

f ( x :

real

) :

real

;

2

₃ var

₄

FArea : TFArea ;

5

₆

implementation

₇

. . .

Lo que quiere decir que es una función f que toma como parámetro un valor x de tipo Real y devuelve un número Real.

Luego, debemos decirle a Lazarus cómo se implementa esta función.

Debajo de donde se creó nuestro proceso:

procedure TFArea.MenuItem3clic(Sender: TObject);

Sobre el cual estamos calculando el área, bajo la curva vamos a escribir el código de la función, quedando así:

₁ procedure TFArea . MenuItem3clic ( Sender : TObject ) ;
₂ var
₃ a , b : Real;

₄ n : Integer;
₅ dx : Real;
₆ Area : Real;
₇ x : Integer;
₈ begin

₉

{ 1. D e f i n i r los valores de los l í m i t e s de integración }

₁₀

a := 0.585786;

₁₁

b := 3.414213;

12

₁₃

{ 2. Número de p art ici one s }

₁₄

n := 10;

15

₁₆

{ 3. Cálculo del d i f e r e n c i a l }

₁₇

dx := ( b−a)/n;

18

₁₉ { 4. Cálculo del área }
₂₀ Area := 0;
₂₁ end;

22

₂₃ { Función de parábola }
₂₄ function f ( x : Real) : Real;
₂₅ begin

26

₂₇ end

;

le colocamos un Begin y un End, para escribir allí dentro la función que quedara así:

₁ function f ( x : Integer) : Real;
₂ begin
³ f :=−1*x*x+4*x−2;
₄ end;

Es la función que tenemos: y = −x

²

+ 4x − 2

Luego será muy fácil aplicar la definición de las sumas de Rieman, completando el código.
₁ procedure TFArea . MenuItem3clic ( Sender : TObject ) ; ₂ var
₃ a , b : Real; ₄ n : Integer; ₅ dx : Real; ₆ Area : Real; ₇ x : Integer; ₈ begin

₉

{ 1. D e f i n i r los valores de los l í m i t e s de integración }

₁₀

a := 0.585786;

₁₁

b := 3.414213;

12

₁₃

{ 2. Número de p art ici one s }

₁₄

n := 10;

15

₁₆

{ 3. Cálculo del d i f e r e n c i a l }

₁₇

dx := ( b−a)/n;

18

₁₉ { 4. Cálculo del área }
₂₀ Area := 0;
₂₁ for k := 1 to n do
₂₂ begin

²³

Area := Area + f ( a + k * dx ) ;

₂₄end

;

25

₂₆

Area := dx * Area ;

27

₂₈ { 5. Mostrar e l resultado }
₂₉ Salida . Lines . Clear ;
₃₀ Salida . Lines .Add ( ’ Área : ’ + FloatToStr ( Area ) ) ;
₃₁ end;

El algoritmo, consta de cinco (5) pasos: 1. Se definen los límites de integración, los cuales fueron calculados buscando los cortes con el eje x.

2. Se define el número de particiones n = 10.

b − a3. Se hace el cálculo del diferencial x =n
4. Se inicializa el área en cero (0), y mediante un ciclo de uno (1) hasta el valor de n, que es 10, se calcula el valor de la función con los valores que toma k multiplicados por el diferencial, más el valor inicial que sería a. Cuando termina el ciclo se multiplica el área por el Diferencial, que corresponde a la medida de las bases de los rectángulos.

5. Y finalmente se muestre en el Memo de salida, el resultado del área.

Veamos la ejecución del programa:

Figura 7.40: Ejecución del Programa Área Bajo la Curva

Nótese que el valor que hemos encontrado no es el más aproximado, pero todo depende del número de particiones que se definan en n.

Cambiemos ahora el valor de n en el paso dos a 100, y veamos cómo se aproxima más el valor del área.

Figura 7.41: Ejecución del Programa Área Bajo la Curva

Conclusión: entre más grande sea el valor de n más aproximado sera el cálculo del área bajo de la curva.

7.6

Máquina tragamonedas

Una máquina tragamonedas, como muchos la conocen, es en la que ingresamos una moneda y al halar la palanca hace una combinación de imágenes, al caer cierta combinación de imágenes se gana un premio.

Se desea crear un prototipo de máquina tragamonedas con una combinación de seis (6) imágenes por cada rodillo.

Se debe diseñar una imagen de máquina tragamonedas, que servira de fondo en el formulario tal como se muestra en la siguiente figura.

Figura 7.42: Fondo para la Aplicación

Esta imagen se pondrá como fondo en el formulario.

Diseño del formulario

Modificamos el tamaño del formulario a 400 px por 300 px, agregamos un TImage

y colocamos su propiedad Align en la opción alClient para que tome el tamaño

de toda la ventana. Agregamos un TEdit

para mostrar los créditos que ha ganado. Un TImage

pequeño para poner el botón de lanzar.

Figura 7.43: Diseño del Formulario para el Juego de Tragamonedas.

Figura 7.44: Diseño del formulario para el juego de tragamonedas

Efectos del botón

Para dar un efecto especial al botón, seleccionamos la imagen que hará las veces de botón, buscamos en el inspector de propiedades y seleccionamos la pestaña de eventos. Aquí, debemos buscar los eventos OnMouseEnter (cuando el mouse entra a la imagen) y OnMouseLeave (cuando el mouse sale de la imagen). Se busca entonces que, cuando el mouse entre a la imagen, esta cargue una imagen de un tipo botón; la restaure o la deje vacía y así lograremos el efecto de animación.

Figura 7.45: Programando Eventos OnMouseEnter y OnMouseLeave

Esto generara dos códigos:

₁ {Cuando e l mouse entra a la imgen del botón }
₂ procedure TForm1. BotonLanzarMouseEnter ( Sender :
₃ begin

4

₅ end

;

6

₇ {Cuando la imagen sale de la imagen del botón }
₈ procedure TForm1. BotonLanzarMouseLeave ( Sender :
₉ begin

10

₁₁ end

;

TObject ) ;

TObject ) ;

Cuando el mouse entra a la imagen cargamos la imagen de botón desde el disco duro así:
Esto quiere decir, que la imagen que se llama BotonLanzar, en la propiedad Picture, leeremos desde un documento (LoadFromFile) y la imagen se encuentra guardada en una carpeta llamada Imágenes y el archivo de imagen se llama botón_lanzar.png.

₁ {Cuando e l mouse entra a la imgen del botón }
₂ procedure TForm1. BotonLanzarMouseEnter ( Sender : TObject ) ;
₃ begin
₄ BotonLanzar . Picture . LoadFromFile ( ’ Imagenes\botón_lanzar . png ’ ) ;
₅ end;

Ahora cuando el mouse sale de la imagen, hacemos lo siguiente:

₁ {Cuando la imagen sale de la imagen del botón }
₂ procedure TForm1. BotonLanzarMouseLeave ( Sender : TObject ) ;
₃ begin
₄ BotonLanzar . Picture . Clear ;
₅ end;

Es decir que, al botón se le borrará la imagen que hemos cargado. Esto es lo que genera el efecto.

Figura 7.46: Efecto del Botón

Diseño de las imágenes de los rodillos

Vamos a generar seis (6) imágenes de 60 pixeles por 110 pixeles, con los motivos que más le llamen la atención.

Figura 7.47: Diseño de las Fichas de los Rodillos.

Ahora creamos tres (3) TImage

que pondremos en las siguientes posiciones:

Figura 7.48: Diseño del Formulario para el Juego de Tragamonedas

A estas las llamamos FichaI, FichaII y FichaIII, respectivamente.

Generación de fichas aleatorias

Tal como se vio en el ejemplo de la lotería, vamos a crear números aleatorios, para ello hacemos doble clic sobre la imagen de lanzar, para generar el proceso Onclick.

₁ { Lanzar Fichas }
₂ procedure TForm1. BotonLanzarclic ( Sender : TObject ) ;
₃ begin

4

₅ end

;

Vamos a crear tres (3) variables de tipo entero, para guardar el número del tipo de ficha.

₁ { Lanzar Fichas }
₂ procedure TForm1. BotonLanzarclic ( Sender : TObject ) ;
₃ var
₄ num1,num2,num3 : Integer;
₅ begin

6

₇ end;

Mediante la función Random()¹ generamos números aleatorios. Junto a esta función viene un proceso que se llama Randomize, que cambia la base de los números aleatorios y siempre serán diferentes.

El rango para generar los números aleatorios es desde 1 hasta 6, para lo cual usamos la función así:

num1 := round(random(6))+1;

El argumento de la función random es la amplitud del intervalo, dado que el cero (0) está dentro del intervalo, y el valor de la amplitud no está contenida, se le suma una unidad más. Este resultado debe redondearse mediante la función Round, dado que la variable que recoge el dato es del tipo Entero, y la función Random genera números reales. Tendremos ahora:

₁ { Lanzar Fichas }
₂ procedure TForm1. BotonLanzarclic ( Sender : TObject ) ;
₃ var
₄ num1,num2,num3 : Integer;
₅ begin
₆ Randomize ;
₇ num1 := round (Random( 6 ) ) + 1 ;
₈ num2 := round (Random( 6 ) ) + 1 ;
₉ num3 := round (Random( 6 ) ) + 1 ;
₁₀ end;

Ahora procedemos a llamar las imágenes según halla caído num1,num2 y num3, así hacemos:

₁ { Cargar las imágenes }
₂ FichaI . Picture . LoadFromFile ( ’ Imagenes\Ficha ’ +
₃ IntToStr (num1)+ ’ . png ’ ) ;

4

₅

FichaII . Picture . LoadFromFile ( ’ Imagenes\Ficha ’ +} IntToStr (num2)+ ’ . png ’ ) ;

6

₇ F i c h a I I I . Picture . LoadFromFile ( ’ Imagenes\Ficha ’ +
₈ IntToStr (num3)+ ’ . png ’ ) ;
Utilizamos la función IntToStr() para cambiar los números enteros al texto. Luego, como los archivos de las imágenes se llaman Ficha1.png, ..., Ficha6.png, la imagen es cargada según cayeron los números.

¹En Lazarus la función Random(), genera números aleatorios en el intervalo cero (0) a uno (1), sin incluir al uno (1).
Figura 7.49: Ejecución de el Juego de Tragamonedas
Los puntos Para dar los puntos hay que hacer la evaluación si los números num1,num2 y num3 son iguales, así:

₁ { Lanzar Fichas }
₂ procedure TForm1. BotonLanzarclic ( Sender : TObject ) ;
₃ var
₄ num1,num2,num3 : Integer;
₅ begin
₆ Randomize ;
₇ num1 := round (Random( 6 ) ) + 1 ;
₈ num2 := round (Random( 6 ) ) + 1 ;
₉ num3 := round (Random( 6 ) ) + 1 ;

10

₁₁ { Cargar las imágenes }
₁₂ with FichaI . Picture do
₁₃ begin
₁₄ LoadFromFile ( ’ Imagenes\Ficha ’ + IntToStr (num1) + ’ . png ’ ) ;
₁₅ LoadFromFile ( ’ Imagenes\Ficha ’ + IntToStr (num2) + ’ . png ’ ) ;
₁₆ LoadFromFile ( ’ Imagenes\Ficha ’ + IntToStr (num3) + ’ . png ’ ) ;

₁₇end

;

18

₁₉ { comprobación para dar los puntos }
₂₀ i f (num1=num2) and (num2=num3) then
₂₁ begin
₂₂ ShowMessage ( ’ Felicitaciones , has ganado 1000 puntos ’ ) ;
₂₃ Puntos += 1000;

24

₂₅ { Mostrar en la caja de c r é d i t o s }
₂₆ Creditos .Text := IntToStr ( Puntos ) ;
₂₇ end;
₂₈ end;

Se ha hecho la evaluación, si el número uno (1) es igual al número dos (2) y éste es igual al número tres (3), usando transitividad, entonces el número uno es igual al número tres, así gana el jugador al cual se le suman mil puntos en la variable puntos.

La variable puntos debe ser declarada globalmente porque va a ser utilizada constantemente. Cuando se asignan los puntos, se muestran en la caja de texto de los créditos ganados. En este caso, se ha ganado con naranjas.

Figura 7.50: Ejecución de el Juego de Tragamonedas.

7.7

Divisores de un número

En este ejemplo, vamos a encontrar los divisores de un número dado por el usuario.

Recuerde que los divisores de un número son todos aquellos que empiezan en uno y van hasta el número dado, de tal forma que, el producto de sus partes simétricas es igual a un número.

De esta forma vamos a construir una aplicación para calcular los divisores de un número.

Diseño del formulario

Para el formulario, necesitamos, una caja de texto para ingresar un número, un botón para hacer el cálculo y un Memo para mostrar los divisores. Adicionalmente ponemos un menú para familizarizar al lector con esta mecánica.

Abrimos Lazarus y sobre el formulario que aparece, agregamos un TLabelEdit

que se encuentra en la pestaña de componente de Additional y le colocamos

como nombre Name := Numero, agregamos un botón

que se encuentra en la pestaña de componentes standard y le colocamos como nombre Name := Calcular. Agregamos un Memo

que se encuentra en la pestaña de componentes

Standard y le colocamos como nombre Name := Resultado, colocamos su propiedad Align en la opción alBotton para que quede alineado a la parte inferior del formulario y activamos el Scroll vertical colocando la opción ScrollBars en True.

Así obtenemos algo como lo siguiente:

Figura 7.51: Diseño del Formulario para Calcular los Divisores de un Número

Otras opciones son: agregar color al formulario, a la caja de texto una imagen de fondo, entre otras cosas, para que la aplicación quede más llamativa.

En esta ocasión vamos a agregar una información de ayuda y los créditos del programa de la siguiente manera:

En la pestaña de componentes Standard, agregamos el componente TMainMenu,

al cual le colocamos como nombre MenuPrincipal, damos doble clic después de
estar creado sobre el formulario y agregamos las siguientes opciones:

Figura 7.52: Diseño del Formulario para Calcular los Divisores de un Número

Creamos un submenú, y le colocamos en la propiedad Caption Ayuda.

Figura 7.53: Diseño del formulario para calcular los divisores de un número

Creamos un elemento después de Ayuda.

Figura 7.54: Diseño del formulario para calcular los divisores de un número.

Seguidamente, le colocamos en la propiedad Caption Autor.

Figura 7.55: Diseño del Formulario para Calcular los Divisores de un Número.

Al primer ítem le cambiamos la propiedad Caption y le colocamos Información.

Figura 7.56: Diseño del Formulario para Calcular los Divisores de un Número.

Y así quedará nuestra aplicación.

Abriendo el menú como se ve en la figura anterior, presionamos clic sobre el menú Ayuda, y aparecerá el siguiente código:

₁ procedure

TForm1. MenuItem2clic ( Sender : TObject ) ;

₂ begin

3

₄ end

;

Dentro del cual vamos a colocar la información de ayuda.

La información de ayuda, la vamos a colocar en un mensaje flotante, al cual soló debemos agregar un texto y se verá de la siguiente forma:

₁ procedure TForm1. MenuItem2clic ( Sender : TObject ) ;
₂ begin
₃ ShowMessage ( ’ Ingrese un número para calcular sus divisores ’ ) ;
₄ end;

y en el Autor hacemos lo mismo:
₁ procedure TForm1. MenuItem2clic ( Sender : TObject ) ;
₂ begin
₃ ShowMessage ( ’ Programa hecho por Julián ’ ) ;
₄ end;

Esto le dará más vida al programa y se verá cada vez, como una aplicación más profesional.

Divisores de un número

En programación existen la división con resto denotada como mod, valiéndonos de esta herramienta, podemos hacer la operación de modulo y preguntar si el residuo es cero (0), así determinamos que el número por el cual dividimos es un divisor del número dado.

Haciendo un ciclo que recorra desde uno (1) hasta el número dado de uno en uno validando si éste es divisor, obtendremos los divisores.

Los ciclos en Lazarus se definen así:

₁ for i :=a to b do
₂ begin
₃ { Código a ejecutar }
₄ end;

Donde i es un contador que toma los valores desde el límite inferior a hasta el límite superior b.

En nuestro caso vamos a realizar lo siguiente:

Hacemos doble clic al botón calcular, para generar el procedimiento en nuestro código, también agregamos dos variables de tipo entero. El contador i, y la variable donde almecenamos el valor de la caja de texto.

₁ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₂ var
₃ i : integer;

₄

n :

Integer

;

₅ begin

6

₇ end

;

Hacemos un ciclo desde uno hasta el valor del número que se haya ingresado en la caja de texto y hacemos la operación del módulo.

₁ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₂ var
₃ i : integer;
₄ n : Integer;
₅ begin
₆ { 1. Tomar e l valor de la caja de t e x t o }
₇ n := StrToInt ( número.Text) ;

8

₉ { 2. Hacer e l c i c l o }
₁₀ for i := 1 to n do
₁₁ begin
₁₂ { 2.1 Hacemos la pregunta }
₁₃ i f ( n mod i = 0) then
₁₄ begin
₁₅ { 2.1.1 Mostrar e l resultado en e l Memo}

Resultado . Lines .Add ( IntToStr ( i ) ) ;
₁₆ end;
₁₇ end;
₁₈ end;

Hacemos una prueba corta:

Supongamos el número 10 luego el ciclo se hace desde 1 hasta 10.

Cuando i toma el valor 1 hacemos el residuo de dividir 10 entre 1 es cero, por lo tanto 1 es divisor de 10.

Cuando i toma el valor 2 hacemos el residuo de dividir 10 entre 2 es cero, por lo tanto 2 es divisor de 10.

Cuando i toma el valor 3 hacemos el residuo de dividir 10 entre 3 es diferente de cero, por lo tanto 3 no es divisor de 10.
Cuando i toma el valor 4 hacemos el residuo de dividir 10 entre 4 es diferente de cero, por lo tanto 4 no es divisor de 10.

Cuando i toma el valor 5 hacemos el residuo de dividir 10 entre 5 es cero, por lo tanto 5 es divisor de 10.

Así sucesivamente hasta 10.

Cuando i toma el valor 10 hacemos el residuo de dividir 10 entre 10 es cero, por lo tanto 10 es divisor de 10.

Ahora el programa está listo.

Figura 7.57: Diseño del Formulario para Calcular los Divisores de un Número. Como se puede observar da justo lo que propusimos en el ejemplo.

7.8

Los primeros n números primos

En esta guía vamos a desarrollar una aplicación para generar los primeros n números primos.
Los números primos son aquellos que sólo se pueden dividir por la unidad y por si mismos. Dentro de esta lista tenemos los siguientes: 1, 3, 5, 7, 11, . . . , los cuales trataremos de generar por medio de la siguiente aplicación.

Diseño de formulario

El formulario, consta de una caja de texto TLabelEdit

, a la cual le asignamos el nombre números, para ingresar cuantos primos queremos generar.

Figura 7.58: Diseño del formulario para generar los primeros n números primos

Un TButton

para generar los números primos al cual llamaremos Generar.

Figura 7.59: Diseño del Formulario para Generar los Primeros n Números Primos Un TMemo

que llamaremos Resultado para mostrar la lista de números.

Figura 7.60: Diseño del formulario para generar los primeros n números primos

A este Memo le damos en la propiedad Align la opción alBotton para que se alinee a la parte inferior del formulario, y colocamos la propiedad ScrollBars en la opción ssAutoVertical, para que se automodifique según se ingrese él texto.

Finalmente, vamos a agregar un nuevo componente TProgressBar

, que llamaremos Progreso, para visualizar cómo avanza la generación de números.

Figura 7.61: Diseño del Formulario para Generar los Primeros n Números Primos

Desarrollo del algoritmo

Como se vio en el ejercicio anterior de los divisores de un número, éste tiene un divisor, si al calcular el residuo de la división entre el número dado y su supuesto divisor obtenemos cero.

Esto se hacía mediante la operación mod, que devuelve el residuo de la división. Apoyándonos en el código anterior, tenemos lo siguiente:

1

₂ for i := 1 to n do
₃ begin
₄ { 2.1 Hacemos la pregunta }
₅ i f ( n mod i = 0) then
₆ begin
₇ { 2.1.1 Mostrar e l resultado en e l Memo}
₈ Resultado . Lines .Add ( IntToStr ( i ) ) ;
₉ end;
₁₀ end;

Aunque ya no necesitamos mostrar los divisores de un número podemos usar un contador para determinar cuántos divisores tiene un número, y si llegamos a que sólo tiene dos (2), es porque el número es un número primo.

Veamos el código, recuerde dar doble clic al botón generar para crear el proceso dé clic en el que se debe escribir el siguiente código.

₁ procedure TForm1. Generarclic ( Sender : TObject ) ;
₂ var
₃ i , j : integer;
₄ n: integer;
₅ contDiv : integer;
₆ Entero : Integer;
₇ begin
₈ {Tomamos e l número de la caja de t e x t o }
₉ n := StrToInt ( números .Text) ;

10

₁₁ {Hacemos un c i c l o condicional } ₁₂ j := 0;

₁₃

Entero := 0;

14

₁₅ while j <= n do
₁₆ begin
₁₇ Entero += 1;
₁₈ contDiv :=0;

19

₂₀ for i := 1 to Entero do
₂₁ begin
₂₂ {Hacemos la pregunta }
₂₃ i f ( Entero mod i = 0) then
₂₄ begin
₂₅ {Aumentamos en uno e l contador de divisores } contDiv += 1;
₂₆ end;
₂₇ end;

28

₂₉ { s i e l contador de divisores es igual a dos entonces e l número es primo }
₃₀ i f contDiv = 2 then
₃₁ begin
₃₂ j += 1;
₃₃ Resultado . Lines .Add ( IntToStr ( Entero ) ) ; end;
₃₄ end;
₃₅ end;

Cuando presionamos el botón, lo que se hace es tomar el valor de la caja de texto en la variable n y luego usar un ciclo condicional.

Recordemos que un ciclo condicional es la combinación de una pregunta y un ciclo repetitivo, en este caso al principio pregunta que si j menor o igual que n, es decir el número que hemos ingresado para generar los números entonces este ejecutará el código de lo contrario finalizará el ciclo.

Cuando ejecuta el código, aumentamos de valor la variable Enteros, que ira tomando los valores de los números enteros, y luego usa el algoritmo para calcular los divisores de un número contando el número de divisores en la variable contDiv, es decir, que cuenta cuantos divisores tiene un número más no muestra los resultados por pantalla.
Esto con el fin de preguntar, si el número de divisores de entero es dos (2) entonces Entero es un número primo, ante lo cual aumentamos el valor de j que está contando los números primos encontrados, hasta llegar al valor de n y posteriormente mostramos el número primo en pantalla sobre, el Memo al cual llamamos resultados.

Para dar más uso a otros componentes, vamos a poner en juego la barra de progreso, la cual incrementara de valor cada vez que un número sea encontrado, es decir, conforme aumenta j, la barra también aumenta de valor.

Luego, tal y como funcionan los deslizadores esta barra de progreso tiene un elemento mínimo y un elemento máximo, y es en el elemento máximo donde introduciremos el valor de n, y se irá modificando su posición (Position) al tiempo que cambia j.

₁ procedure TForm1. Generarclic ( Sender : TObject ) ;
₂ var
₃ i , j : integer;
₄ n: integer;
₅ contDiv : integer;
₆ Entero : Integer;
₇ begin
₈ {Tomamos e l número de la caja de t e x t o }
₉ n := StrToInt ( números .Text) ;

10

₁₁

{ Dar un tamaño a la barra de progreso }

₁₂

Progreso .Max:=n;

13

₁₄ {Hacemos un c i c l o condicional }
₁₅ j := 0;
₁₆ Entero := 0;

17

₁₈ while j <= n do
₁₉ begin
₂₀ Entero += 1;
₂₁ contDiv :=0;

22

₂₃ for i := 1 to Entero do

₂₄ begin
₂₅ {Hacemos la pregunta }
₂₆ i f ( Entero mod i = 0) then
₂₇ begin
₂₈ {Aumentamos en uno e l contador de divisores } contDiv += 1;
₂₉ end;
₃₀ end;

31

₃₂ { s i e l contador de divisores es igual a dos entonces e l número es primo }
₃₃ i f contDiv = 2 then
₃₄ begin
₃₅ j += 1;
₃₆ Resultado . Lines .Add ( IntToStr ( Entero ) ) ;

37

₃₈ { Cambiar la posición de la barra de progreso }
₃₉ Progreso . Position := j ;
₄₀ end;
₄₁ end;
₄₂ end;

Con lo cual obtendremos:

Figura 7.62: Ejecución de la Aplicación para Generar los Primeros n Números Primos.

Lógicamente, al ingresar tres (3) números primos se ejecutarán muy rápido, pero al tratar de generar 1000 se demorará mucho más.

Figura 7.63: Ejecución de la Aplicación para Generar los Primeros n Números Primos.

Área de un triángulo dados tres vértices en el plano cartesiano

En geometría analítica, para calcular el área de un triángulo, se hace un poco más complejo, puesto que no se dan directamente las medidas de longitud de los lados del triángulo y cambio sí se dan sus vértices.

Existen variados algoritmos para calcular su área:

El método de Herón

Se calcula la distancia entre los puntos dados, a, b, c respectivamente a cada lado, se halla un semiperímetro s y se utiliza la siguiente fórmula:

A = s (s − a) (s − b) (s − c)

Ejemplo: sea el triángulo:

Figura 7.64: Triángulo, Dados Tres Puntos en el Plano Cartesiano.

Hallamos la distancia entre cada par de puntos:

a = (−2 − 5)

²

+ (2 − 5)

²

=

√

(−7)

²

+ (−3)

²

=

√

49 + 9

= 58

b = (5 − 4)

²

+ (5 + 3)

²

=

√

(1)

²

+ (8)

²

=

√

1 + 64

= 65

c = (4 + 2)

²

+ (−3 − 2)

²

=

√

36 + 25 =

√
(6)² + (−5)² =
61
Luego, hallamos el semiperímetro:

√

58 +

√

65 +

√

s =

⁶¹

≈ 11,74

₃

y finalmente usamos la fórmula para calcular el área:

A = 11,74 11,74 −√58 11,74 −√65 11,74 −√61 = 26,5

El área del triángulo es de 26,5 u

²

El método de los determinantes

En el método de los determinantes,se acomoda los puntos en una matriz de tamaño tres por tres de la siguiente manera:

Sean A (x

₁

, y

₁

), B (x

₂

, y

₂

) y C (x

₃

, y

₃

) se tiene entonces:

A

= 1

x₁ y₁ 1
x₂ y₂ 1
² x₃ y₃ 1

Resolviendo el determinante, se tiene que:

A = 1|x

₁

y

₂

+ x

₂

y

₃

+ y

₁

x

₃

− x

₁

y

₃

− y

₁

x

₂

− y

₂

x

₃

|

2

Ahora el área del triángulo del ejemplo anterior es:

A =

¹

|(−2 · 5) + (5 · −3) + (2 · 4) − (−2 · −3) − (2 · 5) − (5 · 4)|

₂

=

¹

|−10 − 15 + 8 − 6 − 10 − 20|

₂

=

¹

|−53|

₂

= 26,5

Diseño del formulario

Necesitamos un formulario que contenga seis TLabelEdit

, cuyos nombres serán Ax,Ay,Bx,By,Cx y Cy . Un TButton

para realizar el proceso de cálculo, cuyo nombre ser’a Calcular un TMemo

, para mostrar el resultado al cual le llamaremos Resultado.

Figura 7.65: Diseño del Formulario para Calcular el Área de un Triángulo Dados sus Tres Vértices en el Plano Cartesiano

Restricción de valores

En los ejemplos anteriores, siempre se presentará el problema que ingresamos letras y el programa no funcionara, debido a que la función StrToInt(), no convierte caracteres a números enteros.

Para dar solución a este problema, seleccionamos una de las cajas de texto, cualquiera que sea, vamos al inspector de objetos y seleccionamos la pestaña de eventos.

Figura 7.66: Inspector de Objetos sobre el Evento OnKeyPress

Allí buscamos el evento OnKeyPress y damos clic al botón que contiene los tres puntos, el cual generara el siguiente código:

₁ procedure

TForm1. AxKeyPress ( Sender : TObject ;

var

Key :

char

) ;

₂ begin

3

₄ end

;

Es aquí donde vamos a restringir el teclado o las teclas que se pueden presionar, en este caso sólo para números enteros, así la entrada serán los números del uno (1) al nueve (9) y el signo menos. Así obtendremos lo siguiente.

Si la tecla presionada no esta dentro del conjunto [0.,9] y el signo− entonces anule la tecla.

Fíjese en la estructura en negrita que se convertirá en:

₁ procedure TForm1. AxKeyPress ( Sender : TObject ; var Key : char) ;
₂ begin
₃ i f not ( key in [ ’ 0 ’ . . ’ 9 ’ , ’−’ , # 8 ] ) then Key:=#0;
₄ end;

Luego debemos asociar este mismo evento a las otras cinco (5) cajas de texto de la siguiente manera:

Seleccionamos las otras cinco (5) cajas de texto o una por una y en la pestaña de eventos, buscamos el evento OnKeyPress y le damos la Opción AKeyPress en este caso.

Figura 7.67: Inspector de Objetos sobre el Evento OnKeyPress

Así, todas las cajas de texto quedarán restringidas al ingreso de sólo números enteros.

Función para calcular la distancia

Puesto que dentro del primer método para calcular el área de un triángulo dados sus vértices debemos hallar la distancia entre dos puntos, tendríamos que calcularla tres (3) veces. En programación, se hace necesario usar funciones que disminuyen el uso de código.

Una función, es un proceso que se puede llamar tantas veces como sea necesario y que realizará las tareas que se requieren en el programa, sin importar los datos. En nuestro código, vamos a la sección de variables locales y antes de las variables podremos declarar nuestras funciones, así:

Figura 7.68: Definición de una función

Tenga en cuenta que aquí sólo se está definiendo la función, luego hay que implementar su código.

Para implementar la función, buscamos la sección Implementation y copiamos de nuevo:

₁

{ función para hallar la distancia entre dos puntos }

₂ function

DistanciaPP ( x1 , y1 , x2 , y2 :

Integer

) :

Real

;

Pero ahora agregamos un begin y un end:

₁ { función para hallar la distancia entre dos puntos }
₂ function DistanciaPP ( x1 , y1 , x2 , y2 : Integer) : Real;
₃ begin

4

₅ end

;

La distancia entre dos (2) puntos A (x₁, y₁) y B (x₂, y₂), está definida como la raíz cuadrada de la suma de los cuadrados, de las diferencias de las abscisas y de las ordenadas. En otras palabras:

d |AB| = (x

₁

− x

₂

)

²

+ (y

₁

− y

₂

)

²

El cual implementaremos en la función así:

₁ { función para hallar la distancia entre dos puntos }
₂ function DistanciaPP ( x1 , y1 , x2 , y2 : Integer) : Real;
₃ begin
₄ Result := sqrt ( power ( x1−x2 ,2)+ power ( y1−y2 , 2 ) ) ;
₅ end;

donde la variable Result, es propia de las funciones en Lazarus y guarda el valor que deberá devolver la función.

También para utilizar las funciones sqrt() y power(), debemos llamar a la librería math en la sección de uses.

En cuanto a la función, se coloca su nombre DistanciaPP en simplificación de DistanciaPuntoPunto, en general, se trata de usar nombres cortos pero significativos, los parámetros que hemos definido, son las abscisas y las ordenadas de tipo entero, los cuales se deben introducir entre paréntesis. Finalmente, se define cuál será el tipo de valor que saldrá usando los dos puntos y el tipo de variables, en este caso Real.

¿Comó usar la función? .
Cuando presionamos doble clic sobre el botón calcular, suponemos que debemos realizar los cálculos para encontrar el área del triángulo. Ya estamos en condiciones de empezar a valida lo que el usuario está ingresando en las cajas de texto o si por el contrario no ingresa nada, veamos:

₁ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₂ var
₃ a , b , c : Real;
₄ Area : Real;
₅ S : Real;
₆ begin

7

₈ end

;

Primero definimos tres (3) variables a, b y c para guardar la longitud de cada uno de los lados del triángulo. La variable Area que almacenará el valor encontrado del área del triángulo y la variable S que contendrá el valor del semiperímetro. Para validar los datos, hacemos lo siguiente:

if () and () and () and () and () and () then begin
end;

Se expresa de esta manera, porque son seis (6) cajas de texto, lo que significa que todas deben contener números para realizar el cálculo, y es por tal razón que se utiliza el conector lógico∧, que en programación es and.

Las condiciones de cada paréntesis será determinar si cada caja de texto tiene texto es decir:

if (Ax.Text <> ”) and (Ay.Text <> ”) and (Bx.Text <> ”)

and (By.Text <> ”) and (Cx.Text <> ”) and (Cy.Text <> ”) then begin

end;

Si se determina que es verdadero, procedemos a tomar los datos, para lo cual definimos otras variables:
₁₇ y3 := StrToInt ( Cy.Text) ; ₁₈ end;
₁₉ end;

₁ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₂ var
₃ a , b , c : Real;
₄ Area : Real;
₅ S : Real;
₆ x1 , y1 , x2 , y2 , x3 , y3 : integer;
₇ begin
₈ i f ( Ax .Text <> ’ ’ ) and ( Ay .Text <> ’ ’ )
₉ and ( Bx.Text <> ’ ’ ) and ( By.Text <> ’ ’ ) ₁₀ and ( Cx.Text <> ’ ’ ) and ( Cy.Text <> ’ ’ ) then ₁₁ begin
₁₂ x1 := StrToInt ( Ax .Text) ;
₁₃ y1 := StrToInt ( Ay .Text) ;
₁₄ x2 := StrToInt ( Bx.Text) ;
₁₅ y2 := StrToInt ( By.Text) ;
₁₆ x3 := StrToInt ( Cx.Text) ;

Para tomar los valores de cada caja de texto y proceder a usar la función DistanciaPP.

Luego, en las variables a,b,c guardamos la distancia entre dos puntos:

{Calcular la distancia de cada punto} a := DistanciaPP(x1,y1,x2,y2); b := DistanciaPP(x1,y1,x3,y3); c := DistanciaPP(x2,y2,x3,y3);

Hallamos el semiperímetro:

{calcular el semiperímetro} S := (a+b+c)/2;

Hallamos el área:

{Calcular el área}

Area := sqrt(S*(S-a)*(S-b)*(S-c));

Luego, en el proceso de clic del botón, quedara así: ₁₅ y2 := StrToInt ( By.Text) ;
₁₆ x3 := StrToInt ( Cx.Text) ;
₁₇ y3 := StrToInt ( Cy.Text) ;

₁ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₂ var
₃ a , b , c : Real;
₄ Area : Real;
₅ S : Real;
₆ x1 , y1 , x2 , y2 , x3 , y3 : integer;
₇ begin
₈ i f ( Ax .Text <> ’ ’ ) and ( Ay .Text <> ’ ’ )
₉ and ( Bx.Text <> ’ ’ ) and ( By.Text <> ’ ’ ) ₁₀ and ( Cx.Text <> ’ ’ ) and ( Cy.Text <> ’ ’ ) then ₁₁ begin
₁₂ x1 := StrToInt ( Ax .Text) ;
₁₃ y1 := StrToInt ( Ay .Text) ;
₁₄ x2 := StrToInt ( Bx.Text) ;

18

₁₉ { Calcular la distancia de cada punto }
₂₀ a := DistanciaPP ( x1 , y1 , x2 , y2 ) ;
₂₁ b := DistanciaPP ( x1 , y1 , x3 , y3 ) ;
₂₂ c := DistanciaPP ( x2 , y2 , x3 , y3 ) ;

23

₂₄

{ c alc ula r e l semiperímetro }

₂₅

S := ( a+b+c )/2;

26

₂₇

{ Calcular e l área }

²⁸

Area := sqrt ( S*( S−a )*( S−b )*( S−c ) ) ;

29

₃₀

{ Mostrar e l resultado }

₃₁

Resultado . Lines .Add ( ’ Area : ’ +FloatToStr ( Area ) ) ;

32

₃₃end

;

₃₄ end

;

Nótese que usando el código de funciones se ve más limpio y más aplicado a las matemáticas. Y obtendremos la aplicación en la siguiente figura.

Figura 7.69: Ejecución del Programa para Calcular el Área de un Triángulo dados sus Tres Vértices en el Plano Cartesiano.

7.9

Ecuación de una recta

La ecuación de una recta dados dos puntos en el plano cartesiano, se puede hallar mediante el siguiente algoritmo.

Sean los puntos A (x

₁

, y

₁

) y B (x

₂

, y

₂

) se define la pendiente de la recta que pasa por los dos puntos como:

y2− y1m = x2− x1

y la ecuación de una recta como:
y = mx − (mx₁− y₁)
Sean por ejemplo: los puntos A (1, 3) y B (2, 5), hallar la ecuación de la recta.

Hallamos la pendiente de la recta:

m

=

5 − 3
2 − 1 = 2
Asi la ecuación de la recta es:

y = 2x − (2 (1) − 3) y = 2x + 1

Diseño del formulario

El formulario para esta aplicación es sencilla, creamos un TStaticText

para mostrar la información del problema. Cuatro TLabelEdit

para ingresar los valores de las abscisas y las ordenadas de los puntos. Un TButton

para generar el cálculo y hallar la ecuación de la recta.

Figura 7.70: Diseño del Formulario para Hallar la Ecuación de la Recta que Pasa por Dos Puntos
Hallar la ecuación de la recta Para limitar el contenido de las cajas de texto, usamos el evento OnKeyPress, en una de las cajas de texto y tenemos:

₁ { Limitar e l contenido de las cajas de t e x t o }
₂ procedure TForm1. x1KeyPress ( Sender : TObject ; var Key : char) ;
₃ begin
₄ i f not ( key in [ ’ 0 ’ . . ’ 9 ’ , ’−’ , # 8 ] ) then Key := #0;
₅ end;

esto con el fin, de que sólo se puedan ingresar números enteros en las cajas de texto.

Hacemos doble clic al botón calcular (4) para generar el proceso Onclick y realizar los cálculos correspondientes.

₁ { Hallar la ecuación de la recta }
₂ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₃ begin

4

₅ end

; Se necesitan cuatro variables de tipo entero para recoger los datos de las cajas de texto, una variable para almacenar el valor de la pendiente.

₁ { Hallar la ecuación de la recta }
₂ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₃ var
₄ a , b , c , d : Integer;
₅ m : Real; begin

6

₇ { 1. Tomar los datos de las cajas de t e x t o }
₈ a := StrToInt ( x1 .Text) ;
₉ b := StrToInt ( y1 .Text) ;
₁₀ c := StrToInt ( x2 .Text) ;
₁₁ d := StrToInt ( y2 .Text) ;

12

₁₃

{ 2. Encontrar e l valor de la pendiente }

₁₄

m := ( d−b ) / ( c−a ) ;

15

₁₆

{ 3. Calcular la ecuación de la recta }

₁₇

EtEcuacion . Caption := ’ y= ’ +IntToStr (m)+ ’ x ’ ;

18

₁₉ i f −1*(m*a−b ) > 0 then
₂₀ begin
₂₁ EtEcuacion . Caption := EtEcuacion . Caption+ ’ + ’ +
₂₂ IntToStr (−1*(m*a−b ) ) ;
₂₃ end
₂₄ else

₂₅ begin
₂₆ EtEcuacion . Caption := EtEcuacion . Caption+
₂₇ IntToStr (−1*(m*a−b ) ) ;
₂₈ end;
₂₉ end;

Como se puede observar en el código se toma el valor de las cajas de texto en las variables a, b, c, d, para calcular la pendiente de la recta y almacenarla en la variable m.

Luego, se forma una cadena de texto con la ecuación de la recta, pero retomando un condicional para determinar si el término independiente es menor o mayor, únicamente para poner el signo +, puesto que el signo− lo da el mismo número entero.

Figura 7.71: Ejecución del Programa para Hallar la Ecuación de la Recta que Pasa por Dos Puntos

7.10

Números pares e impares

Un número entero es par, si es de la forma:
n = 2k
∀k ∈ Z⁺
Un número entero es impar si es de la forma: n = 2k + 1

∀ k ∈ Z⁺ En programación, se sabe si un número es par si al calcular el residuo de dividir por dos (2), es cero (0). Si el residuo es uno (1), el número es impar.

Diseño del formulario

Para este problema, sólo necesitamos un TLabelEdit

para ingresar el número, un TButton

para realizar el cálculo y un TLabel

para mostrar el resultado.

Figura 7.72: Diseño del Formulario para Determinar si un Número es Par o Impar
Evaluación Haciendo doble clic sobre el botón evaluar, leemos el valor de la caja de texto y hacemos el correspondiente cálculo.

₁ { Hacer calculo }
₂ procedure TForm1. Evaluarclic ( Sender : TObject ) ;
₃ var
₄ num : Integer;
₅ begin
₆ num := StrToInt ( número.Text) ;
₇ i f (num mod 2) = 0 then
₈ begin
₉ { El número es par }
₁₀ Resultado . Caption := IntToStr (num)+ ’ es par ’ ;
₁₁ end
₁₂ else
₁₃ begin

₁₄ { El número es par }
₁₅ Resultado . Caption := IntToStr (num)+ ’ es impar ’ ;
₁₆ end;
₁₇ end;

Se obtiene:

Figura 7.73: Ejecución de la Aplicación para Determinar si un Número es Par o Impar

7.11

Suma de los dígitos de un número de cuatro cifras

Dado un número de cuatro cifras, se desea sumar sus dígitos, se puede descomponer así, de la siguiente manera:

x

n

× 1000

₁

=

₁₀₀₀

x

2

=

n − x

¹

₁₀₀

× 100

x

n − x

₁

− x

2 × 103 = 10

x

₄

= n − x

₁

− x

₂

− x

₃

Luego: n = x

₁

+ x

₂

+ x

₃

+ x

₄

La notación [||] se refiere a la parte entera de dividir un número entre otra cantidad, en otras palabras, es el cociente de la división entre tales números.

En Lazarus se utiliza el comando div para indicar el cociente de la división. Por ejemplo, sea el número n = 5125 su descomposición será la siguiente:

x

₁

=

⁵¹²⁵

× 1000 = 5000

₁₀₀₀

x

5125 − 5000

× 100 =

¹²⁵

× 100 = 100

₂

=

100 100

x

5125 − 5001− 100

× 10 =

²⁵

× 10 = 20

₃

=

10 10

x

₄

= 5125 − 5000 − 100 − 20 = 5

luego: 5125 = 5000 + 100 + 20 + 5

El resultado que estamos buscando es poder encontrar los números 5, 1, 2 y 5 para proceder a sumarlos, lo cual se consigue quitando la multiplicación por 1000, 100 y 10, así:

x

₁

=

⁵¹²⁵

= 5

1000
x

5125 − 5 × 1000

= 12 = 100
x

5125 − 5 × 1000 − 1 × 100

= 23 = 10
x

5125 − 5 × 1000 − 1 × 100 − 2 × 10

= 54 = 1

Esto se conoce como una función recursiva, porque toma los valores antes calculados, para realizar los nuevos cálculos. Luego:

s = 5 + 1 + 2 + 5 = 13

Diseño del formulario

Necesitamos un TLabelEdit

para ingresar el número, un TButton

para realizar el cálculo y un TLabel

para mostrar el resultado.

Figura 7.74: Diseño del Formulario para Sumar los Dígitos de un Número de Cuatro Cifras

Suma de los dígitos

Haciendo doble clic en el botón sumar se tiene:

₁ {Suma de los d í g i t o s de un número}
₂ procedure TForm1. Sumarclic ( Sender : TObject ) ;
₃ begin

4

₅ end

;

Creamos cuatro variables x

₁

, x

₂

, x

₃

, x

₄

para guardar cada dígito, y una variable n para tomar el valor de la caja de texto.

₁ {Suma de los d í g i t o s de un número}
₂ procedure TForm1. Sumarclic ( Sender : TObject ) ;
₃ var
₄ x1 , x2 , x3 , x4 : Integer;
₅ n : Integer;
₆ begin

7

₈ end

; Tomar el número de la caja de texto, y realizar el calculo.

₁ {Suma de los d í g i t o s de un número}
₂ procedure TForm1. Sumarclic ( Sender : TObject ) ;
₃ var
₄ x1 , x2 , x3 , x4 : Integer;
₅ n : Integer;
₆ begin

₇

{ 1. Tomar e l valor de la caja }

₈

n := StrToInt ( número.

Text

) ;

9

₁₀ { 2. Hacer los calculos }
₁₁ x1 := n div 1000;
₁₂ x2 := ( n−x1*1000) div 100;
¹³ x3 := ( n−x1*1000−x2*100) div 10;
₁₄ x4 := n−x1*1000−x2*100−x3*10;

15

₁₆ { 3. Mostrar e l resultado }
₁₇ Resultado . Caption := ’ La suma es : ’ +
₁₈ IntToStr ( x1+x2+x3+x4 ) ;
₁₉ end;

Entonces la aplicación así:

Figura 7.75: Ejecución de la Aplicación para Sumar los Dígitos de un Número de Cuatro Cifras

7.12

Factorial de un número

En matemáticas discretas, el factorial de un número se define como:

n! = n × (n − 1) × (n − 2) × · · · × 1

En programación, hay varias formas de calcular el factorial de un número.

Diseño del formulario

Para calcular el factorial de un número, basta con un TLabelEdit

, donde se puede ingresar el número, al cual deseamos calcularle el factorial, un TButton

para proceder a realizar el calculo y un TMemo

para mostrar el resultado.

Figura 7.76: Diseño del Formulario para Calcular el Factorial de un Número.

Hacemos doble clic sobre el botón calcular para generar el procedimiento calcular.

Cómo calcular el factorial

Podremos escribir los siguientes códigos.

₁ procedure

TForm1. Calcularclic ( Sender : TObject ) ;

₂ var
₃ i : Integer;
₄ n : Integer;
₅ f a c t : Integer;
₆ begin
₇ n := StrToInt ( número.Text) ;
₈ f a c t :=1;

9

₁₀ for i :=1 to n do
₁₁ begin
₁₂ f a c t *= i ;
₁₃ end;

14

₁₅ { mostrar e l resultado }
₁₆ Resultado . Lines .Add ( ’ Factorial : ’ +IntToStr ( f a c t ) ) ;

₁₇ end

;

Es un código bueno, pero muy largo.

En programación, la optimización es muy importante, debido que se evitan excesivas líneas de código, además que la solución al problema se hará de forma más eficiente y con el uso de menos recursos. Otro código es el siguiente.

Creamos la función:

₁ function Fact ( n : Integer) : Real;
₂ begin
₃ i f n>0 then
₄ begin
⁵ Result := n*Fact ( n−1);
₆ end
₇ else
₈ begin
₉ Result :=1;
₁₀ end;
₁₁ end;

Y en el procedimiento hacemos:

₁ procedure TForm1. Calcularclic ( Sender : TObject ) ;
₂ var
₃ n : Integer;
₄ begin
₅ n := StrToInt ( número.Text) ;

6

₇ { mostrar e l resultado }
₈ Resultado . Lines .Add ( ’ Factorial : ’ +FloatToStr ( Fact ( n ) ) ) ;
₉ end;

Apartir de lo anterior, se puede apreciar que da lo mismo.

La diferencia es que la segunda es una función recursiva que se llama así misma, entonces el resultado será el mismo.

Figura 7.77: Ejecución del Programa para Calcular el Factorial de un Número

7.13

Creando nuestra propia calculadora

En este capítulo vamos, a crear nuestra propia calculadora, en la cual podremos guardar el historial de cálculos y algunas otras opciones.

Creamos un formulario alargado, al cual vamos a agregar una pantalla usando el componente TListBox, para que los cálculos salgan en una lista y se puedan volver a tomar. Este componente podemos llamarlo (Pantalla) y alinearlo arriba, en la opción alTop.

Añadimos una imagen debajo de la pantalla con la alineación alClient para que tome el resto de la pantalla, y sobre la cual cargaremos una imagen con el diseño de los botones, que se pueden crear en un editor gráfico como InkScape o CorelDraw u otro que sea de predileccion del usuario. Estos botones serán componentes del tipo TImage.

Figura 7.78: Diseño de una Calculadora (Panel de Botones)

El panel de botones podría ser el siguiente:

Figura 7.79: Diseño de una Calculadora (Diseño del Panel de Botones). Agregamos un TImage para cada botón así:

Figura 7.80: Diseño de una calculadora (agregando los botones)

Se sitúa cada imagen sobre el fondo que representa su botón, agregando un botón trasparente que servirá como animación, cuando el mouse pase por encima de cada botón.

Seguidamente se añade un TEdit para la entrada de las órdenes, el cual alineamos alTop.

Figura 7.81: Diseño de una calculadora (agregando los botones)

Creando la animación de los botones

Para crear la animación de los botones, seleccionamos el primer botón, el del número uno, vamos al inspector de propiedades y seleccionamos la pestaña de eventos, en la cual buscamos los eventos OnMouseEnter y OnMouseLeave

Figura 7.82: Diseño de una Calculadora (Creando la Animación de los Botones)

Hacemos clic sobre el botón de los tres (3) puntos y, éste creará un procedimiento en el editor de código fuente.
₁ {Cuando e l mouse entra }
₂ procedure TFCalculadora . b1MouseEnter ( Sender : ₃ begin

4

₅ end

;

6

₇ {Cuando e l mouse sale }
₈ procedure TFCalculadora . b1MouseLeave ( Sender :
₉ begin

10

₁₁ end

;

TObject ) ;

TObject ) ;

En el proceso de MouseEnter, debemos colocar la imagen transparente encima del botón mediante el método:

b1.Picture.LoadFromFile(’Archivos\BotonTransparencia.png’);

Tenga en cuenta que la imagen esta guardada en una carpeta cuyo nombre es Archivos, si la imagen esta dentro de otra carpeta, debe especificar el nombre de la carpeta.

Luego en el proceso MouseLeave, debemos borrar la imagen que se ha cargado en el proceso anterior. Esto creara el efecto de animación cuando el mouse entra y sale de la imagen. Esto se hace a través del siguiente código.

b1.Picture.Clear;

El código completo será entonces:

₁ {Cuando e l mouse entra }
₂ procedure TFCalculadora . b1MouseEnter ( Sender : TObject ) ;
₃ begin
₄ TImage ( Sender ) . Picture . LoadFromFile (
₅ ’ Archivos\BotonTransparencia . png ’ ) ;
₆ end;

7

₈ {Cuando e l mouse sale }

₉ procedure TFCalculadora . b1MouseLeave ( Sender : TObject ) ; ₁₀ begin
₁₁ TImage ( Sender ) . Picture . Clear ;
₁₂ end;

Se debe limpiar antes el panel de botones para que no quede con las transparencias, de lo contrario cuando inicie la aplicación, todos quedaran como si estuvieran seleccionados.

Figura 7.83: Diseño de una Calculadora (Borrando las Imagenes Precargadas).

Como el efecto se hizo sólo para el primer botón, seleccionamos los demás , presionando la tecla Shift y con el mouse damos clic al resto de ellos.

Figura 7.84: Diseño de una Calculadora (Dando Formato a Todas las Imágenes)

Creando los eventos de pulsado para cada botón

De la misma forma que hicimos en el paso anterior, seleccionamos el primer botón buscamos el evento Onclick y pulsamos el botón de los tres (3) puntos, generando el siguiente procedimiento:

₁ { c l i c de los botones }
₂ procedure TFCalculadora . b1clic ( Sender : TObject ) ;
₃ begin

4

₅ end

;

Este procedimiento tiene una variable Sender, la cual podemos comparar con cada uno de los botones para determinar qué acción hacer, veamos: ₁₂ i f Sender = b0 then
₁₃ Ordenes .Text := Ordenes .Text + ’ 0 ’ ;

₁ { c l i c de los botones }
₂ procedure TFCalculadora . b1clic ( Sender : TObject ) ;
₃ begin
₄ { Verificando los números % % % % % % % % % % % % % % % % % % % %
₅ { s i e l e l botón del número 1}
₆ i f Sender = b1 then
₇ Ordenes .Text := Ordenes .Text + ’ 1 ’ ;

8 .
9 .
10 .
₁₁ { s i e l e l botón del número 0}

14

₁₅ { s i e l e l botón del punto . }
₁₆ i f Sender = bpt then
₁₇ Ordenes .Text := Ordenes .Text + ’ . ’ ;

18

₁₉ { operadores % % % % % % % % % % % % % % % % % % % % % % % % % % %
₂₀ { s i e l e l botón del operador +}
₂₁ i f Sender = bmas then
₂₂ Ordenes .Text := Ordenes .Text + ’ + ’ ;

23

₂₄ { s i e l e l botón del operador +}
₂₅ i f Sender = bmenos then
₂₆ Ordenes .Text := Ordenes .Text + ’−’ ;

27

₂₈ { s i e l e l botón del operador +}
₂₉ i f Sender = bpor then
₃₀ Ordenes .Text := Ordenes .Text + ’* ’ ;

31

₃₂ { s i e l e l botón del operador +}
₃₃ i f Sender = bdiv then
₃₄ Ordenes .Text := Ordenes .Text + ’ / ’ ;

35

₃₆ { s i e l e l botón del operador +}
₃₇ i f Sender = bpot then
₃₈ Ordenes .Text := Ordenes .Text + ’** ’ ;

39
40

₄₁ { funciones trigonometricas % % % % % % % % % % % % % % % %
₄₂ { s i e l e l botón de la funcion seno }
₄₃ i f Sender = bsen then
₄₄ Ordenes .Text := ’ sin ( ’ +Ordenes .Text + ’ ) ’ ;

45

₄₆ { s i e l e l botón de la funcion coseno }
₄₇ i f Sender = bcos then
₄₈ Ordenes .Text := ’ cos ( ’ +Ordenes .Text + ’ ) ’ ;

49

₅₀ { s i e l e l botón de la funcion tangente }

₅₁i f

Sender = btan

then

₅₂

Ordenes .

Text

:= ’ tan ( ’ +Ordenes .

Text

+ ’ ) ’ ;

53

₅₄ { s i e l e l botón de la funcion arcoseno }
₅₅ i f Sender = barcsin then
₅₆ Ordenes .Text := ’ asin ( ’ +Ordenes .Text + ’ ) ’ ;

57

₅₈ { s i e l e l botón de la funcion arcocoseno }
₅₉ i f Sender = barccos then
₆₀ Ordenes .Text := ’ acos ( ’ +Ordenes .Text + ’ ) ’ ;

61

₆₂ { s i e l e l botón de la funcion arcotangente }
₆₃ i f Sender = barctan then
₆₄ Ordenes .Text := ’ atan ( ’ +Ordenes .Text + ’ ) ’ ;

65
66

₆₇ { borrar y apagar % % % % % % % % % % % % % % % % % % % % % % % %
₆₈ { s i e l e l botón de borrar }
₆₉ i f Sender = bac then
₇₀ Ordenes .Text := ’ ’ ;

71

₇₂ { s i e l e l botón de la funcion arcotangente }
₇₃ i f Sender = b o f f then
₇₄ Close ;
₇₅ end;

Figura 7.85: Diseño de una Calculadora (Proceso Onclick)

Como el proceso lo tiene un sólo botón, hay que seleccionar los demás botones y llamar el mismo procedimiento a los restantes, tal como se hizo en el proceso de la animación.

Figura 7.86: Diseño de una Calculadora (Dando el Formato Onclick a todos los Botones)

Por medio de esta técnica ahorramos una gran cantidad de códigos. Luego, ya podemos escribir todos los códigos en la barra de entrada.

Figura 7.87: Diseño de una Calculadora (Caja de Expresiones)

8

Problemas propuestos

Se proponen una serie de problemas, en cada una de las siguientes ramas de las matemáticas:

Lógica.

Aritmética.

Álgebra.

Geometría Analítica.

Trigonometria.

Cálculo Diferencial.

Cálculo Integral.

Métodos Estadísticos.

Álgebra Lineal.

1. Encontrar la tabla de verdad de la expresión

Problemas de lógica

p ∧ q, p ∨ q, p → q, p ⇔ q .

2. Encontrar la tabla de verdad para proposiciones lógicas.

3. Convertir una expresión lógica a notación polaca.

281

Problemas de aritmética
4. Hallar el máximo común divisor de un conjunto de números.
5. Hallar el mínimo común múltiplo de un conjunto de números.
6. Descomponer un número en sus factores primos.
7. Convertir números entre diferentes sistemas de numeración.

Problemas de álgebra

8. Factorizar polinomios de la forma a

n

x

n

+ a

n−1

x

n−1

+ · · · a

₁

x + a

₀

usando el algoritmo de división sintética, cuando el polinomio sea factorizable. 9. Dividir un polinomio de la forma a

n

x

n

+ a

n−1

x

n−1

+ · · · a

₁

x + a

₀

por la expresión x ± a usando la regla de Ruffini.

10. Calcular la n-ésima línea del triángulo de Pascal.

11. Encontrar la solución a una ecuación de segundo grado, de la forma ax

²

+ bx + c = 0 .

12. Encontrar el conjunto solución de inecuaciones con la forma ax

²

+ bx + c (> . <, ≤, ≥) : 0 .

Problemas de álgebra lineal
13. Encontrar el determinante de una matriz cuadrada de 2 × 2.
14. Encontrar el determinante de una matriz cuadrada de 3 × 3.
15. Sumar dos matrices A y B.
16. Multiplicar dos matrices A y B.
17. Hallar la solución de un sistema de ecuaciones usando el método de Gauss.

18. Hallar la solución de un sistema de ecuaciones usando el método de GaussJordan.

19. Sumar dos vectores, ya sean en R² o R³.
20. Encontrar el producto cruz entre vectores, ya sean en R² ó R³.
21. Encontrar el producto punto entre vectores, ya sean en R² ó R³.

Problemas de geometría analítica
22. Calcular la distancia entre dos (2) puntos en el plano.

23. Calcular el baricentro de un triangulo, dados los tres (3) vértices del triángulo.

24. Calcular el área de un triángulo, dados tres (3) puntos en el plano cartesiano.

25. Calcular la ecuación de una recta, dados dos (2) puntos en el plano cartesiano.

26. Calcular la ecuación de una circunferencia, dados tres (3) puntos en el plano cartesiano.

27. Calcular la ecuación de una elipse, dados tres puntos en el plano cartesiano. 28. Calcular la ecuación de una hipérbola, dados tres puntos en el plano cartesiano.

29. Calcular la ecuación de una parábola, dados tres puntos en el plano cartesiano.

30. Encontrar los puntos de intersección, entre una circunferencia y una recta.
31. Encontrar los puntos de intersección entre una parábola y una recta.
32. Encontrar los puntos de intersección entre una elipse y una recta.
33. Encontrar los puntos de intersección entre una hipérbola y una recta.

Problemas de trigonometría
34. Resolver triángulos usando funciones trigonométricas.
35. Resolver triángulos usando el teorema de seno.
36. Resolver triángulos usando el teorema del coseno.
37. Resolver triángulos usando el teorema de la tangente.
38. Resolver triángulos usando el teorema de pitágoras.
39. Resolver triángulos usando el teorema de thales.
40. Generar una calculadora geométrica para sumar.

41. Generar una calculadora geométrica para multiplicar.

42. Generar una calculadora geométrica para dividir.

43. Generar una calculadora geométrica para hallar raíces cuadradas.

44. Convertir de grados a radianes y vicerversa.

Problemas de cálculo diferencial

45. Hallar el límite de funciones de la forma: f (x) = a

n

x

n

±a

n−1

x

n−1

±· · ·±a

₁

x+a

₀

, cuando x tiende a un número b.

46. Hallar la derivada numérica de funciones de la forma: f (x) = a

n

x

n

±a

n−1

x

n−1

±

· · · ± a

₁

x + a

₀

.

Problemas de cálculo integral

f (x) = a

n

x

n

±47. Encontrar el área bajo la curva de funciones de la forma: a

n−1

x

n−1

± · · · ± a

₁

x + a

₀

, en el intervalo [a, b]

48. Encontrar el volumen del sólido en revolución de las funciones como:

1. f (x) = a sin b (x − c) + d
2. f (x) = a cos b (x − c) + d
3. f (x) = (x − a) (x − a)

Problemas de métodos estadísticos

49. Construir una tabla de frecuencias, dado un conjunto de datos en una matriz.

50. Construir una tabla de frecuencias con datos agrupados, dado un conjunto de datos en una matriz.

51. Asociar las tablas anteriores a gráficos estadísticos.

Otros problemas propuestos

En este tipo de problemas, se proponen juegos y aplicaciones que se salen un poco del contexto académico de las matemáticas, pero que reforzarán más sus conocimientos en programación.

Alto Nivel

Diseñar y desarrollar:
52. Un juego del tipo Mario Bross.
53. Un juego de ajedrez: usuario vs máquina.
54. Un sudoku. Mediano Nivel

Diseñar y desarrollar:
55. Un juego de escalera.
56. Un juego de concéntrese.
57. Una calculadora científica. Bajo Nivel

Diseñar y desarrollar:
58. Una aplicación que simule un cajero automático.
59. Una aplicación para hallar el área de figuras planas.
60. Una aplicación para calcular números primos.

Resumen

La programación es una actividad interesante y apasionante para quienes aceptan el desafío. Independientemente del motivo que los lleve a programar. Tal como se expresó en la introducción de este texto, existen varios lenguajes de programación disponibles en el mercado, algunos de ellos son libres, tal como Free Pascal.

Con este texto como guia se introdujo al estudiante en el uso del ambiente integrado de desarrollo Lazarus y se fue mostrando los componentes del programa, con los que junto al seguimiento de los ejercicios desde los más elementales hasta los más complejos cuidando de presentarlos en forma didáctica para facilitar el entendimiento.

Al realizar en su totalidad este conjunto de problemas, se espera que el estudiante haya logrado entender la estructura y manipulación del lenguaje de programación Free Pascal, así como la manipulación del entorno de desarrollo Lazarus Project.

Bibliografía

[1] Aristizábal Z, J. H., & Carmona, E. J. (2010). Geometría Analítica con aplicaciones usando software. Colombia: Elizcom. [2] Bustos P. Manual básico de Delphi 6, Consultado el 24 de Agosto del 2010, de www.casadelphi.com

[3] Delphi al límite. Consultado el 20 de Noviembre del 2012, de delphiallimite.blogspot.com

[4] Ferrer R. (2001). Manual de FreePascal 1.0 para Win32. Inedito. [5] Hoyos, S. Efrain A; Marín G. Julián. (1997). Delphi Guía de programación. Armenia, Gedes.

[6] Lehmann, C. (1989). Geometría Analitíca. Mexico D.F: Editorial limusa, S. A.

[7] Leithold, L. (1998). El Cálculo. Harla Mexico: Oxford University Press.

[8] Muñoz Casanova, Diana Cecilia. (2007). Introducción a la teoría de Lenguajes. Universidad Nacional del Santa. Perú. [9] Purcell, E. J., Varberg, D., & Rigdon, S. E. (2007). Cálculo. Mexico: Pearson.

[10] Swokowski, E. (1989). Calculo con Geometría Analítica. Mexico: Iberoaméricana.