Sign in Join
Wiki copytemporary

Code Conversion Guide/es: what changed

Revision 3 to 4. 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-```
141+```text
142142 http://wiki.lazarus.freepascal.org/Delphi_Converter_in_Lazarus
143143```
144144
145145   El siguiente texto explica las diferencias entre Delphi y Lazarus y cómo convertir manualmente.
146146
147147   Cambia el nombre o copia el archivo .dpr a un .lpr. Comenta o elimina la directiva
148148
149149{\$R *.res}
150150
151151y añade la directiva
152152
153153{\$mode delphi}{\$H+}
154154
155155o bien esta otra
156156
157157{\$mode objfpc}{\$H+}
158158
159159en 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.
160160
161161   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.
162162
163163   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:
164164
1651651. poner en minúsculas los nombre de archivo de inclusiones y de la sección uses.
1661662. convierte el .dfm a .lfm (normalmente sin comprobar el contenido, únicamente el formato)
1671673. crea un .lrs vacío (el contenido se creará después)
1681684. añade la directiva
169169 {\$mode delphi}
1701705. sustituye la referencia a la unidad windows por LCLIntf
1711716. añade la unidad LResources si es preciso (si se usa .lrs se pondrá
172172 uses LResources
173173
174174 en la sección de implementación)
1751757. elimina las unidades variants
1761768. elimina la directiva
177177 {\$R *.dfm}
1781789. crea la sección de iniciación y añade en ella la directiva
179179 {\$i unit.lrs}
180180
181181   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)
182182
183183#### Seleccionar el modo correcto de compilación
184184
185185   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:
186186
187187   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.
188188
189189   Muchas unidades DELPHI compilan con FPC añadiendo a las mismas
190190
191-```
191+```text
192192{$IFDEF FPC}
193193 {$MODE DELPHI}
194194{$ENDIF}
195195```
196196
197197inmediatamente a continuación del nombre de la unidad.
198198
199199   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)
200200
201201#### Consideraciones sobre codificación para Multiplataforma
202202
203203- 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.
204204- 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.
205205- 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.
206206- Si es necesario código específico para un SO, haz uso de bloques selectores (IFDEF). Ver más abajo una lista de macros.
207207
208208#### Variables, "defines" y macros útiles del compilador
209209
210210   Para escribir código que se adapte, y se comporte de forma distinta según el sistema, se utiliza la directiva
211211
212212{\$IFDEF identificador}.
213213
214214- {\$IFDEF FPC}
215215
216216   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}**.
217217
218218- {\$IFDEF LCL}
219219
220220   Esta se define para utilizar el paquete LCL. Es útil para escribir código que funcione con LCL y Delphi.
221221
222222- {\$IFDEF LCLGtk}
223223
224224 ,
225225
226226 {\$IFDEF LCLWin32}
227227
228228 ,
229229
230230 {\$IFDEF LCLQt}
231231
232232 , ...
233233
234234   Esta varible se define para utilizar el LCL en una determinada plataforma, usando los componentes visuales (widgetset).
235235
236236- {\$IFDEF Unix} // para Linux, BSD, Mac OS X, Solaris
237237
238238 ,
239239
240240 {\$IFDEF Win32}
241241
242242 ,
243243
244244 {\$IFDEF Linux}
245245
246246 // para Linux,
247247
248248 {\$IFDEF Darwin}
249249
250250 // para OS X,
251251
252252 {\$IFDEF WinCE}
253253
254254 // para WinCE,...
255255
256256   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:
257257
258258``` pascal
259259 {$IFDEF Linux}
260260 {$DEFINES Unix}
261261 {$ENDIF}
262262```
263263
264264para que funcione en Kilix.
265265
266266- {\$IFDEF ENDIAN_BIG}
267267
268268   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.
269269
270270- {\$IFDEF ENDIAN_BIG}
271271
272272   Para más detalles ver [Documentación de FPC](http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21).
273273
274274#### Soporte para 32bit / 64 bit
275275
276276   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:
277277
278278``` pascal
279279 {$IFNDEF FPC}
280280 type
281281 PtrInt = integer;
282282 PtrUInt = cardinal;
283283 {$ENDIF}
284284```
285285
286286   Sustituya todas las ocurrencias de **integer(SomePointerOrObject)** por **PtrInt(SomePointerOrObject)**.
287287
288288   Para más información ver Guía de programación para multiples plataformas [[Multiplatform Programming Guide]]
289289
290290#### Buscando un identificador *perdido*
291291
292292   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.
293293
294294   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):
295295
296296``` bash
297297 grep -in ' tbutton =' lcl/*
298298```
299299
300300   (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)
301301
302302#### Diferencias mayores entre las unidades de Lazarus y las de Delphi
303303
304304   **¡Por favor, añada lo que sepa sobre este tema!**
305305
306306- Windows -\> Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
307307
308308   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).
309309
310310- Messages -\> LMessages
311311
312312   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*.
313313
314314- Graphics, Controls -\> GraphType, GraphMath, Graphics, Controls
315315
316316   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 ...
317317
318318- Mask -\> MaskEdit
319319
320320   Para racionalizar las convenciones sobre nombres, la unidad para la clase *TMaskEdit* se llama *MaskEdit* y no el confuso *Mask* de muchas versiones Delphi.
321321
322322- StdCtrls-\>StdCtrls,Buttons
323323
324324   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.
325325
326326#### Diferencias entre Delphi y FPC/LCL sobre propiedades y métodos
327327
328328- EL *TBitmap* de la LCL tiene una propiedad lienzo (*canvas*)
329329- 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]]
330330
331331#### Diferencias semánticas
332332
333333##### Orden de evaluación de los parámetros
334334
335335
336336Delphi 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.
337337
338338##### Procedimientos y funciones anidadas como variables de procedimiento
339339
340340
341341Delphi 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.
342342
343343
344344FPC, 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.
345345
346346
347347En resumen, no llames a procedimientos anidados a través de variables de procedimiento.
348348
349349#### Diferencias de sintaxis
350350
351351##### **¡Por favor, añada lo que sepa sobre este tema!**
352352
353353
354354Debido 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:
355355
356356##### Al asignar una función de manejo de un evento, antepon un "@" a su nombre
357357
358358
359359Por ejemplo, se puede asignar la llamada a un botón manualmente
360360
361361**Delphi**
362362
363363**OBJFPC**
364364
365365``` pascal
366366 begin
367367 if not Assigned(MiBoton.OnClick) then
368368 MiBoton.OnClick:= UnaFuncion;
369369 //@ no necesario
370370 //más código...
371371 end;
372372```
373373
374374``` pascal
375375 begin
376376 if not Assigned(MiBoton.OnClick) then
377377 MiBoton.OnClick:= @UnaFuncion;
378378 //@ Es necesario
379379 //más código...
380380 end;
381381```
382382
383383##### Al llamar a una variable procedural usar esta sintaxis: ProcNombre()
384384
385385
386386En 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:
387387
388388**Delphi**
389389
390390**OBJFPC**
391391
392392``` pascal
393393 With (UnObjeto) do
394394 begin
395395 If Assigned(OnMiLlamada) then
396396 OnMiLlamada;
397397 //paréntesis no necesarios
398398 end;
399399```
400400
401401``` pascal
402402 With (UnObjeto) do
403403 begin
404404 If Assigned(OnMiLlamada) then
405405 OnMiLlamada();
406406 //los paréntesis son necesarios
407407 end;
408408```
409409
410410##### Al obtener los valores de un puntero a registro hay que deshacer antes la referencia
411411
412412
413413En 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,
414414
415415**Delphi**
416416
417417**OBJFPC**
418418
419419``` pascal
420420 Function DameValores(UnRegistro: PMiRegistro):Integer;
421421 begin
422422 If Assigned(UnRegistro) then
423423 Result:=UnRegistro.UnValor
424424 else
425425 Result:=0;
426426 end;
427427```
428428
429429``` pascal
430430 Function DameValores(UnRegistro: PMiRegistro):Integer;
431431 begin
432432 If Assigned(UnRegistro) then
433433 Result:=UnRegistro^.UnValor
434434 else
435435 Result:=0;
436436 end;
437437```
438438
439439##### Para acceder a caracteres de la cadena que es una propiedad de un objeto, esta debe ser encerrada entre paréntesis
440440
441441
442442Con 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,
443443
444444**Delphi**
445445
446446**OBJFPC**
447447
448448``` pascal
449449Type TUnComponente=class(TComponent)
450450 //Más código......
451451Published
452452Property MiCadena:String index 3 read GetMiCadena;
453453 //Más código....
454454End;
455455
456456var
457457 MiLetra:char;
458458begin
459459 If Length(MiCadena)>2 then
460460 //paréntesis no necesarios
461461 MiLetra:= MiCadena[3];
462462 //Más código......
463463end;
464464```
465465
466466``` pascal
467467 Type TUnComponente=class(TComponent)
468468 //Más código...
469469Published
470470Property MiCadena:String index 3 read GetMiCadena;
471471 //Más código...
472472End;
473473
474474var
475475 MiLetra:char;
476476begin
477477 If Length(MiCadena)>2 then
478478 //paréntesis necesarios
479479 MiLetra:= (MiCadena)[3];
480480 //Más código......
481481end;
482482```
483483
484484##### Hay que convertir los punteros al tipo real que espera la función con que se utiliza
485485
486486
487487En 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:
488488
489-```
489+```text
490490cellpadding="2" cellspacing="2">
491491```
492492
493493Delphi / ObjFPC
494494
495495``` pascal
496496 Unit Unidad1
497497 Type TUnObjeto=class(TComponent)
498498 //Más código...
499499 End;
500500 Procedure HacerAlgo(Value: TSomeObject);
501501 Function GetUnObjeto: TUnObjeto;
502502
503503 Unit Unidad2
504504 Type TUnComponente=class(TComponent)
505505 //Más código...
506506 Published UnObjeto: Pointer;
507507 //Más código...
508508 End;
509509```
510510
511511**Delphi**
512512
513513**OBJFPC**
514514
515515   -- Aplicación ----------
516516
517517``` pascal
518518 var
519519 MiComponente: TUnComponente;
520520 begin
521521 MiComponente.UnObjeto:=GetUnObjeto
522522 //Más código...
523523 HacerAlgo(MiComponente.UnObjeto);
524524 end;
525525```
526526
527527   -- Aplicación ----------
528528
529529``` pascal
530530 var
531531 MiComponente: TUnComponente;
532532 begin
533533 MiComponente.UnObjeto:=Pointer(GetUnObjeto);
534534 //Más código...
535535 HacerAlgo(TUnObjeto(MiComponente.UnObjeto));
536536 end;
537537```
538538
539539#### Recursos
540540
541541
542542Los 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.
543543
544544:*linux y *nix
545545
546-```
546+```text
547547 cd dir_de_lazarus/lazarus/tools
548548 make install
549549```
550550
551551:*windows
552552
553553:** Abrir una consola con CMD y escribir lo siguiente:
554554
555-```
555+```text
556556 cd dir_de_lazarus\tools
557557 dir_de_lazarus\fpc\2.2.0\bin\i386-win32\make install
558558```
559559
560560
561561(nota del traductor: esto en realidad construye todas las utilidades que hay en *tools*)
562562
563563
564564Para añadir rucursos a tu aplicación:
565565
566566- lazres mirecurso.lrs mi_dibujo.xpm otro_dibujo.xpm.
567567- Añade la unidad *LResources* en ls cláusula *Uses* de la unidad.
568568- Incluye la referencia al archivo .lrs creado dentro de bloque de iniciación.
569569
570570Ejemplo:
571571
572572``` pascal
573573 Unit Unidad1
574574 function TForm1.LoadGlyph(const NombreGrafico: String): TBitMap;
575575 begin
576576 Result:= TPixmap.Create; //¿no debería ser Result:= TBitMap.Create;?
577577 Result.LoadFromLazarusResource(NombreGrafico);
578578 end;
579579 //Más código...
580580 begin
581581 BotonRapido.glyph:= LoadGlyph('mi_dibujo');
582582 //Más código...
583583 end;
584584
585585 initialization
586586 {$I Unidad1.lrs}
587587 {$I mirecurso.lrs}
588588 end.
589589```
590590
591591
592592Desde 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
593593
594594Ejemplo:
595595
596596``` pascal
597597 //hasta aquí todo igual
598598
599599 initialization
600600 {$I Unidad1.lrs}
601601 {$R mirecurso.res}
602602 end.
603603```
604604
605605### Otro método para convertir proyectos Delphi o Kylix a Lazarus
606606
607607- 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...*
608608- Renombra o copia el archivo *.dpr* como *.lpr*.
609609- Haz los cambios necesarios al archivo *.lpr*:
610610
611611:# Añade las directivas *{\$mode delphi}{\$H+}* o *{\$mode objfpc}{H+}*
612612
613613:# Añade la unidad *Interfaces* a la clausula *uses*
614614
615615:# Comenta o borra la directiva *{\$R *.res}* (esto no es necesario a partir de la versión 2.2 del FPC)
616616
617617- Haz los cambios necesarios a todas la unidades *.pas*:
618618
619619:# Añade las directivas *{\$mode delphi}{\$H+}* o *{\$mode objfpc}{H+}*
620620
621621:# Añade la unidad *LResources*, y si el formulario tiene botones la unidad *Buttons* a la clausula *uses*
622622
623623:# Comenta o borra las directivas *{\$R *.dfm}* o *{\$R *.xfm}*
624624
625625:# Añade la sección *Initialization* al final de cada unidad, y añade una directiva *{\$I unitname.lrs}* en su interior.
626626
627627- Crea un nuevo proyecto: *Proyecto -\> Nuevo proyecto desde archivo...*
628628- Selecciona el archivo *.lpr* que acabas de preparar
629629- En la ventana *Crear un proyecto nuevo* selecciona *Aplicación*
630630- 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*
631631- Guárdalo todo, y ya tienes un proyecto Lazarus :-)
632632
633633## Obtener ayuda
634634
635635   Si encuentras un problema durante la conversión que no puedes resolver, hay una gran variedad de lugares donde obtener ayuda.
636636
637637### Documentación
638638
639639Sobre Object Pascal y FPC
640640
641641El 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.
642642
643643Para cuestiones más enfocadas en Lazarus
644644
645645El proyecto de documentación de Lazarus [[Main Page|Base de conocimientos Lazarus-CCR]] es el siguiente sitio donde buscar.
646646
647647### Soporte directo
648648
649649Lista de correo
650650
651651Puedes 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.
652652
653653Si tienes acceso a IRC:
654654
655655On irc.freenode.net: [\#fpc](irc://irc.freenode.net/fpc) para FPC, o [\#lazarus-ide](irc://irc.freenode.net/lazarus-ide) para Lazarus
656656
657657### Bases de conocimientos
658658
659659   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:
660660
661661- Tamarack Associates opera un rápido \[ <http://codenewsfast.com/> buscador\] específico para los archivos *usenet* de Borland.
662662- Mer Systems Inc. provee un [motor de búsqueda](http://www.mers.com/searchsite.html) similar .
663663- 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/).
664664
665665## Empaquetando y distribuyendo componentes
666666
667667### Creando un paquete Larazus para tu(s) componente(s)
668668
669669   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.
670670
671671### Documentación
672672
673673   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.
674674
675675   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]].
676676
677677### Creando una página de lanzamiento de código
678678
679679   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.
680680
681681   El siguiente procedimiento permite crear el código de una página de lanzamiento de código con su navegador:
682682
683683- Acceda a [[Release new component|lanzamiento de nuevos componentes]]
684684- Escriba el nobre de su paquete o componente el la caja de texto y pulsa en *Create Article*
685685- Cumplimenta la plantilla que aparecerá y guárdala.
686686- 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.
687687
688688### Envío del componente
689689
690690   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.
691691
692692   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]].
693693
694694## Contribuciones y cambios
695695
696696   Esta página ha sido convertida desde la [versión *epikwiki*](http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide).
697697
698698- Versión incial por Tom Lisjac y Mattias Gärtner - 9/22/2003 VlxAdmin
699699- Movido *Cómo conseguir ayuda* de la página principal. T. Lisjac - 9/24/2003 VlxAdmin
700700- Añadida platillas de documentos, procedimientos y enlaces. 9/25/2003 VlxAdmin
701701- LCLLinux renombrada como LCLIntf, Jesus Reyes, 9/27/2003
702702- Añadida más información en los cambios de Unidad, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
703703- Actualizadas las diferencias de sintaxis, incluyendo ejemplos, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
704704- FPC 1.0.x no soporta interfaces, Vincent Snijders 9/28/2003
705705- Nuevos ejemplos para la nueva definición de WikiWord, 9/28/2003 VlxAdmin
706706- Mayor consistencia del Código para eliminar definiciones accidentales WikiWord, [AndrewJohnson](http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson) 9/27/2003
707707- 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
708708- 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
709709- Adición de la sección 'Otro método para convertir proyectos Delphi o Kylix a Lazarus', George Lober, 2/17/2006
710710- Versión en castellano (español) iskraelectrica (jldc) / mayo de 2008.
711711
712712---
713713*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