Sign in Join
Wiki copytemporary

Code Conversion Guide/es: what changed

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

OldNewLine
11### Guía de conversión de código
22
33   Esta página trata sobre cómo trasladar o convertir código existente en Delphi o Kylix para que trabaje con el compilador [[Free Pascal]] (FPC) y el IDE Lazarus. Aunque Lazarus y el Free Pascal Compiler tienen aspectos en común con Delphi y Kylix, no son clones. Hay numerosas diferencias en las llamadas a librerías y en las convenciones utilizadas... y en muchas otras áreas, FPC es más rico y puede ser más exigente sobre la corrección de la sintaxis. Por favor lee [[Lazarus For Delphi Users|Lazarus para usuarios de Delphi]] una guía descriptiva de muchas de las diferencias de funcionamiento.
44
55   El propósito de esta guía es documentar algunas diferencias específicas que son frecuentes encontrar en el proceso de conversión de código al trasladar código existente desde Delphi a FPF/Lazarus.
66
77   Este documento se ha ubicado en la zona de 'wiki base de conocimientos' por lo que puede ser fácilmente ampliado por cualquiera que se haya tropezado con un problema singular y quiera poner su experiencia en común con otras personas.
88
99## Seleccionar un componente o librería para convertir
1010
1111### Dónde encontrar código para convertir
1212
1313   Existe una gran cantidad de código disponible en la red que puede ser convertido para el uso con FPC y Lazarus. Esta página [[Page Of Code Sites]] es sólo un comienzo. Por favor, añada cualquier ubicación buena que conozca. TurboPower Software ha publicado recientemente la totalidad de su oferta comercial bajo la licencia MPL. Una lista de los paquetes disponibles se encuentra [aquí](http://sourceforge.net/users/tpsfadmin/).
1414
1515   Para evitar duplicar esfuerzos, los paquetes que ya han sido convertidos están listados en la página [[Components and Code examples|Componentes y código de ejemplo]]. Si has convertido un paquete o estás trabajando en ello, haz una reseña en la página [[Current conversion projects|Proyecto actualmente en conversión]].
1616
1717### Licencias
1818
1919   Las licencias del código existente varían desde libre/dominio público hasta versiones restrictivas que prohiben modificar, redistribuir y el uso comercial. Antes de convertir un un paquete, es conveniente examinar los téminos de su licencia y asegurarse de que es compatible con Lazarus y FPC. La selección de la licencia es especialmente importante con componentes, cuya mera ubicación en un formulario puede imponer una licencia no deseada o incompatible para toda la aplicación.
2020
2121   Cuando conviertas componentes, respeta los términos del autor original y mantén todos los derechos de autor y los encabezados de licencia con sus direcciones de correo y url. Es cortés y a veces muy útil informar al autor de que sus componente va a ser convertido... especialmente si el componente está bajo una licencia restrictiva. Un interés renovado sobre un componente antiguo u olvidado a menudo incita al autor a revisar las restricciones de la licencia original.
2222
2323   En general, Dominio Público ([software](http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&TIPO_BUS=3&LEMA=software) libre), y LGPL/MPL son las más flexibles para distribuir componentes. Para más información, [Definición de Fuentas Abiertas (Open Source)](http://www.opensource.org/docs/definition.php) es un buen sitio para empezar. Asimismo hay varias comparaciones disponibles para ayudar a clarificar el impacto que los diversos tipos de licencias de obra pueden tener sobre el código que está relacionado con el mismo. Busca sobre los términos "licencia de fuente abierta comparación"
2424
2525### Dependencias
2626
2727   Otro punto previo al comienzo del trabajo de conversión, es verificar que el código no tiene una profunda dependencia de otros paquetes que podrían no estar disponibles o representan un reto considerable de conversión. Algunos desarrollos de código libre son extensiones de paquetes propietarios/cerrados, que a menudo ya no están disponibles o lo están bajo licencias inapropiadas.
2828
2929### Acerca del compilador
3030
3131   Ver:
3232
3333- [Problemas conocidos](http://www.freepascal.org/probs.html)
34-- [Fallos no corregidos](http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed) <small> (parece que no funciona)</small>
34+- [Fallos no corregidos](http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed) (parece que no funciona)
3535
3636### Acerca de Sistemas Operativos y Plataformas
3737
3838   Lazarus y el Compilador Libre de Pascal son herramientas multiplataforma y multiarquitectura de desarrollo cruzado, es decir lo escrito en una plataforma puede compilarse ¡y funcionar! en otra. Por contra mucho código Delphi existente ha sido diseñado específicamente para correr sobre la plataforma Intel+Win32. Si el componente candidato tiene mucho código específico win32, tal vez sea más conveniente buscar otra alternativa menos dependiente de la plataforma. Pero no te detengas por ello... ¡es verdaderamente sorprendente lo que el LCL soporta!
3939
4040## Convirtiendo
4141
4242### Configurando el entorno de Lazarus para un proyecto de conversión
4343
4444#### Crear un proyecto de prueba
4545
4646- Poner el código a convertir en un subdirectorio (convertdir, por ejemplo)
4747- Desde Lazarus crear un proyecto nuevo.
4848- Guardar (Archivo-\>Guardar Todo) en el subdirectorio convertdir. Poner nombres significativos a este proyecto y a su unidad principal es optativo.
4949- Abrir la unidad principal del proyecto a convertir.
5050- Añadirla al proyecto: Proyecto-\>Añadir archivo del Editor al Proyecto
5151- Utilice Herramientas-\>Chequeo Rápido de la sintaxis o bien Ejecutar-\>Construir todo para empezar.
5252
5353#### Cuestiones iniciales a tener en cuenta
5454
5555- Las series 1.0.x del compilador distinguen en los nombres de fichero mayúsculas y minúsculas. Si se trabaja con esta versión, es conveniente poner todos los nombres en minúsculas. En caso contrario se producirá el error "Archivo no encontrado"
5656
5757#### Código fuente Delphi VCL y Kylix CLX en Lazarus
5858
5959   Al convertir código fuente Delphi / Kylix, a menudo es útil mirar la declaración para comprobar lo que hace una función concreta. El IDE de Lazarus puede analizar el código Delphi / Kylix. Para ello es necesario configurar las opciones del compilador y las rutas de búqueda. Esto hace más fácilmente utilizando plantillas de proyecto: Entorno-\>Definir editor de CodeTools-\>Insertar plantilla.
6060
6161### Problemas de conversión y soluciones
6262
6363#### Equivalencia de archivos entre Delphi / Kylix y Lazarus
6464
65-<table>
66-<thead>
67-<tr>
68-<th><p>Delphi / Kylix</p></th>
69-<th><p>Descripción</p></th>
70-<th><p>Lazarus</p></th>
71-<th><p>Descripción</p></th>
72-</tr>
73-</thead>
74-<tbody>
75-<tr>
76-<td data-valign="top"><p>.pas</p>
77-<p>.dfm/.xfm,</p>
78-<p>.dcu/.dpu,</p>
79-<p>.dpr(main project file),</p>
80-<p>.res,</p>
81-<p>.dof/.kof</p>
82-<p>---</p>
83-<p>---</p>
84-<p>---</p></td>
85-<td data-valign="top"><p>Delphi Source File, Delphi Form,</p>
86-<p>Delphi Compiled Unit,</p>
87-<p>Delphi Project,</p>
88-<p>Windows Resource File,</p>
89-<p>Delphi Option File</p></td>
90-<td data-valign="top"><p>.pas, .pp .lfm,</p>
91-<p>.o,</p>
92-<p>.lpr</p>
93-<p>---</p>
94-<p>---</p>
95-<p>.lrs,</p>
96-<p>.lpi(main project file),</p>
97-<p>.ppu</p></td>
98-<td data-valign="top"><p>Pascal unit file,</p>
99-<p>Form data file,</p>
100-<p>Compiled unit file,</p>
101-<p>Project file,</p>
102-<p>Resource file,</p>
103-<p>Project options file,</p>
104-<p>Lazarus resource file,</p>
105-<p>Lazarus project information file,</p>
106-<p>FPC unit description file</p></td>
107-</tr>
108-</tbody>
109-</table>
65+**Delphi / Kylix**
11066
67+**Descripción**
68+
69+**Lazarus**
70+
71+**Descripción**
72+
73+.pas
74+
75+.dfm/.xfm,
76+
77+.dcu/.dpu,
78+
79+.dpr(main project file),
80+
81+.res,
82+
83+.dof/.kof
84+
85+---
86+
87+---
88+
89+---
90+
91+Delphi Source File, Delphi Form,
92+
93+Delphi Compiled Unit,
94+
95+Delphi Project,
96+
97+Windows Resource File,
98+
99+Delphi Option File
100+
101+.pas, .pp .lfm,
102+
103+.o,
104+
105+.lpr
106+
107+---
108+
109+---
110+
111+.lrs,
112+
113+.lpi(main project file),
114+
115+.ppu
116+
117+Pascal unit file,
118+
119+Form data file,
120+
121+Compiled unit file,
122+
123+Project file,
124+
125+Resource file,
126+
127+Project options file,
128+
129+Lazarus resource file,
130+
131+Lazarus project information file,
132+
133+FPC unit description file
134+
111135   Así pués un archivo .dcu de Delphi contiene, más o menos, la información de los archivos .o y .ppu de FPC. Un .ppu es principalmente la cabecera (interfaz), y el .o la parte de la implementación. Las funciones "en línea" (*inline*) que residen en el .ppu, son la principal excepción a esta regla.
112136
113137#### Convirtiendo proyectos/formularios/unidades de Delphi a Lazarus
114138
115139   Utiliza la herramienta de conversión de las nuevas versiones de Lazarus para la conversión automática. La mayoría de las funciones se explican más adelante en esta página. Más información aquí:
116140
117141` `[`http://wiki.lazarus.freepascal.org/Delphi_Converter_in_Lazarus`](http://wiki.lazarus.freepascal.org/Delphi_Converter_in_Lazarus)
118142
119143   El siguiente texto explica las diferencias entre Delphi y Lazarus y cómo convertir manualmente.
120144
121145   Cambia el nombre o copia el archivo .dpr a un .lpr. Comenta o elimina la directiva
122146
123-<div class="dir">
124-
125147{\$R *.res}
126148
127-</div>
128-
129149y añade la directiva
130150
131-<div class="dir">
132-
133151{\$mode delphi}{\$H+}
134152
135-</div>
136-
137153o bien esta otra
138154
139-<div class="dir">
140-
141155{\$mode objfpc}{\$H+}
142156
143-</div>
144-
145157en el .lpr. El IDE de Lazarus ayuda en esta cuestión en la opción del menú Herramientas "Convertir proyecto de DElphi a proyecto de Lazarus...". En ella se pide un .dpr (proyecto Delphi) y lo convierte en un .lpr; además, crea el archivo. lpi archivo y convierte todas las demás unidades.
146158
147159   Muchos formularios de Delphi se pueden convertir para trabajar en Lazarus utilizando el asistente del IDE, que se encuentra en el menú Herramientas como tema "Convertir archivo DFM a LFM". Utilice el diálogo, seleccione el dfm y el convertidor hará el resto.
148160
149161   Si necesitas convertir una unidad (con o sin formulario), Lazarus incluye una opción "Convertir unidad de Delphi a unidada de Lazarus" que haá por tí lo siguiente:
150162
1511631. poner en minúsculas los nombre de archivo de inclusiones y de la sección uses.
1521642. convierte el .dfm a .lfm (normalmente sin comprobar el contenido, únicamente el formato)
1531653. crea un .lrs vacío (el contenido se creará después)
1541664. añade la directiva
155- <div class="dir">
156-
157167 {\$mode delphi}
158-
159- </div>
1601685. sustituye la referencia a la unidad windows por LCLIntf
1611696. añade la unidad LResources si es preciso (si se usa .lrs se pondrá
162- <div class="dir">
163-
164170 uses LResources
165171
166- </div>
167-
168172 en la sección de implementación)
1691737. elimina las unidades variants
1701748. elimina la directiva
171- <div class="dir">
172-
173175 {\$R *.dfm}
174-
175- </div>
1761769. crea la sección de iniciación y añade en ella la directiva
177- <div class="dir">
178-
179177 {\$i unit.lrs}
180178
181- </div>
182-
183179   Esto permite una rápida y fácil conversión de la mayoría de las unidades de Delphi a Lazarus. No se realiza ninguna validación ni cambios automáticos de sintaxis, por lo que cualquier cambio en la sintaxis se hará manualmente, así como de unidades referenciadas, sustitución de algunos componentes,..., aunque hay asistentes de ayuda disponibles para facilitar esta tarea, especialmente en el caso de la reparación de formularios (.lfm)
184180
185181#### Seleccionar el modo correcto de compilación
186182
187183   El compilador FPC soporta 5 modos diferentes de pascal. Por ejemplo, TP para turbo pascal, que permite compilar unidades turbo pascal. Está también el modo de compatibilidad DELPHI, cuya utilización permite una fácil conversión del código existente. El modo preferido en Lazarus es OBJFPC, muy parecido a DELPHI pero menos ambiguo en la sintaxis. Estos son puntos importantes:
188184
189185   El modo se puede seleccionar en la línea de ordenes o al principio del código fuente. Utillizar la línea de ordenes tien la ventaja de que no hay que cambiar el código fuente, pero la desventaja de que hay que documentarlo para los demás.
190186
191187   Muchas unidades DELPHI compilan con FPC añadiendo a las mismas
192188
193189`{$IFDEF FPC}`\
194190`  {$MODE DELPHI}`\
195191`{$ENDIF}`
196192
197193inmediatamente a continuación del nombre de la unidad.
198194
199195   Para más detalles acerca de los modos de [[Free Pascal]] FPC ver [Documentación de Free Pascal](http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html)
200196
201197#### Consideraciones sobre codificación para Multiplataforma
202198
203199- El código Ensamblador en línea (inline assembler) es problemático, dado que es específico para la arquitectura Intel. Muchos desarrolladores hacen el prototipo en Pascal y después utilizan su equivalente ensamblador optimizado. Por suerte TurboPower hizo esta operación dejando también el código Pascal. Si este es el caso del paquete que estás convirtiendo, repón el código pascal.
204200- No hagas referencias a direcciones concretas de memoria, como el área de BIOS. Averigua lo que el código necesita y busca una alternativa portable entre plataformas.
205201- No utilices trucos específicos de procesador (por ejemplo, Intel TSC) sin encerrar ese código en un selector (IFDEF) para esa plataforma... y provee una alternativa para entornos que no tienen esa máquina concreta.
206202- Si es necesario código específico para un SO, haz uso de bloques selectores (IFDEF). Ver más abajo una lista de macros.
207203
208204#### Variables, "defines" y macros útiles del compilador
209205
210206   Para escribir código que se adapte, y se comporte de forma distinta según el sistema, se utiliza la directiva
211207
212-<div class="dir">
213-
214208{\$IFDEF identificador}.
215209
216-</div>
217-
218-- <div class="dir">
219-
220- {\$IFDEF FPC}
221-
222- </div>
210+- {\$IFDEF FPC}
223211
224212   Esta se define cuando se utiliza el compilador FPC. Es útil para escribir código válido tanto para Delphi como para FPC. Por razones de compatibilidad en FPC se define la macro DELPHI en modo Delphi, por lo tanto **no se puede usar {\$IFNDEF DELPHI}**.
225213
226-- <div class="dir">
227-
228- {\$IFDEF LCL}
229-
230- </div>
214+- {\$IFDEF LCL}
231215
232216   Esta se define para utilizar el paquete LCL. Es útil para escribir código que funcione con LCL y Delphi.
233217
234-- <div class="dir">
235-
236- {\$IFDEF LCLGtk}
237-
238- </div>
218+- {\$IFDEF LCLGtk}
239219
240220 ,
241221
242- <div class="dir">
243-
244222 {\$IFDEF LCLWin32}
245223
246- </div>
247-
248224 ,
249225
250- <div class="dir">
251-
252226 {\$IFDEF LCLQt}
253227
254- </div>
255-
256228 , ...
257229
258230   Esta varible se define para utilizar el LCL en una determinada plataforma, usando los componentes visuales (widgetset).
259231
260-- <div class="dir">
261-
262- {\$IFDEF Unix} // para Linux, BSD, Mac OS X, Solaris
263-
264- </div>
232+- {\$IFDEF Unix} // para Linux, BSD, Mac OS X, Solaris
265233
266234 ,
267235
268- <div class="dir">
269-
270236 {\$IFDEF Win32}
271237
272- </div>
273-
274238 ,
275239
276- <div class="dir">
277-
278240 {\$IFDEF Linux}
279241
280- </div>
281-
282242 // para Linux,
283243
284- <div class="dir">
285-
286244 {\$IFDEF Darwin}
287245
288- </div>
289-
290246 // para OS X,
291247
292- <div class="dir">
293-
294248 {\$IFDEF WinCE}
295249
296- </div>
297-
298250 // para WinCE,...
299251
300252   Determina la utilización de FPC para un deteminado SO como destino. Delphi define "Linux", "Win32" y "MSWindows". [[Free Pascal]] funciona en muchas más plataformas y por tanto se recomienda utilizar especificaciones más generales. Por ejemplo "Unix" está definido para Linux, FreeBSD, NetBSD y OpenBSD, en los que Lazarus ya funciona. Para código que corra tanto en FPC cómo en Delphi utilice:
301253
302254``` pascal
303255 {$IFDEF Linux}
304256 {$DEFINES Unix}
305257 {$ENDIF}
306258```
307259
308260para que funcione en Kilix.
309261
310-- <div class="dir">
311-
312- {\$IFDEF ENDIAN_BIG}
313-
314- </div>
262+- {\$IFDEF ENDIAN_BIG}
315263
316264   Esta variable se definirá para procesadores como el powerpc (ordenadores Apple, hasta el MacOSX 10.2, por ejemplo) que tienen la disposisicón del byte invertida respecto de los procesadores compatibles intel.
317265
318-- <div class="dir">
319-
320- {\$IFDEF ENDIAN_BIG}
321-
322- </div>
266+- {\$IFDEF ENDIAN_BIG}
323267
324268   Para más detalles ver [Documentación de FPC](http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21).
325269
326270#### Soporte para 32bit / 64 bit
327271
328272   Los punteros para 64bit requieren 8 octetos en vez de los 4 de 32bit. El tipo entero (integer) permanece de 32bit por compatibilidad. Esto supone que ya no es posible transformar enteros en punteros y viceversa mediante "typecast". FPC define dos nuevos tipos: PtrInt y PtrUInt. PtrInt es un entero con signo de 32bit en plataformas 32 bit y de 64 bit en plataformas 64bit. PtrUInt funciona igual, excepto que es un entero sin signo. Por tanto, para código que funcione tanto en FPC cómo en Delphi hay que escribir esto:
329273
330274``` pascal
331275 {$IFNDEF FPC}
332276 type
333277 PtrInt = integer;
334278 PtrUInt = cardinal;
335279 {$ENDIF}
336280```
337281
338282   Sustituya todas las ocurrencias de **integer(SomePointerOrObject)** por **PtrInt(SomePointerOrObject)**.
339283
340284   Para más información ver Guía de programación para multiples plataformas [[Multiplatform Programming Guide]]
341285
342286#### Buscando un identificador *perdido*
343287
344288   La organización de la LCL y de la VCL son diferentes. Cuándo tenemos un error de compilación "no encontrado" sobre una clase o un identificador, lo más probable es que la definición de los mismos se encuentre en una unidad distinta de la esperada. Una completa referencia cruzada se puede encontrar buscando en lazarus/docs/xml o en el directorio lcl.
345289
346290   Por ejemplo, el común tbutton, dará error en Delphi, ya que se encuentra en una unidad llamada buttons.pp. El siguiente mandato encuentra la unidad correcta rápidamente (en el directorio fuente lazarus):
347291
348292``` bash
349293 grep -in ' tbutton =' lcl/*
350294```
351295
352296   (Nota del traductor: esta sintaxis de grep no da resultados en windows. Yo en windows utilizo el 'buscar' del SO en el ámbito del directorio en que está instalado lazarus, para archivos .pas o .pp que contienen referencias al término deseado. Incluso funciona, a veces, la utilidad del IDE de buscar la declaración)
353297
354298#### Diferencias mayores entre las unidades de Lazarus y las de Delphi
355299
356300   **¡Por favor, añada lo que sepa sobre este tema!**
357301
358302- Windows -\> Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
359303
360304   Dado que la LCL no es específica de windows, el código para acceder la API win32 está condensada en interfaces separadas que son accedidas desde la unidad *LCLIntf*. Hay que tener en cuenta que Lazarus no intenta emular win32, por lo que muchas funciones no están incluidas y otras no funcionan exactamente como sus homólogas win32. Estas funciones existen únicamente para dar compatibilidad con Delphi y deben ser utilizadas únicamente para una migración rápida y "sucia". Las definiciones tipos están fragmentadas, por lo que es necesaria la unidad *LCLType*, y a veces también *VCLGlobals*. La unidad LCLProc también contiene algunas funciones que pueden ser útiles para manipulaciones a bajo nivel como "FreeThenNil" tal como se hace en Delphi 5 y superiores o "DeleteAmpersands" para eliminar los "&" sobrantes de una cadena de control (vs & & & etc). Hay que incluir la unidad *Interfaces* en la cláusula *uses* del archivo .lpr para iniciar adecuadamente el conjunto de controles apropiado (widgetset).
361305
362306- Messages -\> LMessages
363307
364308   Los mensajes de control (TControl Messages) para los eventos de retrollamada de win32 en el formato *WM_CALLBACK* y sus estructuras asociadas se encuentran en la unidad Delphi *Messages*. En la LCL estos tipos de mensajes y sus estructuras están usualmente en *LMessages*, normalmente con un cambio en el nombre, de WM a LM, así, por ejemplo, *WM_MOUSEENTER* se transforma en *LM_MOUSEENTER*, y *TWMMouse* en *TLMMouse*.
365309
366310- Graphics, Controls -\> GraphType, GraphMath, Graphics, Controls
367311
368312   Para simplificar las cosas y romper la complejidad de las referencias entre unidades, muchos tipos han sido abstraidos en una unidad común llamada *GraphType*, que incluye lo que en Deplhi se encuentra en las unidades *Graphics* o *Controls*. Así que tendrá que ser incluida. Otra unidad igualmente incompatible con Delphi es *GraphMath*, que añade el tipo *TFloatPoint* para precisión, rutinas para trabajar con curvas de Bézier, líneas y arcos, sobrecarga de algunos operadores para trabajar con *TPoints* y *TRect*, como, por ejemplo, punto1: = punto2 + punto3, y comparar dos *Trect* así *if (rect1 = rect2) then* ...such as for instance Point1 := Point2 + Point3, and comparing two rects like if (rect1 = rect2) then ...
369313
370314- Mask -\> MaskEdit
371315
372316   Para racionalizar las convenciones sobre nombres, la unidad para la clase *TMaskEdit* se llama *MaskEdit* y no el confuso *Mask* de muchas versiones Delphi.
373317
374318- StdCtrls-\>StdCtrls,Buttons
375319
376320   En muchas versiones de Delphi *TButton* se encuentra en *StdCtrls*, mientras que *TSpeedButton* y *TBitBtn* están en *Buttons*. Por consistencia y simplicidad la LCL ubica todos los tipos de botones en la unidad *Buttons*, es por tanto una buena idea incluirla para evitar problemas de conversión.
377321
378322#### Diferencias entre Delphi y FPC/LCL sobre propiedades y métodos
379323
380324- EL *TBitmap* de la LCL tiene una propiedad lienzo (*canvas*)
381325- En la LCL las propiedades de las dimensiones de la ventana (*TForm.ClientWidth/ClientHeight*) y las proiedades de las dimensiones de su área cliente (*TForm.Width/Height*)tienen el mismo valor. Esto es así porque los valores de las dimensiones de la ventana no incluyen las dimensiones de su marco. Ver: [[Lazarus Faq|Preguntas sobre Lazarus]]
382326
383327#### Diferencias semánticas
384328
385329##### Orden de evaluación de los parámetros
386330
387331
388332Delphi garantiza que los parámetros se evalúan siempre de izquierda a derecha. FPC no garantiza esto, y evaluará los parámetros en el orden que produzca un código más optimo.
389333
390334##### Procedimientos y funciones anidadas como variables de procedimiento
391335
392336
393337Delphi pasa el puntero al marco (framepointer) del procedimiento padre siempre en la pila, y es quién llama el que debe quitarlo. Esto significa que no puede acceder a las variables del padre, y sin embargo puede pasar la dirección de una función anidada a otra función que podrá usarla como cualquier variable de procedimiento.
394338
395339
396340FPC, por otro lado pasa el puntero al marco del procedimiento padre cómo el primer parámetro oculto de acuerdo a las convenciones actuales de llamada, esto significa que si se llama a un procedimiento anidado como si fuese una variable de procedimiento ordinaria todos los parámetros pasados se moverán una posición.
397341
398342
399343En resumen, no llames a procedimientos anidados a través de variables de procedimiento.
400344
401345#### Diferencias de sintaxis
402346
403347##### **¡Por favor, añada lo que sepa sobre este tema!**
404348
405349
406350Debido al rigor inherente a FPC, algunos cambios en la sintaxis son necesarios, aunque con la directiva *{\$Mode Delphi}* podemos relajarnos al estilo Delphi. No obstante lo cual, es recomendable cumplir con las reglas de sintaxis del modo *{\$Mode ObjFPC}*, incluso cuando el código va a ser compartido entre Delphi y la LCL. Algunos son simples buenas prácticas de escritura de código, y otras porque el modo Delphi no es completamente exacto, o porque el código aceptable en Delphi no funciona como debe con FPC, incluso aunque compila. Para ello, aunque no todo es estrictamente necesario, los siguientes cambios deben considerarse obligatorios:
407351
408352##### Al asignar una función de manejo de un evento, antepon un "@" a su nombre
409353
410354
411355Por ejemplo, se puede asignar la llamada a un botón manualmente
412356
413-<table>
414-<thead>
415-<tr>
416-<th><center>
417-<p>Delphi</p>
418-</center></th>
419-<th><center>
420-<p>OBJFPC</p>
421-</center></th>
422-</tr>
423-</thead>
424-<tbody>
425-<tr>
426-<td><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
427-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">if</span> <span class="kw">not</span> Assigned(MiBoton.OnClick) <span class="kw">then</span> </span>
428-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> MiBoton.OnClick:= UnaFuncion;</span>
429-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> <span class="co">//@ no necesario</span></span>
430-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//más código...</span></span>
431-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span></code></pre></div></td>
432-<td><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
433-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">if</span> <span class="kw">not</span> Assigned(MiBoton.OnClick) <span class="kw">then</span></span>
434-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> MiBoton.OnClick:= @UnaFuncion;</span>
435-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="co">//@ Es necesario</span></span>
436-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//más código...</span></span>
437-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span></code></pre></div></td>
438-</tr>
439-</tbody>
440-</table>
357+**Delphi**
441358
359+**OBJFPC**
360+
361+``` pascal
362+ begin
363+ if not Assigned(MiBoton.OnClick) then
364+ MiBoton.OnClick:= UnaFuncion;
365+ //@ no necesario
366+ //más código...
367+ end;
368+```
369+
370+``` pascal
371+ begin
372+ if not Assigned(MiBoton.OnClick) then
373+ MiBoton.OnClick:= @UnaFuncion;
374+ //@ Es necesario
375+ //más código...
376+ end;
377+```
378+
442379##### Al llamar a una variable procedural usar esta sintaxis: ProcNombre()
443380
444381
445382En Delphi no existen diferencias entre el resultado de una función y una variable, en cambio en FPC, la llamada a una función debe llevar los paréntesis, incluso si no hay argumentos. Por ejemplo:
446383
447-<table>
448-<thead>
449-<tr>
450-<th><center>
451-<p>Delphi</p>
452-</center></th>
453-<th><center>
454-<p>OBJFPC</p>
455-</center></th>
456-</tr>
457-</thead>
458-<tbody>
459-<tr>
460-<td><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">With</span> (UnObjeto) <span class="kw">do</span> </span>
461-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
462-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Assigned(OnMiLlamada) <span class="kw">then</span></span>
463-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> OnMiLlamada;</span>
464-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//paréntesis no necesarios</span></span>
465-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span></code></pre></div></td>
466-<td><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">With</span> (UnObjeto) <span class="kw">do</span> </span>
467-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
468-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Assigned(OnMiLlamada) <span class="kw">then</span></span>
469-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> OnMiLlamada();</span>
470-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//los paréntesis son necesarios</span></span>
471-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span></code></pre></div></td>
472-</tr>
473-</tbody>
474-</table>
384+**Delphi**
475385
386+**OBJFPC**
387+
388+``` pascal
389+ With (UnObjeto) do
390+ begin
391+ If Assigned(OnMiLlamada) then
392+ OnMiLlamada;
393+ //paréntesis no necesarios
394+ end;
395+```
396+
397+``` pascal
398+ With (UnObjeto) do
399+ begin
400+ If Assigned(OnMiLlamada) then
401+ OnMiLlamada();
402+ //los paréntesis son necesarios
403+ end;
404+```
405+
476406##### Al obtener los valores de un puntero a registro hay que deshacer antes la referencia
477407
478408
479409En Delphi no es necesario deshacer la referencia a un puntero de registro para acceder a sus valores, se trata, de hecho, cómo si fuese un registro, o culaquier otro objeto. En FPC es necesario deshacer la referencia antes. Un ejemplo,
480410
481-<table>
482-<thead>
483-<tr>
484-<th><center>
485-<p>Delphi</p>
486-</center></th>
487-<th><center>
488-<p>OBJFPC</p>
489-</center></th>
490-</tr>
491-</thead>
492-<tbody>
493-<tr>
494-<td><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">Function</span> DameValores(UnRegistro: PMiRegistro):<span class="dt">Integer</span>;</span>
495-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
496-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Assigned(UnRegistro) <span class="kw">then</span></span>
497-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> Result:=UnRegistro.UnValor</span>
498-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">else</span></span>
499-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> Result:=<span class="dv">0</span>;</span>
500-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span></code></pre></div></td>
501-<td><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">Function</span> DameValores(UnRegistro: PMiRegistro):<span class="dt">Integer</span>;</span>
502-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
503-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Assigned(UnRegistro) <span class="kw">then</span></span>
504-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> Result:=UnRegistro^.UnValor</span>
505-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">else</span></span>
506-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> Result:=<span class="dv">0</span>;</span>
507-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span></code></pre></div></td>
508-</tr>
509-</tbody>
510-</table>
411+**Delphi**
511412
512-##### Para acceder a caracteres de la cadena que es una propiedad de un objeto, esta debe ser encerrada entre paréntesis
413+**OBJFPC**
513414
514-
515-Con Delphi las porpiedades de los objetos se tratan como cualquier otra constante o variable, incluso para acceder directamente a los caracteres individuales de una cadena, pero esto no es posible en FPC, específicamente para propiedades indexadas. PAra hacerlo hay que encerrar la propiedad etnre paréntesis, para diferenciar. Aunque no es necesario en todos los casos, es buena práctica hacerlo así siempre. Por ejemplo,
415+``` pascal
416+ Function DameValores(UnRegistro: PMiRegistro):Integer;
417+ begin
418+ If Assigned(UnRegistro) then
419+ Result:=UnRegistro.UnValor
420+ else
421+ Result:=0;
422+ end;
423+```
516424
517-<table>
518-<thead>
519-<tr>
520-<th><center>
521-<p>Delphi</p>
522-</center></th>
523-<th><center>
524-<p>OBJFPC</p>
525-</center></th>
526-</tr>
527-</thead>
528-<tbody>
529-<tr>
530-<td><div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">Type</span> TUnComponente=<span class="kw">class</span>(TComponent)</span>
531-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="co">//Más código......</span></span>
532-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="kw">Published</span></span>
533-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="kw">Property</span> MiCadena:<span class="dt">String</span> index <span class="dv">3</span> <span class="kw">read</span> GetMiCadena;</span>
534-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//Más código....</span></span>
535-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a><span class="kw">End</span>;</span>
536-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a></span>
537-<span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span></span>
538-<span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a> MiLetra:<span class="dt">char</span>;</span>
539-<span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
540-<span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Length(MiCadena)&gt;<span class="dv">2</span> <span class="kw">then</span></span>
541-<span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> <span class="co">//paréntesis no necesarios</span></span>
542-<span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> MiLetra:= MiCadena[<span class="dv">3</span>];</span>
543-<span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a> <span class="co">//Más código......</span></span>
544-<span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
545-<td><div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">Type</span> TUnComponente=<span class="kw">class</span>(TComponent)</span>
546-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="co">//Más código...</span></span>
547-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="kw">Published</span></span>
548-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="kw">Property</span> MiCadena:<span class="dt">String</span> index <span class="dv">3</span> <span class="kw">read</span> GetMiCadena;</span>
549-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//Más código...</span></span>
550-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="kw">End</span>;</span>
551-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a></span>
552-<span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a><span class="kw">var</span></span>
553-<span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a> MiLetra:<span class="dt">char</span>;</span>
554-<span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a><span class="kw">begin</span></span>
555-<span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">If</span> Length(MiCadena)&gt;<span class="dv">2</span> <span class="kw">then</span></span>
556-<span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a> <span class="co">//paréntesis necesarios</span></span>
557-<span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a> MiLetra:= (MiCadena)[<span class="dv">3</span>];</span>
558-<span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a> <span class="co">//Más código......</span></span>
559-<span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a><span class="kw">end</span>;</span></code></pre></div></td>
560-</tr>
561-</tbody>
562-</table>
425+``` pascal
426+ Function DameValores(UnRegistro: PMiRegistro):Integer;
427+ begin
428+ If Assigned(UnRegistro) then
429+ Result:=UnRegistro^.UnValor
430+ else
431+ Result:=0;
432+ end;
433+```
563434
564-##### Hay que convertir los punteros al tipo real que espera la función con que se utiliza
435+##### Para acceder a caracteres de la cadena que es una propiedad de un objeto, esta debe ser encerrada entre paréntesis
565436
566437
567-En Delphi se puede tener un puntero nulo representando a un objeto. Aunque puede parecer extraño, es corriente que se de especialmente en paquetes de muchos componentes, cómo forma de evitar referencias circulares entre objetos de unidades distintas. En Delphi es posible pasar el puntero nulo a una función que espera un objeto de ese tipo, sin realizar la conversión al tipo real, en FPC hay que realizar la conversión de forma explícita. Por ejemplo:
438+Con Delphi las porpiedades de los objetos se tratan como cualquier otra constante o variable, incluso para acceder directamente a los caracteres individuales de una cadena, pero esto no es posible en FPC, específicamente para propiedades indexadas. PAra hacerlo hay que encerrar la propiedad etnre paréntesis, para diferenciar. Aunque no es necesario en todos los casos, es buena práctica hacerlo así siempre. Por ejemplo,
568439
569-<table style="width: 100;" border="1" align="center"
570- cellpadding="2" cellspacing="2">
440+**Delphi**
571441
572-<tr align="center">
442+**OBJFPC**
573443
574-<td>
444+``` pascal
445+Type TUnComponente=class(TComponent)
446+ //Más código......
447+Published
448+Property MiCadena:String index 3 read GetMiCadena;
449+ //Más código....
450+End;
575451
576-<b> Delphi / ObjFPC</b>
452+var
453+ MiLetra:char;
454+begin
455+ If Length(MiCadena)>2 then
456+ //paréntesis no necesarios
457+ MiLetra:= MiCadena[3];
458+ //Más código......
459+end;
460+```
577461
578-</td>
462+``` pascal
463+ Type TUnComponente=class(TComponent)
464+ //Más código...
465+Published
466+Property MiCadena:String index 3 read GetMiCadena;
467+ //Más código...
468+End;
579469
580-</tr>
470+var
471+ MiLetra:char;
472+begin
473+ If Length(MiCadena)>2 then
474+ //paréntesis necesarios
475+ MiLetra:= (MiCadena)[3];
476+ //Más código......
477+end;
478+```
581479
582-<tr>
480+##### Hay que convertir los punteros al tipo real que espera la función con que se utiliza
583481
584-<td>
482+
483+En Delphi se puede tener un puntero nulo representando a un objeto. Aunque puede parecer extraño, es corriente que se de especialmente en paquetes de muchos componentes, cómo forma de evitar referencias circulares entre objetos de unidades distintas. En Delphi es posible pasar el puntero nulo a una función que espera un objeto de ese tipo, sin realizar la conversión al tipo real, en FPC hay que realizar la conversión de forma explícita. Por ejemplo:
585484
485+Delphi / ObjFPC
486+
586487``` pascal
587488 Unit Unidad1
588489 Type TUnObjeto=class(TComponent)
589490 //Más código...
590491 End;
591492 Procedure HacerAlgo(Value: TSomeObject);
592493 Function GetUnObjeto: TUnObjeto;
593494
594495 Unit Unidad2
595496 Type TUnComponente=class(TComponent)
596497 //Más código...
597498 Published UnObjeto: Pointer;
598499 //Más código...
599500 End;
600501```
601502
602-</td>
503+**Delphi**
603504
604-</tr>
505+**OBJFPC**
605506
606-</table>
507+   -- Aplicación ----------
607508
608-<table>
609-<thead>
610-<tr>
611-<th><center>
612-<p>Delphi</p>
613-</center></th>
614-<th><center>
615-<p>OBJFPC</p>
616-</center></th>
617-</tr>
618-</thead>
619-<tbody>
620-<tr>
621-<td><p>   -- Aplicación ----------</p>
622-<div class="sourceCode" id="cb1"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">var</span> </span>
623-<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> MiComponente: TUnComponente;</span>
624-<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
625-<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> MiComponente.UnObjeto:=GetUnObjeto</span>
626-<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//Más código...</span></span>
627-<span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> HacerAlgo(MiComponente.UnObjeto);</span>
628-<span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span></code></pre></div></td>
629-<td><p>   -- Aplicación ----------</p>
630-<div class="sourceCode" id="cb2"><pre class="sourceCode pascal"><code class="sourceCode pascal"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a> <span class="kw">var</span> </span>
631-<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> MiComponente: TUnComponente;</span>
632-<span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">begin</span></span>
633-<span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> MiComponente.UnObjeto:=<span class="dt">Pointer</span>(GetUnObjeto);</span>
634-<span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="co">//Más código...</span></span>
635-<span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> HacerAlgo(TUnObjeto(MiComponente.UnObjeto));</span>
636-<span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">end</span>;</span></code></pre></div></td>
637-</tr>
638-</tbody>
639-</table>
509+``` pascal
510+ var
511+ MiComponente: TUnComponente;
512+ begin
513+ MiComponente.UnObjeto:=GetUnObjeto
514+ //Más código...
515+ HacerAlgo(MiComponente.UnObjeto);
516+ end;
517+```
640518
519+   -- Aplicación ----------
520+
521+``` pascal
522+ var
523+ MiComponente: TUnComponente;
524+ begin
525+ MiComponente.UnObjeto:=Pointer(GetUnObjeto);
526+ //Más código...
527+ HacerAlgo(TUnObjeto(MiComponente.UnObjeto));
528+ end;
529+```
530+
641531#### Recursos
642532
643533
644534Los recursos (iconos, imágenes, cursores, etc.) Delphi son específicos de win32 y no son compatibles con Lazarus, hay que rehacerlos y compilarlos con la utilidad *lazres*, que se puede encontrar en el directorio *dir_de_lazarus/tools*. Deberás compilar tú mismo esta utilidad.
645535
646536:*linux y *nix
647537
648538`  cd dir_de_lazarus/lazarus/tools`\
649539`  make install`
650540
651541:*windows
652542
653543:** Abrir una consola con CMD y escribir lo siguiente:
654544
655545`  cd dir_de_lazarus\tools`\
656546`  dir_de_lazarus\fpc\2.2.0\bin\i386-win32\make install`
657547
658548
659549(nota del traductor: esto en realidad construye todas las utilidades que hay en *tools*)
660550
661551
662552Para añadir rucursos a tu aplicación:
663553
664554- lazres mirecurso.lrs mi_dibujo.xpm otro_dibujo.xpm.
665555- Añade la unidad *LResources* en ls cláusula *Uses* de la unidad.
666556- Incluye la referencia al archivo .lrs creado dentro de bloque de iniciación.
667557
668558Ejemplo:
669559
670560``` pascal
671561 Unit Unidad1
672562 function TForm1.LoadGlyph(const NombreGrafico: String): TBitMap;
673563 begin
674564 Result:= TPixmap.Create; //¿no debería ser Result:= TBitMap.Create;?
675565 Result.LoadFromLazarusResource(NombreGrafico);
676566 end;
677567 //Más código...
678568 begin
679569 BotonRapido.glyph:= LoadGlyph('mi_dibujo');
680570 //Más código...
681571 end;
682572
683573 initialization
684574 {$I Unidad1.lrs}
685575 {$I mirecurso.lrs}
686576 end.
687577```
688578
689579
690580Desde la versión 2.2 del FPC, incluso los ejecutables ELF de Linux admiten recursos binarios, por lo que lo que se pueden utilizar los típicos recursos .res que se utilizan en Delphi
691581
692582Ejemplo:
693583
694584``` pascal
695585 //hasta aquí todo igual
696586
697587 initialization
698588 {$I Unidad1.lrs}
699589 {$R mirecurso.res}
700590 end.
701591```
702592
703593### Otro método para convertir proyectos Delphi o Kylix a Lazarus
704594
705595- Renombra o copia todos los archivos *.dfm* o *.xfm* como *.lfm*. Las primeras versiones (hasta la 3 por lo menos) de Delphi no generaban los archivos *.dfm* como texto. Si este es el caso habrá que usar previamente la utilidad de conversión del IDE del menú *Herramientas-\>Convertir archivo DFM a LFM...*
706596- Renombra o copia el archivo *.dpr* como *.lpr*.
707597- Haz los cambios necesarios al archivo *.lpr*:
708598
709599:# Añade las directivas *{\$mode delphi}{\$H+}* o *{\$mode objfpc}{H+}*
710600
711601:# Añade la unidad *Interfaces* a la clausula *uses*
712602
713603:# Comenta o borra la directiva *{\$R *.res}* (esto no es necesario a partir de la versión 2.2 del FPC)
714604
715605- Haz los cambios necesarios a todas la unidades *.pas*:
716606
717607:# Añade las directivas *{\$mode delphi}{\$H+}* o *{\$mode objfpc}{H+}*
718608
719609:# Añade la unidad *LResources*, y si el formulario tiene botones la unidad *Buttons* a la clausula *uses*
720610
721611:# Comenta o borra las directivas *{\$R *.dfm}* o *{\$R *.xfm}*
722612
723613:# Añade la sección *Initialization* al final de cada unidad, y añade una directiva *{\$I unitname.lrs}* en su interior.
724614
725615- Crea un nuevo proyecto: *Proyecto -\> Nuevo proyecto desde archivo...*
726616- Selecciona el archivo *.lpr* que acabas de preparar
727617- En la ventana *Crear un proyecto nuevo* selecciona *Aplicación*
728618- Construye el proyecto y efectúa las correcciones necesarias para que compile correctamente, en este punto el archivo .lpi se crea automáticamente. Si aparecen errores de *Error leyendo formulario* dale al botón *Continuar cargando*
729619- Guárdalo todo, y ya tienes un proyecto Lazarus :-)
730620
731621## Obtener ayuda
732622
733623   Si encuentras un problema durante la conversión que no puedes resolver, hay una gran variedad de lugares donde obtener ayuda.
734624
735-<table>
736-<tbody>
737-<tr>
738-<td colspan="2"><h3 id="documentación">Documentación</h3></td>
739-</tr>
740-<tr>
741-<td><p>Sobre Object Pascal y FPC</p></td>
742-<td style="vertical-align: top"><p>El mejor sitio para empezar es <a href="http://www.freepascal.org/docs-html/">la Documentación de Free Pascal</a> de Michaël Van Canneyt y Florian Klämpfl.</p></td>
743-</tr>
744-<tr>
745-<td><p>Para cuestiones más enfocadas en Lazarus</p></td>
746-<td style="vertical-align: top"><p>El proyecto de documentación de Lazarus [[Main Page|Base de conocimientos Lazarus-CCR]] es el siguiente sitio donde buscar.</p></td>
747-</tr>
748-<tr>
749-<td colspan="2"><h3 id="soporte_directo">Soporte directo</h3></td>
750-</tr>
751-<tr>
752-<td style="white-space: nowrap"><p>Lista de correo</p></td>
753-<td style="vertical-align: top"><p>Puedes enviar cuestiones a la <a href="http://www.freepascal.org/maillist.html">lista de correo de <em>Free Pascal Compiler</em></a> o en los <a href="http://community.freepascal.org:10000/bboard/">FPC foros</a>, a los que un montón de espertos están suscritos.</p></td>
754-</tr>
755-<tr>
756-<td style="white-space: nowrap"><p>Si tienes acceso a IRC:</p></td>
757-<td style="vertical-align: top"><p>On irc.freenode.net: <a href="irc://irc.freenode.net/fpc">#fpc</a> para FPC, o <a href="irc://irc.freenode.net/lazarus-ide">#lazarus-ide</a> para Lazarus</p></td>
758-</tr>
759-</tbody>
760-</table>
625+### Documentación
626+
627+Sobre Object Pascal y FPC
628+
629+El mejor sitio para empezar es [la Documentación de Free Pascal](http://www.freepascal.org/docs-html/) de Michaël Van Canneyt y Florian Klämpfl.
630+
631+Para cuestiones más enfocadas en Lazarus
632+
633+El proyecto de documentación de Lazarus [[Main Page|Base de conocimientos Lazarus-CCR]] es el siguiente sitio donde buscar.
634+
635+### Soporte directo
636+
637+Lista de correo
638+
639+Puedes enviar cuestiones a la [lista de correo de *Free Pascal Compiler*](http://www.freepascal.org/maillist.html) o en los [FPC foros](http://community.freepascal.org:10000/bboard/), a los que un montón de espertos están suscritos.
640+
641+Si tienes acceso a IRC:
642+
643+On irc.freenode.net: [\#fpc](irc://irc.freenode.net/fpc) para FPC, o [\#lazarus-ide](irc://irc.freenode.net/lazarus-ide) para Lazarus
761644
762645### Bases de conocimientos
763646
764647   Hay algunas bases de conocimientos y buscadores en línea que también pueden ser de gran ayuda para aprender nuevas técnicas y encontrar soluciones a problemas:
765648
766649- Tamarack Associates opera un rápido \[ <http://codenewsfast.com/> buscador\] específico para los archivos *usenet* de Borland.
767650- Mer Systems Inc. provee un [motor de búsqueda](http://www.mers.com/searchsite.html) similar .
768651- Otra fuente de información, junto con un amplio y [capaz buscador](http://www.efg2.com/Lab/search.htm) es Earl F. Glynn's Computer Lab y el [Archivo de referencia](http://www.efg2.com/).
769652
770653## Empaquetando y distribuyendo componentes
771654
772655### Creando un paquete Larazus para tu(s) componente(s)
773656
774657   Crear un paquete hace que instalar el código convertido sea un proceso más fácil... especialmente si se está facilitando más de un componente. Mattias Gärtner ha escrito una descripción general sobre [[Lazarus Packages|paquetes Lazarus]] que deben leerse antes de comenzar este proceso.
775658
776659### Documentación
777660
778661   El propósito de este sitio y el formato wiki es hacer de la generación de documentación profesional un proceso fácil y rápido. El wiki también permite ver inmediatamente los resultados de lo publicación y hacer modificaciones al instante.
779662
780663   Usar el Lazarus-CCR wiki para crear documentación bien presentada es muy fácil. Si nunca has utilizado antes las marcas wiki, puede familiarizarse con ellas en el [[Sand Box|área de práctica]].
781664
782665### Creando una página de lanzamiento de código
783666
784667   La página de lanzamiento de código contiene la información importante sobre sus componentes que un potencial usuario debe conocer, cómo la licencia, plataformas de destino, estado (alfa, beta, estable...), dónde está para descargarlo, quién lo ha escrito, si hay soporte... etc.
785668
786669   El siguiente procedimiento permite crear el código de una página de lanzamiento de código con su navegador:
787670
788671- Acceda a [[Release new component|lanzamiento de nuevos componentes]]
789672- Escriba el nobre de su paquete o componente el la caja de texto y pulsa en *Create Article*
790673- Cumplimenta la plantilla que aparecerá y guárdala.
791674- Edita la página [[Components and Code examples|Componentes y código de ejemplo]] y añade el enlace a la nueva página creada en la sección de Componentes liberados (*Released Components*). Guarda la página modificada.
792675
793676### Envío del componente
794677
795678   Si eres el responsable de lanzamiento de tu proyecto, pon el proyecto en el sistema de liberación de archivos de SourceForge y añádelo a la lista de paquetes liberados. En otro caso envíalo a uno de los administradores del proyecto (Tom Lisjac o Vincent Snijders) para que lo añadan al repositorio. Antes de subir a SourceForge, hay que crear la *Página de lanzamiento de código* para describir el componente. Se puede utilizar la página [[Release new component|lanzamiento de nuevos componentes]], para comenzar a crear la página.
796679
797680   Si crees que será necesario para continuar desarrollando el componente, también puedes poner el código en SVN para seguir teniendo acceso al mismo. Si te cansas de enviar sus parches, le daremos acceso de escritura al CVS, para que puedas hacer las modificaciones tú mismo. Para detalles ver [[Using the Lazarus-ccr SVN repository|Usando el repositorio SVN de Lazarus-ccr]].
798681
799682## Contribuciones y cambios
800683
801684   Esta página ha sido convertida desde la [versión *epikwiki*](http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide).
802685
803686- Versión incial por Tom Lisjac y Mattias Gärtner - 9/22/2003 VlxAdmin
804687- Movido *Cómo conseguir ayuda* de la página principal. T. Lisjac - 9/24/2003 VlxAdmin
805688- Añadida platillas de documentos, procedimientos y enlaces. 9/25/2003 VlxAdmin
806689- LCLLinux renombrada como LCLIntf, Jesus Reyes, 9/27/2003
807690- Añadida más información en los cambios de Unidad, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
808691- Actualizadas las diferencias de sintaxis, incluyendo ejemplos, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
809692- FPC 1.0.x no soporta interfaces, Vincent Snijders 9/28/2003
810693- Nuevos ejemplos para la nueva definición de WikiWord, 9/28/2003 VlxAdmin
811694- Mayor consistencia del Código para eliminar definiciones accidentales WikiWord, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
812695- Utilización de tablas para los ejemplos de código y así mejorar la visualización al confrontar las diferencias entre Delphi y FPC, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/17/2003
813696- Utilización de estilo pascal para hacer los ejemplos más legibles, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 10/18/2003
814697- Adición de la sección 'Otro método para convertir proyectos Delphi o Kylix a Lazarus', George Lober, 2/17/2006
815698- Versión en castellano (español) iskraelectrica (jldc) / mayo de 2008.
816699
817700---
818701*From the Free Pascal wiki, page "Code Conversion Guide/es", as it stood on 2020-02-10 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).*

Back to history