Sign in Join
Wiki copytemporary

Object Oriented Programming with Free Pascal and Lazarus/es: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11# Programación Orientada a Objetos con FreePascal y Lazarus
22
33## Introducción
44
55   Hay muchas excelentes tutorías sobre Pascal, pero esta pretender iniciar sobre la [[Glossary|Programación Orientada a Objetos]], que es una extensión del Pascal estándar, ofrecida por Turbo-pascal, Delphi y FreePascal/Lazarus.
66
77   Un [[Glossary/es|Objeto]] es una extensión de la estructura [registro](http://wiki.lazarus.freepascal.org/Record) del Pascal estándar.
88
99   La programación estándar en modo texto de Pascal es, cómo las aplicaciones Unix tradicionales, buena para hacer cualquier tarea y que se haga muy bien. Pero esta tarea puede ser algo compleja y que ofrezca al usuario variado menú de opciones, pero sin embargo está limitado a obedecer ordenes que se escriben por el teclado y mostrar las respuestas en un terminal o impresora.
1010
1111   Con el fin de proporcionar una [[Glossary|interfaz gráfica de usuario (GUI)]], es habitual recurrir a algún tipo de programación orientada a objetos (a menudo haciendo uso de [[Glossary|C]], o alguna de sus variantes, o Visual Basic, o alguna de las variantes de [[Glossary|OO]] de Pascal, como FreePascal con o sin [[Glossary|Lazarus]]).
1212
1313   En una interfaz gráfica de usuario (GUI) al usuario se le presenta una pantalla con un gran número de imágenes dispuestas en forma estructurada, que consta de un conjunto de herramientas o artefactos que están asociados con diversas acciones, tales como
1414
1515- seleccionar de un menú,
1616- abrir o guardar archivos,
1717- conectar a Internet,
1818- realización de cálculos numéricos, etc.
1919
2020   Del usuario se espera que mueva un ratón u otro tipo de puntero o herramienta de selección sobre la pantalla, para seleccionar las acciones que se realizarán en respuesta a un clic de ratón o la pulsación de una tecla.
2121
2222   Si bien sistemas para realizar una compleja interfaz gráfica de usuario pueden ser escritos en Pascal estándar o cualquier otro lenguaje de programación, es mucho más fácil utilizar un sistema orientado a objeto s, en el que cada elemento gráfico en la pantalla tiene todas sus propiedades, procedimientos y funciones relacionadas con su utilización unidas juntas en una estructura común, en un objeto.
2323
2424## Objetos: una analogía con el mundo real
2525
2626   Considera la analogía de una muestra de sangre recogida en un hospital o en la consulta del médico.
2727
2828### Análisis de sangre
2929
3030   La muestra de sangre es ciertamente un **objeto**; se ha asociado a ella una gran cantidad de información, documentos y otros objetos físicos.
3131
3232- **Tubo de muestra**, del tipo adecuado a las pruebas que el médico quiere realizar.
3333
3434- **Reglamento interno** (o método, procedimiento de operación estándar) para dirigir a la enfermera o técnico en la recogida de la muestra.
3535 - qué tipo de tubo debe utilizar,
3636 - cómo debe procesar la muestra,
3737 - cómo almacenarla hasta que se envía al laboratorio.
3838
3939- **Etiqueta** en el tubo con detalles sobre
4040 - identificador de la muestra
4141 - datos del paciente, nombre, fecha de nacimiento,...
4242 - fecha y hora de toma de la muestra
4343 - pruebas solicitadas.
4444
4545- **Formulario de solicitud** que acompaña a la muestra al laborarorio, con datos como
4646 - Identificador de la muestra
4747 - Identificación del médico solicitante
4848 - que pruebas ha pedido el médico
4949 - información detallada sobre el paciente
5050 - el posible diagnóstico cuya confirmación que se busca.
5151
5252   Una copia del formulario de solicitud se guarda en el historial del paciente y sirve para recordar al médico que debe tener los resultados en un tiempo adecuado.
5353
5454- En el laboratorio: Se usa una **Metodología** para determinar
5555 - la forma en que la muestra se analiza,
5656 - qué aparatos hay que utilizar,
5757 - Cómo se deben calibrar y manejar los aparatos,
5858 - cómo archivar los resultados, y el formato de los mismos,
5959 - remitir los informes al médico.
6060
6161   Los resultados reales son un registro que utiliza el médico para ayudar al diagnóstico, y una copia de los mismos se archivo en el historial del paciente.
6262
6363   La muestra física puede ser conservada para referencia, confirmación o nuevos ensayos, o será eliminada por algún medio adecuado; habrá un método regulado que describirá como hacer esto.
6464
6565   EL médico no necesita explicar todos los detalles e instrucciones cada vez que se toma una muestra, de hecho puede tener muy poco conocimiento sobre cómo se procesa la muestra en el laboratorio. Los detalles de los diversos procesos son ***heredados*** de tomas de muestras y análisis previos. Habrá un plan genérico para toda la secuencia, y así podríamos pensar en la muestra de sangre, todos sus documentos y datos, y los métodos de proeceso subyacentes, como un **objeto** complejo.
6666
6767   En la cabeza del médico, la muestra de sangre es identificada con los resultados, así como con las enfermeras y técnicos de laboratorio, el tubo, la etiqueta y las condiciones de almacenamiento, constituyendo todo ello una única entidad.
6868
6969### Otro ejemplo: automóvil
7070
7171Si no le gusta la sangre, el mismo tipo de razonamiento puede aplicarse a un coche enviado a un taller para su reparación. Podría consistir en:
7272
7373- el vehículo
7474- documentos en poder del propietario: registro o licencia (incluida la matrícula de un vehículo), los seguros, los recibos de compra, repuestos, reparaciones, etc.
7575- la historia del consumo de combustible
7676- los conductores autorizados a utilizar el vehículo, con los datos de su licencia
7777- informes de otros servicios prestados por el taller
7878- métodos o procedimientos que deben seguirse para el proceso de revisión y mantenimiento
7979- métodos que deben seguirse para reparaciones no habituales, etc.
8080- datos de facturación para el cliente
8181
8282## Programando un ejemplo
8383
84-<div class="floatleft">
85-
86-<figure>
87-<img src="lazarus.UnFormulario.png" title="lazarus.UnFormulario.png" />
88-<figcaption>lazarus.UnFormulario.png</figcaption>
89-</figure>
90-
91-</div>
92-
93-<div class="floatright">
94-
95-<figure>
96-<img src="Lazarus_Inspector_Objetos_form.png" title="Lazarus_Inspector_Objetos_form.png" />
97-<figcaption>Lazarus_Inspector_Objetos_form.png</figcaption>
98-</figure>
84+![](/wiki-images/a/ad/Lazarus.UnFormulario.png)
9985
100-</div>
86+![](/wiki-images/8/83/Lazarus_Inspector_Objetos_form.png)
10187
10288   ¡Ya está bien de ocuparse de ejemplos del mundo real! Es el momento de dedicarnos a nuestro propósito principal: programar en FreePascal.
10389
10490   Vamos a estudiar la creación de un sencillo formulario con un control para una aplicación en FreePascal y Lazarus.
10591
10692   Al ejecutar el IDE de Lazarus, al programador se le presenta, en diseño, un formulario en blanco, dentro del cual se pueden situar diversos controles y objetos.
10793
10894   Ten en cuenta que el formulario predefinido es él mismo un objeto, con sus propias propiedades, como la posición (superior e izquierda), tamaño (altura y anchura), el color, la fuente predeterminada para añadir texto, etc.
10995
11096### Usar un control
11197
11298   Si colocamos un botón (tipo TButton) en el formulario, este tendrá su propio conjunto de propiedades, que puede ser examinado en la ventana **Inspector de Objetos**.
11399
114100   Algunas de las propiedades tienen los mismos nombres que los del Formulario; esto se debe a que muchas propiedades son **heredadas** de algún ancestro común de ambas clases, que establece cómo son las propiedades que se definen y manejan por las clases descendientes.
115101
116-<div class="floatleft">
117-
118-<figure>
119-<img src="lazarus.UnFormularioConBoton.png" title="Un formulario con un botón" />
120-<figcaption>Un formulario con un botón</figcaption>
121-</figure>
122-
123-</div>
124-
125-<div class="floatright">
126-
127-<figure>
128-<img src="lazarus.InspectorTButton.png" title="Las propiedades del botón" />
129-<figcaption>Las propiedades del botón</figcaption>
130-</figure>
131-
132-</div>
133-
134-<div class="center">
102+![](/wiki-images/d/d4/Lazarus.UnFormularioConBoton.png)
135103
136-<figure>
137-<img src="Lazarus_Editor_Codigo_form.png" title="El código de la clase del formulario" />
138-<figcaption>El código de la clase del formulario</figcaption>
139-</figure>
104+![](/wiki-images/8/84/Lazarus.InspectorTButton.png)
140105
141-</div>
106+![](/wiki-images/f/f5/Lazarus_Editor_Codigo_form.png)
142107
143108   Además de la pestaña *Propiedades*, el Inspector de Objetos ofrece una pestaña llamada **Eventos**, que da acceso a Manejadores de Eventos que son los métodos de la aplicación que se ocupan de responder, por ejemplo, a un clic de ratón (OnClick) o a algún cambio en la posición, tamaño o cualquier otra propiedad (OnChange).
144109
145110   La imagen física del botón en el formulario, junto con todas sus propiedades y métodos de manejo de evento, deben considerarse como una sola entidad, un **Objeto** en Pascal.
146111
147112## Extensiones al Pascal estándar para Orientación a Objetos
148113
149114   La estructura registro de Pascal es ampliada para definir otras estructuras, cómo **object** (objeto) y **class** (clase):
150115
151116### Objeto (*object*)
152117
153118   Un objeto es un tipo especial de registro. El registro contiene todos los campos que se declaran en la definición del objeto, al igual que un registro convencional, pero ahora los procedimientos y funciones pueden ser declarados como parte del registro y se mantienen como punteros a los métodos asociados con el tipo del objeto.
154119
155120   Por ejemplo, un objeto podría contener un conjunto de valores reales, junto con un método de cálculo de la media de estos.
156121
157122``` pascal
158123 Type
159124 TMedia = Object
160125 CuantosValores: Integer;
161126 Valores: Array [1..200] of Real;
162127 Function Media : Real; {calculo de la media de los valores de la matriz}
163128 End;
164129```
165130
166131   Los objetos pueden *heredar* los campos y los métodos del objeto *padre*. Esto significa que estos campos y métodos pueden ser utilizados como si se incluyesen entre los objetos declarados en la definición del objeto *hijo*.
167132
168133   Por otra parte, se introduce el concepto de visibilidad: campos, procedimientos y funciones pueden ser declaradas como públicos, protegidos o privados. De forma predeterminada, los campos y métodos son públicos y pueden ser exportados fuera de la unidad actual. Los campos y métodos protegidos sólo están disponibles para los objetos que sean descendientes del objeto en que se declaran. Los campos o métodos que se declaran privados sólo son accesibles dentro de la unidad en que son declarados: su alcance se limita a la sección *implementation* de la unidad.
169134
170135### Clase (*class*)
171136
172137   Los objetos no son usados con frecuencia por sí mismos en FreePascal y Lazarus; en lugar de ello, se utilizan las Clases. Una clase se define casi de la misma manera que un objeto, sólo que es un puntero a un objeto en lugar del objeto en sí. Técnicamente, esto significa que la clase se asigna al [montículo](http://es.wikipedia.org/wiki/Heap) de un programa, mientras que los objetos se asignan a la [pila](http://es.wikipedia.org/wiki/Stack) del mismo.
173138
174139   Este es un ejemplo sencillo de declaración de una clase típica ([clase TPen](http://lazarus-ccr.sourceforge.net/docs/lcl/graphics/tpen.html)):
175140
176141``` pascal
177142 {-----------------------------------------}
178143 {ejemplo de definición de la clase TPen en la LCL}
179144 {-----------------------------------------}
180145type
181146 TPen = class(TFPCustomPen)
182147 private
183148 FHandle: HPen;
184149 FColor: TColor;
185150 FPenHandleCached: boolean;
186151 procedure FreeHandle;
187152 protected
188153 procedure DoAllocateResources; override;
189154 procedure DoDeAllocateResources; override;
190155 procedure DoCopyProps(From: TFPCanvasHelper); override;
191156 procedure SetColor(const NewColor: TColor; const NewFPColor: TFPColor); virtual;
192157 procedure SetFPColor(const AValue: TFPColor); override;
193158 function GetHandle: HPEN;
194159 procedure SetHandle(const Value: HPEN);
195160 procedure SetColor(Value: TColor);
196161 procedure SetMode(Value: TPenMode); override;
197162 procedure SetStyle(Value: TPenStyle); override;
198163 procedure SetWidth(value: Integer); override;
199164 public
200165 constructor Create; override;
201166 destructor Destroy; override;
202167 procedure Assign(Source: TPersistent); override;
203168 property Handle: HPEN read GetHandle write SetHandle;
204169 published
205170 property Color: TColor read FColor write SetColor default clBlack;
206171 property Mode default pmCopy;
207172 property Style default psSolid;
208173 property Width default 1;
209174 end;
210175```
211176
212177   Resaltar que esta clase es definida como descendiente de otra clase, *TFPCustomPen*, que es el **padre** o **ancestro** de la que **hereda** todas sus propiedades y métodos. La clase tiene sus campos agrupados bajo las secciones
213178
214179- **private** (privado) - esto significa que los elementos definidos aquí sólo están disponibles o visibles a otras clases o procedimientos o función que se definan dentro de esta misma unidad de programa (este caso la unidad es *Graphics*, por lo que cualquiera de las otras clases en ella definidas, tales como *TBitMap*, *TPicture*, etc. pueden utilizarlos). Son esencialmente variables locales (por ejemplo,*FColor*,*FPenHandleCached*) o los métodos utilizados a nivel local (*FreeHandle*), pera que puedan utilizarse o referirse desde los elementos declarados en las secciones **protected** o **public**.
215180- **protected** (protegido) - los elementos aquí definidos sólo están disponibles o visibles a las clases que son descendientes de esta clase, y por tanto heredan sus propiedades y métodos
216181- **public** (público) - los elementos aquí definidos están disponibles desde cualquier otra unidad de programa que incluya esta unidad en su cláusula [[Glossary/es|Uses]]
217182- **published** (publicado) - El ámbito es el mismo que en el caso de la sección **public**, pero el compilador generará información de tipo necesaria para el almacenamiento automático de la clase. Habitualmente los elementos aquí listados son los que aparecen en el Inspector de Objetos de Lazarus; si no existe sección *published* todos los elementos de la sección *public* aparecerán en el Inspector de Objetos.
218183
219184### Métodos
220185
221186   Un método es exactamente los mismo que un procedimiento o una función mormales, la diferencia es que puede tener directivas adicionales.
222187
223188   Algunos de los métodos definidos anteriormente se etiquetan con la directiva **virtual**, otros han sido etiquetados con la directiva **override**.
224189
225190- **virtual** significa que el tipo real de la instancia actual de un método no se conoce en tiempo de compilación, pero se selecciona en tiempo de ejecución dependiendo de quién y cómo en realidad ejecute el método. Podría ser considerado como un [comodín](http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&TIPO_BUS=3&LEMA=comod%EDn) en la definición de la clase
226191
227192- **override** significa que en tiempo de ejecución a nivel local, la definición dada aquí tomará el lugar de la definición heredada del ancestro de la clase, sobre todo si esta es **virtual**. Si desea utilizar el método definido en la clase ancestro, es necesario recurrir a él explícitamente con la cláusula **inherited**.
228193
229194   Los métodos sin la directiva *virtual* u *override* son **estáticos** (lo habitual en Pascal). Aquellos con la directiva *virtual* u *override* son métodos **dinámicos**.
230195
231196   Tipos especiales de métodos son:
232197
233198- **Create** - el **constructor** de la clase, que se encarga de la asignación de memoria, así como la recogida de toda la información necesaria y de configurar e iniciar las diversas propiedades.
234199
235200- **Destroy** - el **destructor** de la clase, que elimina todas los elementos de la clase del sistema en forma ordenada y lógica, y devuelve todos los recursos utilizados por la misma, para que el sistema pueda reutilizarlos.
236201
237202### Propiedades
238203
239204   Las propiedades son semejantes a los campos de los registros convencionales de Pascal, pero pueden tener las especificaciones **read** y/o **write**
240205
241206- **read** especifica el campo o la función que devuelve el resultado del tipo correcto para la propiedad. En el ejemplo anterior, la propiedad *Color* tiene especificado que la variable local *FColor* devolverá el valor de la propiedad. Si una propiedad especifica un **read** pero no un **write**, será de sólo lectura.
242207
243208- **write** especifica el campo, la función o procedimiento que almacenará el valor de la propiedad en una ubicación determinada. En el ejemplo, *Color* tiene especificado *SetColor* como *write*, por lo que será este procedimiento (definido en la sección **protected**) el que escribirá el valor del color en la ubicación destinada para ello, *FColor* en este caso. Si una propiedad especifica un **write** pero no un **read**, será de sólo escritura.
244209
245210- **default** - Resaltar que es posible establecer un valor **por defecto** para una propiedad. Por ejemplo, *Color* a la que aquí se da el valor por defecto *clBlack* (negro) en el momento de su creación. Posteriormente se puede dar un valor diferente, por una asignación en el programa, o mediante el Inspector de Objetos.
246211
247212## Extensiones al lenguaje de Free Pascal
248213
249214   FPC incluye varias extensiones al lenguaje de la sintaxis "estándar" de Pascal para dar soporte a la programación orientada a objetos,
250215
251216- Objetos (chapter 5) [[Programming Using Objects]]
252217- Clases (chapter 6) [[Programming Using Classes]]
253218- Interfaces (chapter 7) [[Programming Using Interfaces]]
254219- Genéricos (chapter 8) [[Programming Using Generics]]
255220
256221   Estas extensiones se describen en los capítulos indicados de la Guía Referencia del lenguaje de FPC: <http://www.freepascal.org/docs.var>. Enlaces a páginas de tutoría para cada concepto se incluyen arriba.
257222
258223   La Guía de Referencia del lenguaje incluye diagramas de sintaxis y otros detalles que no figuran en esta tutoría introductoria.
259224
260225   De las cuatro características enumeradas anteriormente, **Objetos** y **Clases** forman la base de la programación orientada a objetos (POO) en FPC y Lazarus. Para los novatos en POO, la sección **Objetos** incluye muchos conceptos introductorios y la sección **Clases** elude la repetición enfatizando las similitudes y diferencias con la sintaxis de **Objetos**.    En general la implementación de **Classes** parece ser usada más ampliamente por los desarrolladores Lazarus que Delphi. A menudo la palabra "objetos" se utiliza para referirse a lo que es en realidad una "clase" en el dialecto **Clases** de la POO en FPC.
261226
262227   Estos documentos están redactados para minimizar cualquier confusión de terminología, pero fuera de este documento, el término "objeto" a menudo se refiere a los objetos creados a partir de una **clase**. De hecho, la librería de tiempo de ejecución (RTL) de FPC incluye una biblioteca con base de **clases** llamada *TObject*.
263228
264229   Los usuarios familiarizados con la implementación POO del viejo Turbo Pascal, pueden omitir, si quieren, la sección sobre Clases ya que la implementación de objetos se basa en el dialecto de Turbo Pascal. La sección **Clases** resultará familiar a los usurios de Delphi ya que está basada en la sistaxis de este. Ten en cuenta que bastante de lo escrito en la sección **Clases** hace refencia a conceptos de la sección **Objetos**. Para los desarrolladores familiarizados con diversos dialectos Object Pascal en Apple, cómo THINK y MPW, ni los dialectos de objetos ni los de clases de FPC proporcionan una vía de migración directa. En marzo de 2009, hay discusiones en la lista de correo sobre Mac Pascal que pueden proporcionar algún apoyo al compilador (nueva sintaxis) para acceder al marco de *Objective C/Cocoa* de Apple.
265230
266231### Conceptos Generales de Pascal Orientado a Objetos
267232
268233   La POO provee formas distintas para manejar y encapsular datos y dirigir el flujo del programa en comparación con otras caracteristicas y estructuras disponibles el el lenguaje de programación.
269234
270235   La POO a menudo se presta al modelado de ciertas aplicaciones, tales como interfaces de usuario gráficas (GUI) y sistemas físicos de una manera que parece más natural. Sin embargo la POO no es apropiada para todas las aplicaciones. El control del programa no es tan explícito como en la más básica construcción procedimental Pascal. Para obtener el máximo beneficio de la POO, se requiere, a menudo, la comprensión de grandes bibliotecas de clases lo que puede traducirse en una empinada curva de aprendizaje. El mantenimiento de grandes aplicaciones de código POO tiene sus ventajas e inconvenientes respecto a mantener código estrictamente procedural. Hay muchas fuentes para el aprendizaje de análisis orientado a objetos, diseño y técnicas de programación que están fuera del alcance de esta guía.
271236
272237   Hay numerosos lenguajes de programación que incorporan características de POO como extensiones o en la base del mismo. Por tanto, hay muchos términos diferentes para describir conceptos OO. Incluso dentro de FPC, algunos términos se solapan. En general, la POO por lo común consiste en el concepto de un objeto de programación (o unidad de información), que de forma explícita combina y encapsula un conjunto relacionado de datos y procedimientos que actúan sobre los datos. Estos datos son generalmente persistentes durante la ejecución del programa, pero con mecanismos para reducir algunos de los problemas inherentes a la declaración de variables globales. Además, los lenguajes OOP permiten a los objetos, de modo incremental, ser modificados y/o ampliados sobre la base del objeto previamente definido. Esta característica está relacionada generalmente con los términos *herencia* y *polimorfismo*. Muchos lenguajes POO utilizan los términos *método* o *mensaje*, refiriéndose a los procedimientos que pertenecen a un objeto. Gran parte del poder de la POO se debe al enlace dimámico en tiempo de ejecución en lugar de enlazar en la compilación. Este enlace dinámico de los métodos es similar al uso de variables de procedimiento y parámetros de procedimiento, pero con una cohesión sintáctica mayor, la encapsulación con los datos está relacionada con heredar también el comportamiento de los métodos previamente definidos. Las páginas que siguen presentan un wiki como punto de partida para descubrir más sobre el análisis, diseño y programación a la manera de la Orientación a Objetos.
273238
274239## Más información
275240
276241   Este artículo sólo ha arañado la superficie del tema. Para más detalles, se recomienda encarecidamente leer los [**manuales de FreePascal**](http://lazarus-ccr.sourceforge.net/fpcdoc/ref/ref.html) , especialmente los capítulos 4 [**Objetos**](http://lazarus-ccr.sourceforge.net/fpcdoc/ref/refch4.html#x43-460004) y 5 [**Clases**](http://lazarus-ccr.sourceforge.net/fpcdoc/ref/refch5.html#x50-560005).
277242
278243## Ver también
279244
280245- [[Console Mode Pascal/es|Programación con Pascal en modo consola]]
281246
282247## Enlaces externos
283248
284249- [Programación orientada a objetos](http://es.wikipedia.org/wiki/Programación_orientada_a_objetos)
285250- [Análisis y diseño orientado a objetos](http://es.wikipedia.org/wiki/Análisis_y_diseño_orientado_a_objetos)
286251- [Diseño orientado a objetos](http://es.wikipedia.org/wiki/Diseño_orientado_a_objetos)
287252
288253- Versión en castellano (español) iskraelectrica (jldc) / agosto de 2010.
289254
290255---
291256*From the Free Pascal wiki, page "Object Oriented Programming with Free Pascal and Lazarus/es", as it stood on 2020-02-21 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
292257Category: Castellano
293258Category: Español

Back to history