Sign in Join
Wiki copytemporary

Code Conversion Guide/es: what changed

Revision 2 to 3. 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)
3434- [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
6565**Delphi / Kylix**
6666
6767**Descripción**
6868
6969**Lazarus**
7070
7171**Descripción**
7272
7373.pas
7474
7575.dfm/.xfm,
7676
7777.dcu/.dpu,
7878
7979.dpr(main project file),
8080
8181.res,
8282
8383.dof/.kof
8484
8585---
8686
8787---
8888
8989---
9090
9191Delphi Source File, Delphi Form,
9292
9393Delphi Compiled Unit,
9494
9595Delphi Project,
9696
9797Windows Resource File,
9898
9999Delphi Option File
100100
101101.pas, .pp .lfm,
102102
103103.o,
104104
105105.lpr
106106
107107---
108108
109109---
110110
111111.lrs,
112112
113113.lpi(main project file),
114114
115115.ppu
116116
117117Pascal unit file,
118118
119119Form data file,
120120
121121Compiled unit file,
122122
123123Project file,
124124
125125Resource file,
126126
127127Project options file,
128128
129129Lazarus resource file,
130130
131131Lazarus project information file,
132132
133133FPC unit description file
134134
135135   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.
136136
137137#### Convirtiendo proyectos/formularios/unidades de Delphi a Lazarus
138138
139139   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í:
140140
141-` `[`http://wiki.lazarus.freepascal.org/Delphi_Converter_in_Lazarus`](http://wiki.lazarus.freepascal.org/Delphi_Converter_in_Lazarus)
141+```
142+ http://wiki.lazarus.freepascal.org/Delphi_Converter_in_Lazarus
143+```
142144
143145   El siguiente texto explica las diferencias entre Delphi y Lazarus y cómo convertir manualmente.
144146
145147   Cambia el nombre o copia el archivo .dpr a un .lpr. Comenta o elimina la directiva
146148
147149{\$R *.res}
148150
149151y añade la directiva
150152
151153{\$mode delphi}{\$H+}
152154
153155o bien esta otra
154156
155157{\$mode objfpc}{\$H+}
156158
157159en 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.
158160
159161   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.
160162
161163   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:
162164
1631651. poner en minúsculas los nombre de archivo de inclusiones y de la sección uses.
1641662. convierte el .dfm a .lfm (normalmente sin comprobar el contenido, únicamente el formato)
1651673. crea un .lrs vacío (el contenido se creará después)
1661684. añade la directiva
167169 {\$mode delphi}
1681705. sustituye la referencia a la unidad windows por LCLIntf
1691716. añade la unidad LResources si es preciso (si se usa .lrs se pondrá
170172 uses LResources
171173
172174 en la sección de implementación)
1731757. elimina las unidades variants
1741768. elimina la directiva
175177 {\$R *.dfm}
1761789. crea la sección de iniciación y añade en ella la directiva
177179 {\$i unit.lrs}
178180
179181   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)
180182
181183#### Seleccionar el modo correcto de compilación
182184
183185   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:
184186
185187   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.
186188
187189   Muchas unidades DELPHI compilan con FPC añadiendo a las mismas
188190
189-`{$IFDEF FPC}`\
190-`  {$MODE DELPHI}`\
191-`{$ENDIF}`
191+```
192+{$IFDEF FPC}
193+ {$MODE DELPHI}
194+{$ENDIF}
195+```
192196
193197inmediatamente a continuación del nombre de la unidad.
194198
195199   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)
196200
197201#### Consideraciones sobre codificación para Multiplataforma
198202
199203- 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.
200204- 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.
201205- 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.
202206- Si es necesario código específico para un SO, haz uso de bloques selectores (IFDEF). Ver más abajo una lista de macros.
203207
204208#### Variables, "defines" y macros útiles del compilador
205209
206210   Para escribir código que se adapte, y se comporte de forma distinta según el sistema, se utiliza la directiva
207211
208212{\$IFDEF identificador}.
209213
210214- {\$IFDEF FPC}
211215
212216   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}**.
213217
214218- {\$IFDEF LCL}
215219
216220   Esta se define para utilizar el paquete LCL. Es útil para escribir código que funcione con LCL y Delphi.
217221
218222- {\$IFDEF LCLGtk}
219223
220224 ,
221225
222226 {\$IFDEF LCLWin32}
223227
224228 ,
225229
226230 {\$IFDEF LCLQt}
227231
228232 , ...
229233
230234   Esta varible se define para utilizar el LCL en una determinada plataforma, usando los componentes visuales (widgetset).
231235
232236- {\$IFDEF Unix} // para Linux, BSD, Mac OS X, Solaris
233237
234238 ,
235239
236240 {\$IFDEF Win32}
237241
238242 ,
239243
240244 {\$IFDEF Linux}
241245
242246 // para Linux,
243247
244248 {\$IFDEF Darwin}
245249
246250 // para OS X,
247251
248252 {\$IFDEF WinCE}
249253
250254 // para WinCE,...
251255
252256   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:
253257
254258``` pascal
255259 {$IFDEF Linux}
256260 {$DEFINES Unix}
257261 {$ENDIF}
258262```
259263
260264para que funcione en Kilix.
261265
262266- {\$IFDEF ENDIAN_BIG}
263267
264268   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.
265269
266270- {\$IFDEF ENDIAN_BIG}
267271
268272   Para más detalles ver [Documentación de FPC](http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21).
269273
270274#### Soporte para 32bit / 64 bit
271275
272276   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:
273277
274278``` pascal
275279 {$IFNDEF FPC}
276280 type
277281 PtrInt = integer;
278282 PtrUInt = cardinal;
279283 {$ENDIF}
280284```
281285
282286   Sustituya todas las ocurrencias de **integer(SomePointerOrObject)** por **PtrInt(SomePointerOrObject)**.
283287
284288   Para más información ver Guía de programación para multiples plataformas [[Multiplatform Programming Guide]]
285289
286290#### Buscando un identificador *perdido*
287291
288292   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.
289293
290294   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):
291295
292296``` bash
293297 grep -in ' tbutton =' lcl/*
294298```
295299
296300   (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)
297301
298302#### Diferencias mayores entre las unidades de Lazarus y las de Delphi
299303
300304   **¡Por favor, añada lo que sepa sobre este tema!**
301305
302306- Windows -\> Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
303307
304308   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).
305309
306310- Messages -\> LMessages
307311
308312   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*.
309313
310314- Graphics, Controls -\> GraphType, GraphMath, Graphics, Controls
311315
312316   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 ...
313317
314318- Mask -\> MaskEdit
315319
316320   Para racionalizar las convenciones sobre nombres, la unidad para la clase *TMaskEdit* se llama *MaskEdit* y no el confuso *Mask* de muchas versiones Delphi.
317321
318322- StdCtrls-\>StdCtrls,Buttons
319323
320324   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.
321325
322326#### Diferencias entre Delphi y FPC/LCL sobre propiedades y métodos
323327
324328- EL *TBitmap* de la LCL tiene una propiedad lienzo (*canvas*)
325329- 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]]
326330
327331#### Diferencias semánticas
328332
329333##### Orden de evaluación de los parámetros
330334
331335
332336Delphi 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.
333337
334338##### Procedimientos y funciones anidadas como variables de procedimiento
335339
336340
337341Delphi 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.
338342
339343
340344FPC, 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.
341345
342346
343347En resumen, no llames a procedimientos anidados a través de variables de procedimiento.
344348
345349#### Diferencias de sintaxis
346350
347351##### **¡Por favor, añada lo que sepa sobre este tema!**
348352
349353
350354Debido 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:
351355
352356##### Al asignar una función de manejo de un evento, antepon un "@" a su nombre
353357
354358
355359Por ejemplo, se puede asignar la llamada a un botón manualmente
356360
357361**Delphi**
358362
359363**OBJFPC**
360364
361365``` pascal
362366 begin
363367 if not Assigned(MiBoton.OnClick) then
364368 MiBoton.OnClick:= UnaFuncion;
365369 //@ no necesario
366370 //más código...
367371 end;
368372```
369373
370374``` pascal
371375 begin
372376 if not Assigned(MiBoton.OnClick) then
373377 MiBoton.OnClick:= @UnaFuncion;
374378 //@ Es necesario
375379 //más código...
376380 end;
377381```
378382
379383##### Al llamar a una variable procedural usar esta sintaxis: ProcNombre()
380384
381385
382386En 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:
383387
384388**Delphi**
385389
386390**OBJFPC**
387391
388392``` pascal
389393 With (UnObjeto) do
390394 begin
391395 If Assigned(OnMiLlamada) then
392396 OnMiLlamada;
393397 //paréntesis no necesarios
394398 end;
395399```
396400
397401``` pascal
398402 With (UnObjeto) do
399403 begin
400404 If Assigned(OnMiLlamada) then
401405 OnMiLlamada();
402406 //los paréntesis son necesarios
403407 end;
404408```
405409
406410##### Al obtener los valores de un puntero a registro hay que deshacer antes la referencia
407411
408412
409413En 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,
410414
411415**Delphi**
412416
413417**OBJFPC**
414418
415419``` pascal
416420 Function DameValores(UnRegistro: PMiRegistro):Integer;
417421 begin
418422 If Assigned(UnRegistro) then
419423 Result:=UnRegistro.UnValor
420424 else
421425 Result:=0;
422426 end;
423427```
424428
425429``` pascal
426430 Function DameValores(UnRegistro: PMiRegistro):Integer;
427431 begin
428432 If Assigned(UnRegistro) then
429433 Result:=UnRegistro^.UnValor
430434 else
431435 Result:=0;
432436 end;
433437```
434438
435439##### Para acceder a caracteres de la cadena que es una propiedad de un objeto, esta debe ser encerrada entre paréntesis
436440
437441
438442Con 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,
439443
440444**Delphi**
441445
442446**OBJFPC**
443447
444448``` pascal
445449Type TUnComponente=class(TComponent)
446450 //Más código......
447451Published
448452Property MiCadena:String index 3 read GetMiCadena;
449453 //Más código....
450454End;
451455
452456var
453457 MiLetra:char;
454458begin
455459 If Length(MiCadena)>2 then
456460 //paréntesis no necesarios
457461 MiLetra:= MiCadena[3];
458462 //Más código......
459463end;
460464```
461465
462466``` pascal
463467 Type TUnComponente=class(TComponent)
464468 //Más código...
465469Published
466470Property MiCadena:String index 3 read GetMiCadena;
467471 //Más código...
468472End;
469473
470474var
471475 MiLetra:char;
472476begin
473477 If Length(MiCadena)>2 then
474478 //paréntesis necesarios
475479 MiLetra:= (MiCadena)[3];
476480 //Más código......
477481end;
478482```
479483
480484##### Hay que convertir los punteros al tipo real que espera la función con que se utiliza
481485
482486
483487En 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:
484488
489+```
490+cellpadding="2" cellspacing="2">
491+```
492+
485493Delphi / ObjFPC
486494
487495``` pascal
488496 Unit Unidad1
489497 Type TUnObjeto=class(TComponent)
490498 //Más código...
491499 End;
492500 Procedure HacerAlgo(Value: TSomeObject);
493501 Function GetUnObjeto: TUnObjeto;
494502
495503 Unit Unidad2
496504 Type TUnComponente=class(TComponent)
497505 //Más código...
498506 Published UnObjeto: Pointer;
499507 //Más código...
500508 End;
501509```
502510
503511**Delphi**
504512
505513**OBJFPC**
506514
507515   -- Aplicación ----------
508516
509517``` pascal
510518 var
511519 MiComponente: TUnComponente;
512520 begin
513521 MiComponente.UnObjeto:=GetUnObjeto
514522 //Más código...
515523 HacerAlgo(MiComponente.UnObjeto);
516524 end;
517525```
518526
519527   -- Aplicación ----------
520528
521529``` pascal
522530 var
523531 MiComponente: TUnComponente;
524532 begin
525533 MiComponente.UnObjeto:=Pointer(GetUnObjeto);
526534 //Más código...
527535 HacerAlgo(TUnObjeto(MiComponente.UnObjeto));
528536 end;
529537```
530538
531539#### Recursos
532540
533541
534542Los 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.
535543
536544:*linux y *nix
537545
538-`  cd dir_de_lazarus/lazarus/tools`\
539-`  make install`
546+```
547+ cd dir_de_lazarus/lazarus/tools
548+ make install
549+```
540550
541551:*windows
542552
543553:** Abrir una consola con CMD y escribir lo siguiente:
544554
545-`  cd dir_de_lazarus\tools`\
546-`  dir_de_lazarus\fpc\2.2.0\bin\i386-win32\make install`
555+```
556+ cd dir_de_lazarus\tools
557+ dir_de_lazarus\fpc\2.2.0\bin\i386-win32\make install
558+```
547559
548560
549561(nota del traductor: esto en realidad construye todas las utilidades que hay en *tools*)
550562
551563
552564Para añadir rucursos a tu aplicación:
553565
554566- lazres mirecurso.lrs mi_dibujo.xpm otro_dibujo.xpm.
555567- Añade la unidad *LResources* en ls cláusula *Uses* de la unidad.
556568- Incluye la referencia al archivo .lrs creado dentro de bloque de iniciación.
557569
558570Ejemplo:
559571
560572``` pascal
561573 Unit Unidad1
562574 function TForm1.LoadGlyph(const NombreGrafico: String): TBitMap;
563575 begin
564576 Result:= TPixmap.Create; //¿no debería ser Result:= TBitMap.Create;?
565577 Result.LoadFromLazarusResource(NombreGrafico);
566578 end;
567579 //Más código...
568580 begin
569581 BotonRapido.glyph:= LoadGlyph('mi_dibujo');
570582 //Más código...
571583 end;
572584
573585 initialization
574586 {$I Unidad1.lrs}
575587 {$I mirecurso.lrs}
576588 end.
577589```
578590
579591
580592Desde 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
581593
582594Ejemplo:
583595
584596``` pascal
585597 //hasta aquí todo igual
586598
587599 initialization
588600 {$I Unidad1.lrs}
589601 {$R mirecurso.res}
590602 end.
591603```
592604
593605### Otro método para convertir proyectos Delphi o Kylix a Lazarus
594606
595607- 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...*
596608- Renombra o copia el archivo *.dpr* como *.lpr*.
597609- Haz los cambios necesarios al archivo *.lpr*:
598610
599611:# Añade las directivas *{\$mode delphi}{\$H+}* o *{\$mode objfpc}{H+}*
600612
601613:# Añade la unidad *Interfaces* a la clausula *uses*
602614
603615:# Comenta o borra la directiva *{\$R *.res}* (esto no es necesario a partir de la versión 2.2 del FPC)
604616
605617- Haz los cambios necesarios a todas la unidades *.pas*:
606618
607619:# Añade las directivas *{\$mode delphi}{\$H+}* o *{\$mode objfpc}{H+}*
608620
609621:# Añade la unidad *LResources*, y si el formulario tiene botones la unidad *Buttons* a la clausula *uses*
610622
611623:# Comenta o borra las directivas *{\$R *.dfm}* o *{\$R *.xfm}*
612624
613625:# Añade la sección *Initialization* al final de cada unidad, y añade una directiva *{\$I unitname.lrs}* en su interior.
614626
615627- Crea un nuevo proyecto: *Proyecto -\> Nuevo proyecto desde archivo...*
616628- Selecciona el archivo *.lpr* que acabas de preparar
617629- En la ventana *Crear un proyecto nuevo* selecciona *Aplicación*
618630- 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*
619631- Guárdalo todo, y ya tienes un proyecto Lazarus :-)
620632
621633## Obtener ayuda
622634
623635   Si encuentras un problema durante la conversión que no puedes resolver, hay una gran variedad de lugares donde obtener ayuda.
624636
625637### Documentación
626638
627639Sobre Object Pascal y FPC
628640
629641El 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.
630642
631643Para cuestiones más enfocadas en Lazarus
632644
633645El proyecto de documentación de Lazarus [[Main Page|Base de conocimientos Lazarus-CCR]] es el siguiente sitio donde buscar.
634646
635647### Soporte directo
636648
637649Lista de correo
638650
639651Puedes 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.
640652
641653Si tienes acceso a IRC:
642654
643655On irc.freenode.net: [\#fpc](irc://irc.freenode.net/fpc) para FPC, o [\#lazarus-ide](irc://irc.freenode.net/lazarus-ide) para Lazarus
644656
645657### Bases de conocimientos
646658
647659   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:
648660
649661- Tamarack Associates opera un rápido \[ <http://codenewsfast.com/> buscador\] específico para los archivos *usenet* de Borland.
650662- Mer Systems Inc. provee un [motor de búsqueda](http://www.mers.com/searchsite.html) similar .
651663- 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/).
652664
653665## Empaquetando y distribuyendo componentes
654666
655667### Creando un paquete Larazus para tu(s) componente(s)
656668
657669   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.
658670
659671### Documentación
660672
661673   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.
662674
663675   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]].
664676
665677### Creando una página de lanzamiento de código
666678
667679   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.
668680
669681   El siguiente procedimiento permite crear el código de una página de lanzamiento de código con su navegador:
670682
671683- Acceda a [[Release new component|lanzamiento de nuevos componentes]]
672684- Escriba el nobre de su paquete o componente el la caja de texto y pulsa en *Create Article*
673685- Cumplimenta la plantilla que aparecerá y guárdala.
674686- 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.
675687
676688### Envío del componente
677689
678690   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.
679691
680692   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]].
681693
682694## Contribuciones y cambios
683695
684696   Esta página ha sido convertida desde la [versión *epikwiki*](http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide).
685697
686698- Versión incial por Tom Lisjac y Mattias Gärtner - 9/22/2003 VlxAdmin
687699- Movido *Cómo conseguir ayuda* de la página principal. T. Lisjac - 9/24/2003 VlxAdmin
688700- Añadida platillas de documentos, procedimientos y enlaces. 9/25/2003 VlxAdmin
689701- LCLLinux renombrada como LCLIntf, Jesus Reyes, 9/27/2003
690702- Añadida más información en los cambios de Unidad, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
691703- Actualizadas las diferencias de sintaxis, incluyendo ejemplos, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
692704- FPC 1.0.x no soporta interfaces, Vincent Snijders 9/28/2003
693705- Nuevos ejemplos para la nueva definición de WikiWord, 9/28/2003 VlxAdmin
694706- Mayor consistencia del Código para eliminar definiciones accidentales WikiWord, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
695707- 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
696708- 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
697709- Adición de la sección 'Otro método para convertir proyectos Delphi o Kylix a Lazarus', George Lober, 2/17/2006
698710- Versión en castellano (español) iskraelectrica (jldc) / mayo de 2008.
699711
700712---
701713*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