# Lenguaje Delphi
## Lenguaje Delphi

Delphi es un entorno de desarrollo de software diseñado para la programación de propósito general con énfasis en la programación visual. En Delphi se utiliza como lenguaje de programación una versión moderna de Pascal llamada Object Pascal.

### Historia

Es producido comercialmente por la empresa estadounidense Aberform, adquirida en Mayo de 2008 por Embarcadero Technologies, una empresa del grupo Thoma Cressey Bravo, en una suma que ronda los 30 millones de dólares. En sus diferentes variantes, permite producir archivos ejecutables para Windows, Linux y la plataforma .NET.
CodeGear ha sido escondida de la empresa Borland, donde Delphi se creó originalmente, tras un proceso que pretendía en principio la venta del departamento de herramientas para desarrollo.
Un uso habitual de Delphi (aunque no el único) es el desarrollo de aplicaciones visuales y de bases de datos cliente-servidor y multicapas. Debido a que es una herramienta de propósito múltiple, se usa también para proyectos de casi cualquier tipo, incluyendo aplicaciones de consola, aplicaciones de web, servicios COM y DCOM, y servicios del sistema operativo.
Delphi inicialmente sólo producía ejecutables binarios para Windows: Delphi 1 para Win16 y con Delphi 2 se introdujo Win32. En el año 2013 lanzaron la version XE5 la cual permite crear ejecutables binarios para Windows 32 y 64 bits, Mac OSX, IOS para IPhone y IPad y celulares inteligentes o tabletas Android.

### Breve tutorial de instalación y uso de herramientas de Compilación

Las herramientas usadas para la Compilación de Delphi según el sistema operativo son: Para Windows: Borland Delphi 7, RAD Studio 2007 Para Linux y Unix: Kylix 3.0. Pero en esta documentación nos centraremos en la instalación y uso de las herramientas del Borland Delphi 7. Algo que diferencia a Delphi de muchos otros competidores es el hecho de tratarse de un compilador altamente optimizado, que genera código directamente ejecutable, no pseudo − código que debe ser interpretado posteriormente en tiempo de ejecución. Esto tiene básicamente dos consecuencias: el ejecutable es más rápido, al no tener que ser interpretado en tiempo de ejecución y el tamaño total final de la aplicación suele ser inferior; ya que no es necesaria la distribución adicional del programa que interpreta y ejecuta el código al que se suele denominar Runtime.

### Programa Hola Mundo

Ahora como todo tutorial iniciaremos con una pequeña aplicación de una ventana con un botón que desplegará un mensaje con el rótulo de ‘Hola mundo’. Para eso, nos vamos al primer menú de la parte superior y damos clic a la opción ‘file’, acto seguido damos clic a ‘new’ y luego a ‘application’.
Se genera un proyecto con un formulario vacío, es ahí donde comienza la tarea de comenzar a arrastrar los demás elementos visuales al formulario vacío como: etiquetas, cajas de textos, lista de textos, memos, botones, etc. En el programa sólo necesitaremos arrastrar un botón. Cada elemento tiene su Object Inspector, es una herramienta que nos permite modificar los atributos de los objetos como el de la figura al lado izquierdo de nuestro programa. Nos vamos al atributo caption y modificamos escribiendo el rótulo que deseamos para el botón. Ahora para poder comenzar a programar lo que debe hacer el botón, recuerde que se programa por eventos así que seleccionamos el botón, luego nos vamos a su Object Inspector y le damos a la pestaña ‘Events’ y elegimos el evento ‘onClick’ y en el espacio en blanco le damos doble clic. Se nos desplegará una ventana de editor de texto con el siguiente código.
Ahora el espacio entre ‘begin’ y ‘end;’ es ahí por donde se inicia a programar lo que deseamos que el botón haga en el evento onClick; que, básicamente es el evento cuando el botón le den clic. Ahora le ponemos la siguiente instrucción.
Ahora unas aspectos a tomar en cuenta: cada instrucción termina con un punto y coma, cuando se desea imprimir o mostrar un mensaje debe hacerlo entre comillas simples (‘’), y para ejecutarlo hay varias maneras, puede de un sólo con darle clic a F9, se ejecutará siempre y cuando no halle ningún error, y si lo hubiera en la parte inferior del editor de código aparece la lista de errores. La otra forma es ir al primer menú y buscar ‘Run’ y luego darle clic en el menú que se desplega ‘Run’. La instrucción showMessage; desplega un mensaje con el argumento que reciba puede ser un mensaje string o del tipo Pchar(Combinacion de números y letras). Ejecución del programa.

### Diccionario de palabras reservadas, operadores y símbolos del lenguaje

Esto es una lista de palabras reservadas y estas no pueden redefinirse o ser usadas como identificadores:
| and | array | as | asm | begin | Case |
| class | structor | destructor | dispinterface | Div |
| do | downto | else | end | except | exports |
| file | Finalization | finally | for | function | Goto |
| if | implementation | in | inherited | initialization | Inline |
| interface | is | label | library | mod | Nil |
| not | object | of | or | out | Packed |
| procedure | program | property | raise | record | repeat |
| resourcestring | set | shl | shr | string | then |
| thread | varto | try | type | unit | Until |
| uses | var | while | with | Xor | |
En adición a las palabras de arriba, private, protected, public, published, y automated actúan como palabras reservadas dentro las declaraciones de tipos de objetos, pero en otra forma son tratadas como directrices. También las palabras at y on tienen significados especiales.

### Símbolos especiales

Los símbolos especiales son caracteres no alfabéticos, o pares de estos caracteres, que tienen significados fijos. Los siguientes caracteres son símbolos especiales:
Los siguientes pares de caracteres también son símbolos:
Se puede ver claramente que !, , %, \,?,_, |, y ~ no son caracteres especiales.

### Comentarios y directrices de compilación

Los comentarios son ignorados por el compilador, excepto cuando su función es de separadores delimitando tokens adyacentes o directrices de compilación. Existen muchas directrices de compilación:
Un comentario que contenga un signo de $ es una directriz de compilación. Por ejemplo,
indica al compilador que no genere avisos.

### Tipos de datos fundamentales y su representación

* Integer
Números enteros comprendidos entre −32768 y 32767; 16 bits (ocupan 2 bytes cada uno en la memoria)
* Byte
Números enteros positivos comprendidos entre 0 y 255; 8 bits (ocupa 1 byte cada uno en la memoria)
* Word
Números positivos comprendidos entre 0 y 65535; 16 bits (ocupan 2 bytes cada uno en la memoria)
* LongInt
Números enteros comprendidos entre −2147483647 y 2147483647 32 bits (ocupan 4 bytes cada uno en la memoria)
* ShortInt
Números negativos y positivos enteros comprendidos entre −128 y 127; 8 bits (ocupa 1 byte cada uno en la memoria)
* Real
Números de coma flotante de 11 a 12 decimales significativos (delante y detrás de la coma); ocupan 6 bytes cada uno en la memoria
* Single
Números de coma flotante de 7 a 8 decimales significativos; solo es posible si está activada la opción de compilador {$N+}; ocupan 4 bytes cada uno en la memoria
* Double
Números de coma flotante de 15 a 16 cifras delante y detrás de la coma; solo es posible si está activada la opción de compilador {$N+}; ocupan 8 bytes cada uno en la memoria
* String
Secuencia de símbolos con una longitud máxima de 255 caracteres ASCII.
* Char
Caracteres ASCII simples
* Pchar
Puntero a una cadena terminada en carácter nulo
* Pointer
Punteros que pueden apuntar a cualquier estructura de datos; sin enlace con un tipo concreto(denominados punteros sin tipo)
* Boolean
Tipo de Datos Booleano, cuyas variables pueden tomar los valores True (verdadero) o False (falso)

### Operaciones de entrada y salida básica

Las operaciones de entrada y salida en Delphi son variadas dependiendo de la aplicación que se está programando. Si es una aplicación de consola, los comandos de entrada y salida son los siguientes:
* Read;
El argumento es un identificador de las variables previamente declaradas.
* Write(‘Mensaje’,)
Este comando nos imprime una salida y puede recibir muchos argumentos, entre ellos mensajes String y si queremos imprimir un número que está almacenado en una variable simplemente se pone el nombre de la variable como parámetro.
Si es una aplicación con formularios y ventanas, eso depende de cuales sean los elementos de entrada y cuales los de salida, a continuación una breve descripción de objetos (Más comunes) y sus métodos de entrada y salida.
| Elemento | Entrada | Salida |
| Label | .Caption | .Caption := |
Pero hay que aclarar que los métodos de entrada y salidas de Label y Edit(Caja de Texto) reciben o envían String o cadena de caracteres así que para problemas que requieran de entradas numéricas o salidas numéricas se usan los siguientes métodos de conversión.
| Método | Convierte de | Convierte a |
| IntToStr(variable:Integer) | Integer | String |
| StrToInt(variable:String) | String | Integer |
| FloatToStr(variable:Float) | Real | String |
| StrToFloat(Variable:String) | String | Real |

### Tipos de datos complejos y su representación

En Delphi existen los datos complejos entre los cuales tenemos los registros y los arreglos tipo tabla y los arreglos tipo vector.
Arreglos tipo Vector.
Para declarar un arreglo del tipo Vector o lista se usa el siguiente formato. <nombre del Arreglo>: array [1..n] of <Tipo del Arreglo>; Ejemplos: Edades: array [1..10] of Integer; Nombres: array [1..30] of String; Nombres: array [1 30] of String[20]; Esta declaración se hace en la parte ‘var’ del programa principal, en el caso de una aplicación de formulario en el ‘var’ del programa del ’TForm.form1’, porque un arreglo son elementos que se comparten entre todos los eventos de los objetos
Arreglos tipo Tabla (bidimensionales).
El formato para declarar un arreglo bidimensional no varía mucho con el unidimensional. <Nombre del Arreglo>: array[1..n, 1..m] of <Tipo>; Y aplica la misma normativa, es mejor declararlos en el ‘var’ del ‘TForm.form1’. Indicando que es una variable global.

### Declaración e inicialización de variables

Para la declaración de variables nos valemos de las siguientes sintaxis: var <Nombre de variable> : <Tipo de variable> <Nombre de variable 1>, <Nombre de variable 2>, … <Nombre de variable n> : <Tipo de variable>
Para inicializar las variables recién creadas:
<Nombre de Variable> := <Valor>

### Tabla de Operadores con asociatividad y precedencia

| Operadores | Asociatividad |
| + | Por la Izquierda |
| - | Por la Izquierda |
| * | Por la Izquierda |
| / | Por la Izquierda |
| div | Por la Izquierda |
| mod | Por la Izquierda |
| Orden de Precedencia | Operadores |
| 1 | Las operaciones entre paréntesis |
| 2 | Raíces o Potencias |
| 3 | Multiplicaciones o Divisiones |
| 4 | Sumas o Restas |
| 5 | Si hay 2 o más operadores del mismo Orden entonces se usa la asociatividad por la izquierda |

### Estructuras de decisión e iteración

Antes de iniciar con las estructuras de decisión e iteración, se debe conocer los operadores de las condiciones que son la base de las dos siguientes estructuras a ver.
| Operador | Significado |
| > | Mayor que |
| < | Menor que |
| >= | Mayor o Igual que |
| <= | Menor o Igual que |
| = | Igual |
| <> | Distinto de |
Hay que tener claro que la diferencia entre ‘=’ y “:=” es, que el primero compara dos variables y el segundo es una asignación de valores.
A continuación se presenta una tabla con los operadores para cuando hay más de una condición a evaluar.
| Operador | Significado |
| AND | “y” lógico |
| OR | “o” lógico |
| NOT | negación |
Decisión Uso del If
Uso del Case
<Variable>, generalmente si es un Integer, cada Constante sería 1, 2, 3,… hasta donde sea necesario, y si es un Char, cada constante a evaluar sería ‘a’, ‘b’, ‘c’,…etc.
Iteración Ciclo For
Ciclo While
Ciclo Repeat Until
* Dependiendo de la condición, la instrucción puede variar pero esta instrucción es vital para evitar ciclos infinitos.

### Declaración, definición y uso de métodos y funciones

Delphi por supuesto tiene lo que es el uso de funciones y Procedimientos, ahora definiremos por separado cada uno de estos módulos. Procedimientos: Es un modulo de un programa que realiza tareas específicas y que no puede regresar valores a la parte principal del programa u otro procedimiento que lo esté invocando.
Declaración y Definición de los Procedimientos.
Este esquema de la definición y declaración se hace en la sección de ‘VAR’ del programa principal. Uso. Simplemente en el programa principal se copia el nombre del procedimiento previamente definido en el lugar donde se le requiera.
Funciones: Una función es un módulo de un programa separado del cuerpo principal, que realiza una tarea específica y que puede regresar un valor a la parte principal del programa u otra función o procedimiento que la invoque. Declaración y Definición de las Funciones.
Este esquema de la definición y declaración se hace en la sección de ‘VAR’ del programa principal. Uso. Simplemente en el programa principal se hace el llamado a función.

### Implementación y uso de la Programación Orientada a Objetos

Generalmente la POO se asocia rápidamente con lenguajes como C++, pero Object Pascal, de ahí su nombre, cuenta con todos los componentes básicos de un lenguaje orientado a objetos con la encapsulación, la herencia y el polimorfismo.
Comenzando con el concepto de encapsulación de datos que trata básicamente de encerrar un conjunto de datos dentro de un objeto que sólo los métodos del propio podrá manipular. Para eso se hace uso de la palabra reservada ‘Type’.
Ahora sólo falta definir las funciones y procedimientos del Object ‘Persona’, Observe que un atributo tiene la palabra reservada de Private, esta palabra hace que el atributo sólo pueda ser accesado o modificado por medio de métodos del propio Objeto. El primer atributo se asume que es un atributo público; es decir, que puede ser modificado y/o accesado sin necesidad de métodos. A continuación se definen los procedimientos y funciones del objeto.
La definición de las funciones y procedimientos se hace en la sección ‘var’ del ‘main’ y la diferencia está en que el nombre de la función o del procedimiento siempre es precedido por el Nombre del objeto más punto. Ejemplo: Persona.setApellido Persona.nombreCompleto
Otro aspecto a destacar es que tanto las funciones como los procedimientos, en el momento de definirlos no es necesario copiar la lista de parámetros que necesiten y en el caso de las funciones no es necesario escribe ‘: <tipo que retornan>’ porque ya están encapsulados en el type.
Ahora para las herencias sencillamente donde se crea es esqueleto en el Type se hace lo siguiente:
Una recomendación es que los métodos comunes entre el padre y el hijo se deben declarar y definir en el padre, porque esos métodos se heredan de manera implícita en el hijo, dejando solamente la tarea de declarar y definir los métodos únicos del hijo.
Por último falta mencionar la declaración del polimorfismo, básicamente es una herencia múltiple de un padre a varios hijos, acá se usa la palabra reservada ‘virtual’. Este hace que los métodos (procedimientos y funciones) comunes entre el padre y el hijo puedan sobrescribirse. Básicamente permite que si hay un padre que hereda a varios hijos un método en común pero que cada método según el hijo funciona de manera diferente, puedan ser definidos en cada hijo usando siempre el mismo nombre.

### Manejo de Excepciones

El manejo de excepciones en Delphi no varía mucho de los demás lenguajes de hoy en día y su siguiente estructura es la siguiente.
Este bloque captura errores de manera genérica, pero también se puede diseñar bloques de excepciones con indicaciones más específicas.
Por ejemplo del Bloque anterior se pueden puede cambiar de la siguiente manera para que sólo intente el Try-Except con errores específicos.
En Tipo de Excepciones tenemos las siguientes:
* EAbort: Finaliza la secuencia de eventos sin mostrar el mensaje de error.
* EAccessViolation: Comprueba errores de acceso a memoria inválidos.
* EBitsError: Previene intentos para acceder a arrays de elementos booleanos.
* EComponentError: Nos informa de un intento inválido de registrar o renombrar un componente.
* EConvertError: Muestra un error al convertir objetos o cadenas de texto string.
* EDatabaseError: Especifica un error de acceso a bases de datos.
* EDBEditError: Error al introducir datos incompatibles con una máscara de texto.
* EDivByZero: Errores de división por cero.
* EExternalException: Significa que no reconoce el tipo de excepción (viene de fuera).
* EIntOutError: Representa un error de entrada/salida a archivos.
* EIntOverflow: Especifica que se ha provocado un desbordamiento de un tipo de dato.
* EInvalidCast: Comprueba un error de conversión de tipos.
* EInvalidGraphic: Indica un intento de trabajar con gráficos que tienen un formato desconocido.
* EInvalidOperation: Ocurre cuando se ha intentado realizar una operación inválida sobre un componente.
* EInvalidPointer: Se produce en operaciones con punteros inválidos.
* EMenuError: Controla todos los errores relacionados con componentes de menú.
* EOleCtrlError: Detecta problemas con controles ActiveX.
* EOleError: Especifica errores de automatización de objetos OLE.
* EPrinterError: Errores al imprimir.
* EPropertyError: Ocurre cuando se intenta asignar un valor erróneo a una propiedad del omponente.
* ERangeError: Indica si se intenta asignar un número entero demasiado grande a una propiedad.
* ERegistryExcepcion: Controla los errores en el registro.
* EZeroDivide: Controla los errores de división para valores reales.

### Características específicas del Lenguaje

Delphi está basado en una versión de Pascal denominada Object Pascal. Borland en los últimos años defendía que el nombre correcto del lenguaje es también Delphi, posiblemente debido a pretensiones de marca, aunque en sus mismos manuales el nombre del lenguaje aparecía como Object Pascal, por lo que la comunidad de programadores no ha adoptado mayoritariamente este cambio (supuesta aclaración, según Borland). Object Pascal expande las funcionalidades del Pascal estándar:
* Soporte para la programación orientada a objetos (habitualmente llamada POO) también existente desde Turbo Pascal 5.5, pero más evolucionada en cuanto a:
** Encapsulación: declarando partes privadas, protegidas, públicas y publicadas de las clases
** Propiedades: concepto nuevo que luego han adaptado muchos otros lenguajes. Las propiedades permiten usar la sintaxis de asignación para setters y getters.
** Simplificación de la sintaxis de referencias a clases y punteros.
* Soporte para manejo estructurado de excepciones, mejorando sensiblemente el control de errores de usuario y del sistema.
* Programación activada por eventos (event-driven), posible gracias a la técnica de delegación de eventos. Esta técnica permite asignar el método de un objeto para responder a un evento lanzado sobre otro objeto. Fue adoptada por Niklaus Wirth, autor del Pascal Original, e incorporada a otros de sus lenguajes como Component Pascal.
* Delphi es una Two−Way−Tool, es decir una herramienta de dos direcciones, porque permite crear herramientas de dos formas: una de forma visual en la pantalla por medio de la función de arrastrar y colocar (Drag & Drop), la otra es a través de la programación convencional, escribiendo el código. Ambas técnicas pueden utilizarse de forma alternativa o simultanea.

### Fuentes Bibliográficas

delphiallimite.blogspot.com programacionfacil.com es.wikipedia.org geocities.com