Difference between revisions of "Code Conversion Guide/es"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting)
 
(98 intermediate revisions by 4 users not shown)
Line 1: Line 1:
 
{{Code Conversion Guide}}
 
{{Code Conversion Guide}}
 
+
<!--- [[category:Castellano]][[category:Español]] --->
 
===Guía de conversión de código===
 
===Guía de conversión de código===
  
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 leéte [[Lazarus For Delphi Users]] una guí despcriptiva de muchas de las diferencias de funcionamiento.  
+
&nbsp;&nbsp;&nbsp;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.  
  
El proposito de esta guía es documentar algunas diferencias específicas que son frecuentes encontrar en el proceso de conversión de código al traladar código existente desde Delphi a FPF/Lazarus.
+
&nbsp;&nbsp;&nbsp;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.
  
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.
+
&nbsp;&nbsp;&nbsp;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.
  
 
== Seleccionar un componente o librería para convertir ==
 
== Seleccionar un componente o librería para convertir ==
Line 13: Line 13:
 
=== Dónde encontrar código para convertir ===
 
=== Dónde encontrar código para convertir ===
  
+
&nbsp;&nbsp;&nbsp;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 [http://sourceforge.net/users/tpsfadmin/ aquí].
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 [http://sourceforge.net/users/tpsfadmin/ aquí].
 
  
Para evitar duplicar esfuerzos, los paquetes  que ya han sido convertidos están listados en la página [[Components and Code examples]]. Si has convertido un paquete o estás trabajando en ello, haz una reseña en la página [[Current conversion projects]].
+
&nbsp;&nbsp;&nbsp;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]].
  
 
=== Licencias ===
 
=== Licencias ===
  
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.
+
&nbsp;&nbsp;&nbsp;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.
  
Cuando conviertas componentes, respeta los téminos del autor original y mantén todos los derechos de autor y los encabezados de licencia con sus direcciones de corrreo 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.
+
&nbsp;&nbsp;&nbsp;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.
  
En general, Dominio Público ([http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&TIPO_BUS=3&LEMA=software software] libre), y LGPL/MPL son las más flexibles para distribuir componentes. Para más información, [http://www.opensource.org/docs/definition.php Open Source Definition] 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éminos "licencia de fuente abierta comparación"
+
&nbsp;&nbsp;&nbsp;En general, Dominio Público ([http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&TIPO_BUS=3&LEMA=software software] libre), y LGPL/MPL son las más flexibles para distribuir componentes. Para más información, [http://www.opensource.org/docs/definition.php Definición de Fuentas Abiertas (Open Source)] 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"
  
 
=== Dependencias ===
 
=== Dependencias ===
  
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.
+
&nbsp;&nbsp;&nbsp;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.
  
 
=== Acerca del compilador ===
 
=== Acerca del compilador ===
  
Ver (aunque parece que no funcionan):
+
&nbsp;&nbsp;&nbsp;Ver:
 
* [http://www.freepascal.org/probs.html Problemas conocidos]
 
* [http://www.freepascal.org/probs.html Problemas conocidos]
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Fallos no corregidos]
+
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Fallos no corregidos] <small> (parece que no funciona)</small>
  
 
=== Acerca de Sistemas Operativos y Plataformas ===
 
=== Acerca de Sistemas Operativos y Plataformas ===
  
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!
+
&nbsp;&nbsp;&nbsp;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!
  
== Conviertiendo ==
+
== Convirtiendo ==
  
 
=== Configurando el entorno de Lazarus para un proyecto de conversión ===
 
=== Configurando el entorno de Lazarus para un proyecto de conversión ===
  
====Create a test project====
+
==== Crear un proyecto de prueba ====
* Place code to be converted into a subdirectory (ie: convertdir)
+
* Poner el código a convertir en un subdirectorio (convertdir, por ejemplo)
* Bring up Lazarus
+
* Desde Lazarus crear un proyecto nuevo.
* File->Save All to the convertdir subdirectory. Meaningful names for the Project and default unit are optional.
+
* Guardar (Archivo->Guardar Todo) en el subdirectorio convertdir. Poner nombres significativos a este proyecto y a su unidad principal es optativo.
* Open the "main" unit to be converted in convertdir
+
* Abrir la unidad principal del proyecto a convertir.
* Add it to the project: Project->Add Active Unit to Project
+
* Añadirla al proyecto: Proyecto->Añadir archivo del Editor al Proyecto
* Run Tools->Quick Syntax Check or Run Build All to get started.
+
* Utilice Herramientas->Chequeo Rápido de la sintaxis o bien Ejecutar->Construir todo para empezar.
====Initial items to watch out for====
 
* Filenames are case sensitive with the 1.0.x series compilers. If you're working with this version, make all your filenames lower case. You'll get "File not found" errors if you don't.
 
====Delphi VCL, Kylix CLX Sources in Lazarus====
 
  
When converting Delphi/Kylix sources, it is often useful to do a find declaration to see, what a specific function is doing. The Lazarus IDE can parse the Delphi/Kylix sources. To do this it needs some searchpaths and compiler settings. You can easily setup this in
+
====Cuestiones iniciales a tener en cuenta====
Environment->CodeTools Defines Editor->Insert Template
+
* 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"
  
=== Conversion problems and solutions ===
+
====Código fuente Delphi VCL y Kylix CLX en Lazarus====
  
==== Delphi / Kylix file equivalents in Lazarus ====
+
&nbsp;&nbsp;&nbsp;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.
 +
 
 +
=== Problemas de conversión y soluciones ===
 +
 
 +
==== Equivalencia de archivos entre Delphi / Kylix y Lazarus ====
  
 
{|border="1" width="800"   
 
{|border="1" width="800"   
! Delphi / Kylix !! Description !! Lazarus !! Description
+
! Delphi / Kylix !! Descripción !! Lazarus !! Descripción
 
|-  
 
|-  
 
|valign="top"| .pas
 
|valign="top"| .pas
Line 130: Line 130:
 
|}
 
|}
  
So a Delphi .dcu file roughly corresponds to a FPC .o and .ppu together in one file. The .PPU is mostly the header(interface) part, the .o mostly the implementation part. Main exceptions are inlined functions, that in to-be-inlined form are in the .ppu.
+
 +
&nbsp;&nbsp;&nbsp;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.
 +
 
 +
==== Convirtiendo proyectos/formularios/unidades de Delphi a Lazarus ====
 +
&nbsp;&nbsp;&nbsp;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í:
 +
  http://wiki.lazarus.freepascal.org/Delphi_Converter_in_Lazarus
  
==== Converting Delphi projects/forms/units to Lazarus ====
+
&nbsp;&nbsp;&nbsp;El siguiente texto explica las diferencias entre Delphi y Lazarus y cómo convertir manualmente.
  
Rename or copy the .dpr file to a .lpr file. Comment out or remove the <div class="dir">{$R *.res}</div> directive and add a <div class="dir">{$mode delphi}{$H+}</div> or <div class="dir">{$mode objfpc}{$H+}</div> directive to the .lpr file. The Lazarus IDE can assist in this conversion through the Tools menu item "Convert Delphi Project to Lazarus Project". It asks for a .dpr (Delphi Project) file and converts it to .lpr; furthermore, it creates the .lpi file and converts all units.
+
&nbsp;&nbsp;&nbsp;Cambia el nombre o copia el archivo .dpr a un .lpr. Comenta o elimina la directiva <div class="dir">{$R *.res}</div> y añade la directiva <div class="dir">{$mode delphi}{$H+}</div> o bien esta otra <div class="dir">{$mode objfpc}{$H+}</div> en 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.
  
Many existing Delphi forms can be converted to work with Lazarus by using the IDE's built in .dfm to .lfm form converter. It can be found under the Tools menu item as "Convert DFM file to LFM". Bring up the file dialog, select the dfm and the converter will do the rest.
+
&nbsp;&nbsp;&nbsp;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.
  
If you need to convert the whole unit (with or without a form), Lazarus also includes a built in "Convert Delphi unit to Lazarus unit" which will do the following for you -
+
&nbsp;&nbsp;&nbsp;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:
  
# fixes the case of include filenames and uses sections.
+
# poner en minúsculas los nombre de archivo de inclusiones y de la sección uses.
# converts .dfm file to .lfm file (currently without content check, just format)
+
# convierte el .dfm a .lfm (normalmente sin comprobar el contenido, únicamente el formato)
# creates an empty .lrs file (the content will be created later)
+
# crea un .lrs vacío (el contenido se creará después)
# adds <div class="dir">{$mode delphi}</div> directive
+
# añade la directiva <div class="dir">{$mode delphi}</div>
# replaces windows unit with LCLIntf
+
# sustituye la referencia a la unidad windows por LCLIntf
# adds LResources unit if needed (i.e., if unit.lrs is to be used; <div class="dir">uses LResources </div> can be in the implementation part)
+
# añade la unidad LResources si es preciso (si se usa .lrs se pondrá <div class="dir">uses LResources </div> en la sección de implementación)
# removes variants unit
+
# elimina las unidades variants
# removes <div class="dir">{$R *.dfm}</div> directive
+
# elimina la directiva <div class="dir">{$R *.dfm}</div>
# adds initialization section and <div class="dir">{$i unit.lrs}</div> directive
+
# crea la sección de iniciación y añade en ella la directiva <div class="dir">{$i unit.lrs}</div>
  
This allows quick and easy conversion of most units from Delphi format to Lazarus format. It does not do any validity check, or automatic syntax changes, so any syntax changes you need to make, additional unit/unit name changes, or dfm/pas changes for control/component differences you must still do manually, though in time some wizards to help facilitate some of this, especially the repairing of converted forms(lfm), may become available.
+
&nbsp;&nbsp;&nbsp;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)
  
==== Selecting the right compiler mode ====
+
==== Seleccionar el modo correcto de compilación ====
  
The [[Free Pascal]] Compiler supports 5 different pascal modes. For example TP for turbo pascal, lets you compile turbo pascal units. There is also a DELPHI compatibility mode that can be set to make existing code easier to convert. Lazarus prefers the OBJFPC mode, which almost equals the DELPHI mode, but is less ambigious than the Delphi syntax. Here are the important points:
+
&nbsp;&nbsp;&nbsp;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:
  
The mode can be selected at command line or at the start of the source. Using the command line has the advantage, that you don't need to change the source, but the disadvantage, that others must be told.
+
&nbsp;&nbsp;&nbsp;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.
  
Most Delphi units can be compiled by the [[Free Pascal]] compiler by adding
+
&nbsp;&nbsp;&nbsp;Muchas unidades DELPHI compilan con FPC añadiendo a las mismas
 
  {$IFDEF FPC}
 
  {$IFDEF FPC}
 
   {$MODE DELPHI}
 
   {$MODE DELPHI}
 
  {$ENDIF}
 
  {$ENDIF}
right after the unit name.
+
inmediatamente a continuación del nombre de la unidad.
  
For more details about [[Free Pascal]] modes see the [http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html Free Pascal Documentation]
+
&nbsp;&nbsp;&nbsp;Para más detalles acerca de los modos de [[Free Pascal]] FPC ver [http://www.freepascal.org/docs-html/prog/progap4.html#progse62.html Documentación de Free Pascal]
  
==== Cross-Platform considerations ====
+
==== Consideraciones sobre codificación para Multiplataforma ====
  
* Inline assembler is always a problem because it will bind the code to the Intel architecture. Some developers do algorithm prototypes in Pascal and ifdef the their optimized assembler. Fortunately TurboPower did this in numerous places with their code. If this is the case with the package you're converting, throw the switch back to Pascal.
+
* 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.
* Don't reference specific memory location like the BIOS data area. Find out what the code needs and try to find a cross platform alternative.
+
* 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.
* Don't do processor specific tricks (like using the Intel TSC) without enclosing your code in an ifdef for the platform the code needs... and providing an alternative for environments that don't have the hardware capability.
+
* 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.
* If you need some OS specific code, then you can use IFDEFs. See below for a list of macros.
+
* Si es necesario código específico para un SO, haz uso de bloques selectores (IFDEF). Ver más abajo una lista de macros.
  
==== Useful compiler variables / defines / makros ====
+
==== Variables, "defines" y macros útiles del compilador ====
  
To write code, that behaves on different systems differently, you can use the <div class="dir">{$IFDEF Name}</div> directives.
+
&nbsp;&nbsp;&nbsp;Para escribir código que se adapte, y se comporte de forma distinta según el sistema, se utiliza la directiva <div class="dir">{$IFDEF identificador}.</div>
 +
* <div class="dir">{$IFDEF FPC}</div>
 +
&nbsp;&nbsp;&nbsp;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}'''.
 +
* <div class="dir">{$IFDEF LCL}</div>
 +
&nbsp;&nbsp;&nbsp;Esta se define para utilizar el paquete LCL. Es útil para escribir código que funcione con LCL y Delphi.
 +
* <div class="dir">{$IFDEF LCLGtk}</div>, <div class="dir">{$IFDEF LCLWin32}</div>, <div class="dir">{$IFDEF LCLQt}</div>, ...
 +
&nbsp;&nbsp;&nbsp;Esta varible se define para utilizar el LCL en una determinada plataforma, usando los componentes visuales (widgetset).
 +
* <div class="dir">{$IFDEF Unix} // para Linux, BSD, Mac OS X, Solaris</div>, <div class="dir">{$IFDEF Win32}</div>, <div class="dir">{$IFDEF Linux}</div> // para Linux, <div class="dir">{$IFDEF Darwin}</div> // para OS X, <div class="dir">{$IFDEF WinCE}</div> // para WinCE,...
 +
&nbsp;&nbsp;&nbsp;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:
 +
<syntaxhighlight lang="pascal"> {$IFDEF Linux}
 +
  {$DEFINES Unix}
 +
{$ENDIF}</syntaxhighlight>
 +
para que funcione en Kilix.
 +
* <div class="dir">{$IFDEF ENDIAN_BIG}</div>
 +
&nbsp;&nbsp;&nbsp;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.
 +
* <div class="dir">{$IFDEF ENDIAN_BIG}</div>
  
* <div class="dir">{$IfDef FPC}</div>
+
&nbsp;&nbsp;&nbsp;Para más detalles ver [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 Documentación de FPC].
This variable is defined, when using the FPC compiler. Useful to write code, that works with FPC and Delphi. For compatibility reasons FPC defines the DELPHI makro in mode Delphi. So you can '''not use {$IFNDEF DELPHI}'''.
 
* <div class="dir">{$IfDef LCL}</div>
 
This variable is defined, when using the LCL package. Useful to write code, that works with the LCL and Delphi.
 
* <div class="dir">{$IfDef LCLGtk}</div>, <div class="dir">{$IfDef LCLWin32}</div>, <div class="dir">{$IfDef LCLQt}</div>, ...
 
This variable is defined, when using the LCL package and the specific widgetset is currently used. Useful to write code, that works with the LCL on a specific platform.
 
* <div class="dir">{$IfDef Unix}</div>, <div class="dir">{$IfDef Win32}</div>, ...
 
Defined by FPC for the current Target OS. Delphi defines "Linux", "Win32" and "MSWindows". [[Free Pascal]] runs on much more platforms and so it is recommended to use the more general items. For example "Unix" is defined for Linux, FreeBSD, NetBSD and OpenBSD, where Lazarus already runs.
 
Use for code that should work with Delphi and FPC:
 
{$IfDef Linux}
 
  {$Define Unix}
 
{$EndIf}
 
to work around this for Kylix.
 
* <div class="dir">{$IfDef ENDIAN_BIG}</div>
 
This variable is defined on processors like the powerpc (for example older Apple computer, e.g. till MacOSX 10.2) that have the reversed byte order than intel compatible processors.
 
* <div class="dir">{$IfDef ENDIAN_BIG}</div>
 
  
For more details see the [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 Free Pascal Documentation].
+
==== Soporte para 32bit / 64 bit ====
  
==== 32bit / 64 bit support ====
+
&nbsp;&nbsp;&nbsp;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:
Pointers under 64bit need 8 bytes instead of 4 on 32bit. The 'Integer' type remains for compatibility 32bit. This means you can no longer typecast pointers into integers and back. FPC defines two new types: PtrInt and PtrUInt. PtrInt is a 32bit signed integer on 32 bit platforms and a 64bit signed integer on 64bit platforms. The same for PtrUInt, but ''unsigned'' integer instead.
+
<syntaxhighlight lang="pascal">  {$IFNDEF FPC}
Use for code that should work with Delphi and FPC:
 
  {$IFNDEF FPC}
 
 
   type
 
   type
 
     PtrInt = integer;
 
     PtrInt = integer;
 
     PtrUInt = cardinal;
 
     PtrUInt = cardinal;
   {$ENDIF}
+
   {$ENDIF}</syntaxhighlight>
  
Replace all '''integer(SomePointerOrObject)''' with '''PtrInt(SomePointerOrObject)'''.
+
&nbsp;&nbsp;&nbsp;Sustituya todas las ocurrencias de '''integer(SomePointerOrObject)''' por '''PtrInt(SomePointerOrObject)'''.
  
==== Finding a missing identifier ====
+
&nbsp;&nbsp;&nbsp;Para más información ver Guía de programación para multiples plataformas [[Multiplatform Programming Guide]]
  
There are differences in how the LCL is organized when compared to the Delphi VCL. If you get a "not found" compiler error about a major class or identifier, the chances are good that it's in a different unit. A complete cross reference can be found by grep'ing lazarus/docs/xml or the lcl subdirectory.
+
==== Buscando un identificador ''perdido'' ====
  
For example the commonly used tbutton typically throws an error in Delphi code because it's located in a unit named buttons.pp. The following command finds the correct unit very quickly (in the lazarus source directory):
+
&nbsp;&nbsp;&nbsp;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.
  
  grep -in ' tbutton =' lcl/*
+
&nbsp;&nbsp;&nbsp;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):
  
 +
<syntaxhighlight lang="bash"> grep -in ' tbutton =' lcl/*  </syntaxhighlight>
  
==== Major unit differences between Lazarus and Delphi ====
+
&nbsp;&nbsp;&nbsp;(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)
  
'''Please add to this topic!'''
+
==== Diferencias mayores entre las unidades de Lazarus y las de Delphi ====
  
* Windows->Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
+
&nbsp;&nbsp;&nbsp;'''¡Por favor, añada lo que sepa sobre este tema!'''
  
As the LCL is not windows specific, the code that is in the Delphi Windows unit for directly accessing the Win32 API is abstracted into seperate interfaces, which can be accessed from the LCLIntf unit. Keep in mind, that Lazarus does not emulate win32, so many functions are missing and some do not work as their win32 counterparts. These functions only exist for Delphi compatibility and should only be used for quick & dirty porting. LCL also breaks out many of the types, so often LCLType, and sometimes VCLGlobals are required. LCLProc also contains a few functions which can be useful for lower level handling such as "FreeThenNil" as is in Delphi 5 and higher, "DeleteAmpersands" to remove additional ampersands from a string for controls(& vs && etc). The Interfaces unit needs to be included in the .lpr file to initialize the appropriate widgetset.
+
* Windows -> Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
  
* Messages->LMessages
+
&nbsp;&nbsp;&nbsp;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).
  
TControl Messages for win32 event callbacks of the format WM_CALLBACK and the structs associated with them are often found in the Messages unit in Delphi. In the LCL these types of messages and there structs are usually found in LMessages, usually with name changes of WM to LM, so for instance WM_MOUSEENTER becomes LM_MOUSEENTER, and TWMMouse becomes TLMMouse.
+
* Messages -> LMessages
  
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls
+
&nbsp;&nbsp;&nbsp;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''.
  
To simplify some things and break complexity of circles between units, a few types have been abstracted into a shared unit called GraphType, which includes things, which in Delphi are located in Graphics or Controls, for instance the bvNone etc of panels. So sometimes you have to include it. Also a unit which, although incompatible with Delphi, adds other useful functionality is GraphMath, which adds a TFloatPoint for precision, misc routines for dealing with beziers, lines, and arcs, as well as some operator overloading for use with TPoints and TRect, such as for instance Point1 := Point2 + Point3, and comparing two rects like if (rect1 = rect2) then ...
+
* Graphics, Controls -> GraphType, GraphMath, Graphics, Controls
  
* Mask->MaskEdit
+
&nbsp;&nbsp;&nbsp;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 ...
  
For more intelligent naming considerations, the unit for TMaskEdit is called [MaskEdit|] instead of the slightly more nebulous Mask as in many versions of Delphi.
+
* Mask -> MaskEdit
 +
 
 +
&nbsp;&nbsp;&nbsp;Para racionalizar las convenciones sobre nombres, la unidad para la clase ''TMaskEdit'' se llama ''MaskEdit'' y no el confuso ''Mask'' de muchas versiones Delphi.
  
 
* StdCtrls->StdCtrls,Buttons
 
* StdCtrls->StdCtrls,Buttons
  
In many version of Delphi TButton is located in StdCtrls, while TSpeedButton and TBitBtn are in Buttons. For consistency and simplicity the LCL puts all button types in Buttons, which can occasionally break code conversion, so it is always a good idea to include.
+
&nbsp;&nbsp;&nbsp;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.
  
==== Property and method differences Delphi -> FPC/LCL ====
+
==== Diferencias entre Delphi y FPC/LCL sobre propiedades y métodos====
* TBitmap contains a canvas in the LCL
+
* EL ''TBitmap'' de la LCL tiene una propiedad lienzo (''canvas'')
* [[Lazarus_Faq#Why_are_TForm.ClientWidth.2FClientHeight_the_same_as_TForm.Width.2FHeight]]
+
* 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#Why_are_TForm.ClientWidth.2FClientHeight_the_same_as_TForm.Width.2FHeight|Preguntas sobre Lazarus]]
  
====Semantical differences====
+
====Diferencias semánticas====
  
=====Order of parameter evaluation=====
+
=====Orden de evaluación de los parámetros=====
  
Delphi guarantees that all parameters are evaluated from left to right. FPC makes no such guarantee, and can evaluate parameters in any order it wants in order to generate optimal code.
+
:Delphi 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.
  
 +
=====Procedimientos y funciones anidadas como variables de procedimiento=====
  
=====Nested procedures/functions as procedural variables=====
+
:Delphi 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.
  
Delphi passes the framepointer of the parent procedure always on the stack, and has the caller remove it again. This means that as long as you do not access variables from a parent procedure, you can pass the address of a nested function to another function which then can call it like any other procedural variable.
+
:FPC, 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.
  
FPC on the other hand always passes the framepointer of the parent procedure as a hidden first parameter according to the current calling convention, which means that if you call a nested procedure like a regular procedural variable, all parameters will be "shifted" one position.
+
:En resumen, no llames a procedimientos anidados a través de variables de procedimiento.
  
In short, do not call nested procedures via procedural variables.
+
==== Diferencias de sintaxis ====
 +
====='''¡Por favor, añada lo que sepa sobre este tema!'''=====
 +
:Debido 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:
  
 +
===== Al asignar una función de manejo de un evento, antepon un "@" a su nombre =====
  
==== Syntax differences ====
+
:Por ejemplo, se puede asignar la llamada a un botón manualmente
 +
{| border="1" width="800" align="center"
 +
! <center>Delphi</center> !! <center>OBJFPC</center>
 +
|-
 +
|<syntaxhighlight lang="pascal"> begin
 +
  if not Assigned(MiBoton.OnClick) then
 +
    MiBoton.OnClick:= UnaFuncion;
 +
    //@ no necesario
 +
    //más código...
 +
end;</syntaxhighlight>
 +
|<syntaxhighlight lang="pascal"> begin
 +
  if not Assigned(MiBoton.OnClick) then
 +
      MiBoton.OnClick:= @UnaFuncion;
 +
    //@ Es necesario
 +
    //más código...
 +
end;</syntaxhighlight>
 +
|}
  
'''Please add to this topic!'''
 
  
Because of the inherent strictness in FPC, some syntax changes are necessary, even though <div class="dir">{$Mode Delphi}</div> does allow more laziness like Delphi does. For this reason complying as much with the syntax rules of <div class="dir">{$Mode ObjFPC}</div> as possible is highly recommended, even when the codebase is still going to be shared between Delphi and the LCL. Some of these are simply better coding practices, and sometimes because Delphi mode is not entirely accurate, or in a few instances Delphi acceptible code does not function as expected with FPC, even though it might compile. To that end even though not all such are strictly required, the following list of changes should be considered mandatory :
+
===== Al llamar a una variable procedural usar esta sintaxis: ProcNombre()=====
  
 
+
:En 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:
=====When assigning an event handling entry point, prefix it with an "@"=====
+
{| border="1" width="800" align="center"
 
+
! <center>Delphi</center> !! <center>OBJFPC</center>
For instance, you might assign a button callback manually
 
{| border="1" width="800"
 
! Delphi !! OBJFPC
 
 
|-
 
|-
|<delphi>
+
|<syntaxhighlight lang="pascal"> With (UnObjeto) do
begin
+
  begin
  if not Assigned(MyButton.OnClick) then  
+
  If Assigned(OnMiLlamada) then
    MyButton.OnClick:= SomeFunction;
+
    OnMiLlamada;
    //@ not required
+
    //paréntesis no necesarios
    //more code...
+
  end;</syntaxhighlight>
end;
+
|<syntaxhighlight lang="pascal"> With (UnObjeto) do
</delphi>
+
  begin
|<delphi>
+
  If Assigned(OnMiLlamada) then
begin
+
    OnMiLlamada();
  if not Assigned(MyButton.OnClick) then
+
    //los paréntesis son necesarios
    MyButton.OnClick:= @SomeFunction;
+
  end;</syntaxhighlight>
    //@ IS required
 
    //more code...
 
end;
 
</delphi>
 
 
|}
 
|}
  
=====When calling a procedure variable use this syntax: theprocname()=====
 
  
In Delphi there is no difference between a function result and a variable, however there is in FPC, so to call a function, even if it has no parameters, you must append parenthesis. For Example -
+
=====Al obtener los valores de un puntero a registro hay que deshacer antes la referencia=====
{| border="1" width="800"
+
 
! Delphi !! OBJFPC
+
:En 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,
 +
{| border="1" width="800" align="center"
 +
! <center>Delphi</center> !! <center>OBJFPC</center>
 
|-
 
|-
|<delphi>
+
|<syntaxhighlight lang="pascal"> Function DameValores(UnRegistro: PMiRegistro):Integer;
With (SomeObject) do
+
  begin
begin
+
  If Assigned(UnRegistro) then
  If Assigned(OnMyCallback) then
+
    Result:=UnRegistro.UnValor
    OnMyCallback;
+
  else
    //parenthesis not required
+
    Result:=0;
end;
+
  end;</syntaxhighlight>
</delphi>
+
|<syntaxhighlight lang="pascal"> Function DameValores(UnRegistro: PMiRegistro):Integer;
|<delphi>
+
  begin
With (SomeObject) do
+
  If Assigned(UnRegistro) then
begin
+
    Result:=UnRegistro^.UnValor
  If Assigned(OnMyCallback) then
+
  else
    OnMyCallback();
+
    Result:=0;
    //parenthesis required
+
  end;</syntaxhighlight>
end;
 
</delphi>
 
 
|}
 
|}
  
=====When accessing values in a pointer to a record you must dereference first=====
 
  
In Delphi it is not required to de-reference a pointer to a record to access values within it, it can, in fact, be treated just like the record itself, or any other object. In FPC it must be first de-referenced. As an example,
+
=====Para acceder a caracteres de la cadena que es una propiedad de un objeto, esta debe ser encerrada entre paréntesis=====
{| border="1" width="800"
 
! Delphi !! OBJFPC
 
|-
 
|<delphi>
 
Function GetSomeValue(ARecord: PMyRecord):Integer;
 
begin
 
  If Assigned(ARecord) then
 
    Result:=ARecord.SomeValue
 
  else
 
    Result:=0;
 
end;
 
</delphi>
 
|<delphi>
 
Function GetSomeValue(ARecord: PMyRecord):Integer;
 
begin
 
  If Assigned(ARecord) then
 
    Result:=ARecord^.SomeValue
 
  else
 
    Result:=0;
 
end;
 
</delphi>
 
|}
 
  
=====When accessing chars of an indexed string Property of an object, it must be enclosed in parentheses=====
+
: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,
 
+
{| border="1" width="800" align="center"
With Delphi it is possible to treat a Property exactly like some other const or var, even to accessing for instance individual chars of a string directly, while this is not always possible in FPC, specifically for indexed properties. Instead it must be enclosed in parentheses, to make distinct. While this may not always hold true it is probably a good practice to consider anyway. For example
+
! <center>Delphi</center> !! <center>OBJFPC</center>
{| border="1" width="800"
 
! Delphi !! OBJFPC
 
 
|-
 
|-
|<delphi>
+
|<syntaxhighlight lang="pascal">Type TUnComponente=class(TComponent)
Type TSomeComponent=class(TComponent)
+
   //Más código......
   //More code...
 
 
Published
 
Published
Property MyString:String index 3 read GetMyString;
+
Property MiCadena:String index 3 read GetMiCadena;
//More code...
+
  //Más código....
 
End;
 
End;
  
 
var
 
var
   MyChar:char;
+
   MiLetra:char;
 
begin
 
begin
   If Length(MyString)>2 then
+
   If Length(MiCadena)>2 then
     //no parenthesis needed
+
     //paréntesis no necesarios
     MyChar:= MyString[3];
+
     MiLetra:= MiCadena[3];
     //More code...
+
     //Más código......
end;
+
end;</syntaxhighlight>
</delphi>
+
|<syntaxhighlight lang="pascal"> Type TUnComponente=class(TComponent)
|<delphi>
+
  //Más código...
Type TSomeComponent=class(TComponent)
 
//More code...
 
 
Published
 
Published
Property MyString:String index 3 read GetMyString;
+
Property MiCadena:String index 3 read GetMiCadena;
//More code...
+
  //Más código...
 
End;
 
End;
  
 
var
 
var
   MyChar:char;
+
   MiLetra:char;
 
begin
 
begin
   If Length(MyString)>2 then
+
   If Length(MiCadena)>2 then
     //parenthesis sometimes needed
+
     //paréntesis necesarios
     MyChar:= (MyString)[3];
+
     MiLetra:= (MiCadena)[3];
     //More code...
+
     //Más código......
end;
+
end;</syntaxhighlight>
</delphi>
 
 
|}
 
|}
  
=====You must typecast pointers to actual type when using with var or function of that type=====
 
  
Sometimes in Delphi you will have a null pointer variable representing an object. While it might seem a complex situation, it is oddly quite common especially in large component packs as a method of preventing too many circular includes between objects in different units. In Delphi it is then possible to send this null pointer to a function expecting that object, without bothering to typecast to actual type, in fpc you must typecast.
+
=====Hay que convertir los punteros al tipo real que espera la función con que se utiliza=====
  
For example -
+
: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:
{| border="1" width="800"
+
 
! Delphi !! OBJFPC
+
<table style="width: 100;" border="1" align="center"
 +
cellpadding="2" cellspacing="2">
 +
    <tr align="center">
 +
      <td><b>
 +
Delphi / ObjFPC</b></td>
 +
    </tr>
 +
    <tr>
 +
      <td>
 +
<syntaxhighlight lang="pascal"> Unit Unidad1
 +
  Type TUnObjeto=class(TComponent)
 +
    //Más código...
 +
  End;
 +
Procedure HacerAlgo(Value: TSomeObject);
 +
Function GetUnObjeto: TUnObjeto;
 +
 
 +
Unit Unidad2
 +
  Type TUnComponente=class(TComponent)
 +
  //Más código...
 +
  Published UnObjeto: Pointer;
 +
  //Más código...
 +
  End;</syntaxhighlight>
 +
      </td>
 +
    </tr>
 +
</table>
 +
 
 +
 
 +
{| border="1" width="800" align="center"
 +
! <center>Delphi</center> !! <center>OBJFPC</center>
 
|-
 
|-
|<delphi>
+
|
Unit 1
+
&nbsp;&nbsp;&nbsp;-- Aplicación ----------
  Type
+
<syntaxhighlight lang="pascal"> var
    TSomeObject=class(TComponent)
+
  MiComponente: TUnComponente;
      //More code...
+
begin
    End;
+
  MiComponente.UnObjeto:=GetUnObjeto
 +
  //Más código...
 +
  HacerAlgo(MiComponente.UnObjeto);
 +
end;</syntaxhighlight>
 +
 
 +
|
 +
&nbsp;&nbsp;&nbsp;-- Aplicación ----------
 +
<syntaxhighlight lang="pascal"> var
 +
  MiComponente: TUnComponente;
 +
begin
 +
  MiComponente.UnObjeto:=Pointer(GetUnObjeto);
 +
  //Más código...
 +
  HacerAlgo(TUnObjeto(MiComponente.UnObjeto));
 +
end;</syntaxhighlight>
 +
|}
  
  Procedure DoSomething(Value: TSomeObject);
+
==== Recursos ====
  Function GetSomeObject: TSomeObject;
 
  
Unit 2
+
:Los 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.
  Type
 
    TSomeComponent=class(TComponent)
 
    //More code...
 
    Published SomeObject: Pointer;
 
    //More code...
 
  End;
 
  
Application
+
:*linux y *nix
var
+
  cd dir_de_lazarus/lazarus/tools
  MyComponent: TSomeComponent;
+
   make install
begin
 
  MyComponent.SomeObject:=GetSomeObject;
 
  //More code...
 
  DoSomething(MyComponent.SomeObject);
 
end;
 
</delphi>
 
|<delphi>
 
Unit 1
 
  Type
 
    TSomeObject=class(TComponent)
 
   //More code...
 
  End;
 
  
  Procedure DoSomething(Value: TSomeObject);
+
:*windows
  Function GetSomeObject: TSomeObject;
+
:** Abrir una consola con CMD y escribir lo siguiente:
 +
  cd dir_de_lazarus\tools
 +
  dir_de_lazarus\fpc\2.2.0\bin\i386-win32\make install
  
Unit 2
+
:(nota del traductor: esto en realidad construye todas las utilidades que hay en ''tools'')
  Type TSomeComponent=class(TComponent)
 
    //More code...
 
    Published SomeObject: Pointer;
 
    //More code...
 
  End;
 
  
Application
+
:Para añadir rucursos a tu aplicación:
var
+
:* lazres mirecurso.lrs mi_dibujo.xpm otro_dibujo.xpm.
   MyComponent: TSomeComponent;
+
:* Añade la unidad ''LResources'' en ls cláusula ''Uses'' de la unidad.
begin
+
:* Incluye la referencia al archivo .lrs creado dentro de bloque de iniciación.
  MyComponent.SomeObject:=Pointer(GetSomeObject);
+
:Ejemplo:
  //More code...
+
<syntaxhighlight lang="pascal"> Unit Unidad1
  DoSomething(TSomeObject(MyComponent.SomeObject));
+
   function TForm1.LoadGlyph(const NombreGrafico: String): TBitMap;
end;
+
  begin
</delphi>
+
    Result:= TPixmap.Create; //¿no debería ser Result:= TBitMap.Create;?
|}
+
    Result.LoadFromLazarusResource(NombreGrafico);
 +
  end;
 +
//Más código...
 +
begin
 +
  BotonRapido.glyph:= LoadGlyph('mi_dibujo');
 +
  //Más código...
 +
end;
  
==== Resources ====
+
initialization
 +
  {$I Unidad1.lrs}
 +
  {$I mirecurso.lrs}
 +
end.</syntaxhighlight>
  
Delphi resource files are win32 specific and not compatible with Lazarus, so you'll have to recreate and compile them using the lazres. Lazres can be found in the lazarus/tools subdirectory. If you've downloaded the Lazarus sources, you'll need to compile it first.
+
:Desde 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
* cd lazarus/tools
+
:Ejemplo:
* make install
+
<syntaxhighlight lang="pascal"> //hasta aquí todo igual
To add a resource to your application:
 
* lazres myresource.lrs mypix.xpm anotherpix.xpm
 
* Add the LResources unit to your Uses clause
 
* Include the .lrs file you created under the initialization block
 
Example:
 
<delphi>
 
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;
 
begin
 
  Result:= TPixmap.Create;
 
  Result.LoadFromLazarusResource(GlyphName);
 
end;
 
//More code...
 
begin
 
  Speedbutton1.glyph:= LoadGlyph('mypix');
 
  //More code...
 
end;
 
  
initialization
+
initialization
{$I unit1.lrs}
+
  {$I Unidad1.lrs}
{$I myresource.lrs}
+
  {$R mirecurso.res}
end.
+
end.</syntaxhighlight>
</delphi>
 
  
===Another method to convert a Delphi or Kylix project to Lazarus===
+
===Otro método para convertir proyectos Delphi o Kylix a Lazarus===
  
Rename or copy all .dfm or .xfm files to .lfm (Early Delphi versions do not produce a text-based .dfm file. The convert utility, if present in the \bin folder can be used to covert the .dfm first))
+
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...''
Rename or copy .dpr file to .lpr
+
Renombra o copia el archivo ''.dpr'' como ''.lpr''.
Make necessary changes to .lpr file:
+
Haz los cambios necesarios al archivo ''.lpr'':
#   Add {$mode delphi}{$H+} or {$mode objfpc}{H+} directives
+
:# Añade las directivas ''{$mode delphi}{$H+}'' o ''{$mode objfpc}{H+}''
#   Add 'Interfaces' to uses clause
+
:# Añade la unidad ''Interfaces'' a la clausula ''uses''
#   Comment out or delete {$R *.res} or directive
+
:# Comenta o borra la directiva ''{$R *.res}'' (esto no es necesario a partir de la versión 2.2 del FPC)
Make necessary changes to all .pas unit files:
+
Haz los cambios necesarios a todas la unidades ''.pas'':
#   Add {$mode delphi}{$H+} or {$mode objfpc}{H+} directives
+
:# Añade las directivas ''{$mode delphi}{$H+}'' o ''{$mode objfpc}{H+}''
#   Add 'LResources', and if the form has buttons, add 'Buttons' to uses clause
+
:# Añade la unidad ''LResources'', y si el formulario tiene botones la unidad ''Buttons'' a la clausula ''uses''
#   Comment out or delete {$R *.dfm} or {$R *.xfm} directive
+
:# Comenta o borra las directivas ''{$R *.dfm}'' o ''{$R *.xfm}''
#   Add 'Initialization' section at the end of each unit file, and add {$I unitname.lrs} directive in it
+
:# Añade la sección ''Initialization'' al final de cada unidad, y añade una directiva ''{$I unitname.lrs}'' en su  interior.
Select Project->New Project from file
+
Crea un nuevo proyecto: ''Proyecto -> Nuevo proyecto desde archivo...''
Select the .lpr file
+
Selecciona el archivo ''.lpr'' que acabas de preparar
At 'Create a new project' window, choose 'Application'
+
En la ventana ''Crear un proyecto nuevo'' selecciona ''Aplicación''
Build project and make further necessary corrections to get proper compilation, at this point the .lpi file is generated automaticaly. You may also get 'Error reading Form' messages, click on 'Continue Loading' if you do.
+
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''
Save all, and you have a Lazarus project :-)
+
Guárdalo todo, y ya tienes un proyecto Lazarus :-)
  
== Getting Help ==
+
== Obtener ayuda ==
  
If you encounter a problem during conversion that you just can't solve, there are a wide variety of places to get help.  
+
&nbsp;&nbsp;&nbsp;Si encuentras un problema durante la conversión que no puedes resolver, hay una gran variedad de lugares donde obtener ayuda.  
  
 
{|  
 
{|  
 
| colspan="2" |  
 
| colspan="2" |  
=== Documentation ===
+
=== Documentación ===
 
|-
 
|-
| For pure Object Pascal and FPC issues
+
| Sobre Object Pascal y FPC
| style="vertical-align: top" | The best place to start is the Free Pascal [http://www.freepascal.org/docs-html/ Documentation] by Michaël Van Canneyt and Florian Klämpfl.  
+
| style="vertical-align: top" | El mejor sitio para empezar es [http://www.freepascal.org/docs-html/ la Documentación de Free Pascal] de Michaël Van Canneyt y Florian Klämpfl.  
 
|-
 
|-
| For more Lazarus oriented problems
+
| Para cuestiones más enfocadas en Lazarus
| style="vertical-align: top" | The Lazarus Project Documentation in the Lazarus-CCR Knowledgebase [[Main Page]] is the next place to look.  
+
| style="vertical-align: top" | El proyecto de documentación de  Lazarus [[Main Page|''Base de conocimientos Lazarus-CCR'']] es el siguiente sitio donde buscar.  
 
|-
 
|-
 
| colspan="2" |  
 
| colspan="2" |  
=== Peer support ===
+
=== Soporte directo ===
 
|-
 
|-
| style="white-space: nowrap" | Mailing lists
+
| style="white-space: nowrap" | Lista de correo
| style="vertical-align: top" | You can post a question on any of the [http://www.freepascal.org/maillist.html mailing lists for the Free Pascal Compiler] or the [http://community.freepascal.org:10000/bboard/ FPC forums] where a lot of experts are subscribed.
+
| style="vertical-align: top" | Puedes enviar cuestiones a la [http://www.freepascal.org/maillist.html lista de correo de ''Free Pascal Compiler''] o en los [http://community.freepascal.org:10000/bboard/ FPC foros], a los que un montón de espertos están suscritos.
 
|-
 
|-
| style="white-space: nowrap" | If you have access to IRC:
+
| style="white-space: nowrap" | Si tienes acceso a IRC:
| style="vertical-align: top" | On irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] for FPC, or [irc://irc.freenode.net/lazarus-ide #lazarus-ide] for Lazarus
+
| style="vertical-align: top" | On irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] para FPC, o [irc://irc.freenode.net/lazarus-ide #lazarus-ide] para Lazarus
 
|}
 
|}
  
=== Knowledge bases ===
+
=== Bases de conocimientos ===
  
There are some outstanding search and knowledge bases online that can also be a great help for learning new techniques and solving problems:
+
&nbsp;&nbsp;&nbsp;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:
* Tamarack Associates operates a fast [http://www.tamaracka.com/search.htm search] engine specifically for the Borland usenet archives.  
+
* Tamarack Associates opera un rápido [<!--http://www.tamaracka.com/search.htm-->http://codenewsfast.com/ buscador] específico para los  archivos ''usenet'' de Borland.  
* Mer Systems Inc. provides a similar search [http://www.mers.com/searchsite.html engine].  
+
* Mer Systems Inc. provee un [http://www.mers.com/searchsite.html motor de búsqueda] similar .  
* Another outstanding source of information along with a sitewide [http://www.efg2.com/Lab/search.htm search] capability is Earl F. Glynn's Computer Lab and Reference [http://www.efg2.com/ Library].
+
* Otra fuente de información, junto con un amplio y [http://www.efg2.com/Lab/search.htm capaz buscador] es Earl F. Glynn's Computer Lab y el  [http://www.efg2.com/ Archivo de referencia].
  
== Packaging and Releasing your component ==
+
== Empaquetando y distribuyendo componentes ==
  
=== Creating a Lazarus package for your component(s) ===
+
=== Creando un paquete Larazus para tu(s) componente(s)===
  
Creating a package makes installing the code you've converted a much easier process... especially if you're providing more then one component. Mattias Gärtner has written an overview of [[Lazarus Packages]] that should be read before beginning this process.
+
&nbsp;&nbsp;&nbsp;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.
  
=== Documentation ===
+
=== Documentación ===
  
The purpose of this site and the wiki format is to make the generation of professional documentation an easy and quick process. The wiki also makes it possible to see the results of your posting immediately and make any changes you'd like in real time.
+
&nbsp;&nbsp;&nbsp;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.
  
Using the Lazarus-CCR wiki to create nice looking documentation is very easy. If you've never used wiki markup before, you can get familiar with it in the [[Sand Box]] practice area.
+
&nbsp;&nbsp;&nbsp;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]].
  
=== Creating a Code Release Page ===
+
=== Creando una página de lanzamiento de código ===
  
The Code Release Page contains vital information about your component that a potential downloader will need to know, such as license, intended platform, status (alpha, beta, stable...), where to download it, who wrote it, is support available... etc.
+
&nbsp;&nbsp;&nbsp;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.
  
The following procedure will let you create a Code Release Page with your browser:  
+
&nbsp;&nbsp;&nbsp;El siguiente procedimiento permite crear el código de una página de lanzamiento de código con su navegador:  
  
* Go to the [[Release new component]]
+
* Acceda a [[Release new component|lanzamiento de nuevos componentes]]
* Type the name of your component in the textbox and click on ''Create Article''
+
* Escriba el nobre de su paquete o componente el la caja de texto y pulsa en ''Create Article''
* Fill in the template and hit save.
+
* Cumplimenta la plantilla que aparecerá y guárdala.
* Edit the [[Components and Code examples]] page and add the link to your newly created page to the "Released Components" section. Save the modified page.
+
* 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.
  
=== Submitting the component ===
+
=== Envío del componente ===
  
If you're a release technician on the project, upload your component to the SourceForge File Release System and add it to the list of release packages. Otherwise send it to one of the project administrators ([[User:Tom |Tom Lisjac]] or [[User:Vincent |Vincent Snijders]]) and we'll add it to the repository. Before we upload it to SourceForge, you have to create a ''Code Release Page'' to describe your component. You can use the [[Release new component]] page, to start creating such a page.
+
&nbsp;&nbsp;&nbsp;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 ([[User:Tom |Tom Lisjac]] o [[User:Vincent |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.
  
If you think you need to continue to develop on the component, we can also put it into SVN so you'll continue to have access to it. If we get tired from submitting your patches, we will give you write access to the SVN, so you can commit your patches yourself. For details see [[Using the Lazarus-ccr SVN repository]].
+
&nbsp;&nbsp;&nbsp;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]].
  
== Contributors and Changes ==
+
== Contribuciones y cambios ==
  
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide version].
+
&nbsp;&nbsp;&nbsp;Esta página ha sido convertida desde la [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide versión ''epikwiki''].
* Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]
+
* Versión incial por Tom Lisjac y Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]
* Moved Getting help from the main page. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]
+
* Movido ''Cómo conseguir ayuda'' de la página principal. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]
* Added documentation templates, procedure and links. 9/25/2003 [[User:Tom | VlxAdmin]]
+
* Añadida  platillas de documentos, procedimientos y enlaces. 9/25/2003 [[User:Tom | VlxAdmin]]
* LCLLinux was renamed to LCLIntf, [[User:Jesusrmx | Jesus Reyes]], 9/27/2003
+
* LCLLinux renombrada como LCLIntf, [[User:Jesusrmx | Jesus Reyes]], 9/27/2003
* added more information on Unit changes, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003
+
* Añadida más información en los cambios de Unidad, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003
* Updated Syntax differences, including some examples, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003
+
* Actualizadas las diferencias de sintaxis, incluyendo ejemplos, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003
* FPC 1.0.x doesn't support interfaces, [[User:Vincent | Vincent Snijders]] 9/28/2003
+
* FPC 1.0.x no soporta interfaces, [[User:Vincent | Vincent Snijders]] 9/28/2003
* Fixed some of the examples per new WikiWord definition, 9/28/2003 [[User:Tom | VlxAdmin]]
+
* Nuevos ejemplos para la nueva definición de WikiWord, 9/28/2003 [[User:Tom | VlxAdmin]]
* Made code more consistant to remove last accidental Pascal WikiWord definitions, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003
+
* Mayor consistencia del Código para eliminar definiciones accidentales WikiWord, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 9/27/2003
* Use tables for code examples for nice blocks, and easy side by side view of Delphi->FPC differences, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/17/2003
+
* Utilización de tablas para los ejemplos de código y así mejorar la visualización al confrontar las diferencias entre Delphi y FPC, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/17/2003
* Use pascal stylesheet to make example code more readable, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/18/2003
+
* Utilización de estilo pascal para hacer los ejemplos más legibles, [http://lazarus-ccr.sourceforge.net/index.php?wiki=AndrewJohnson AndrewJohnson] 10/18/2003
* Added 'Another method to convert a Delphi or Kylix project to Lazarus' section , [[User:Glober | George Lober]], 2/17/2006
+
* Adición de la sección 'Otro método para convertir proyectos Delphi o Kylix a Lazarus', [[User:Glober | George Lober]], 2/17/2006
 +
* Versión en castellano (español) [[User:Iskraelectrica | iskraelectrica (jldc)]] / mayo de 2008.

Latest revision as of 01:30, 11 February 2020

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja) português (pt) русский (ru) slovenčina (sk)

Guía de conversión de código

   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 para usuarios de Delphi una guía descriptiva de muchas de las diferencias de funcionamiento.

   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.

   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.

Seleccionar un componente o librería para convertir

Dónde encontrar código para convertir

   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í.

   Para evitar duplicar esfuerzos, los paquetes que ya han sido convertidos están listados en la página 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 Proyecto actualmente en conversión.

Licencias

   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.

   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.

   En general, Dominio Público (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) 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"

Dependencias

   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.

Acerca del compilador

   Ver:

Acerca de Sistemas Operativos y Plataformas

   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!

Convirtiendo

Configurando el entorno de Lazarus para un proyecto de conversión

Crear un proyecto de prueba

  • Poner el código a convertir en un subdirectorio (convertdir, por ejemplo)
  • Desde Lazarus crear un proyecto nuevo.
  • Guardar (Archivo->Guardar Todo) en el subdirectorio convertdir. Poner nombres significativos a este proyecto y a su unidad principal es optativo.
  • Abrir la unidad principal del proyecto a convertir.
  • Añadirla al proyecto: Proyecto->Añadir archivo del Editor al Proyecto
  • Utilice Herramientas->Chequeo Rápido de la sintaxis o bien Ejecutar->Construir todo para empezar.

Cuestiones iniciales a tener en cuenta

  • 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"

Código fuente Delphi VCL y Kylix CLX en Lazarus

   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.

Problemas de conversión y soluciones

Equivalencia de archivos entre Delphi / Kylix y Lazarus

Delphi / Kylix Descripción Lazarus Descripción
.pas

.dfm/.xfm,

.dcu/.dpu,

.dpr(main project file),

.res,

.dof/.kof

---

---

---

Delphi Source File,

Delphi Form,

Delphi Compiled Unit,

Delphi Project,

Windows Resource File,

Delphi Option File

.pas, .pp

.lfm,

.o,

.lpr

---

---

.lrs,

.lpi(main project file),

.ppu

Pascal unit file,

Form data file,

Compiled unit file,

Project file,

Resource file,

Project options file,

Lazarus resource file,

Lazarus project information file,

FPC unit description file


   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.

Convirtiendo proyectos/formularios/unidades de Delphi a Lazarus

   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í:

 http://wiki.lazarus.freepascal.org/Delphi_Converter_in_Lazarus

   El siguiente texto explica las diferencias entre Delphi y Lazarus y cómo convertir manualmente.

   Cambia el nombre o copia el archivo .dpr a un .lpr. Comenta o elimina la directiva

{$R *.res}

y añade la directiva

{$mode delphi}{$H+}

o bien esta otra

{$mode objfpc}{$H+}

en 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.

   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.

   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:

  1. poner en minúsculas los nombre de archivo de inclusiones y de la sección uses.
  2. convierte el .dfm a .lfm (normalmente sin comprobar el contenido, únicamente el formato)
  3. crea un .lrs vacío (el contenido se creará después)
  4. añade la directiva
    {$mode delphi}
  5. sustituye la referencia a la unidad windows por LCLIntf
  6. añade la unidad LResources si es preciso (si se usa .lrs se pondrá
    uses LResources
    en la sección de implementación)
  7. elimina las unidades variants
  8. elimina la directiva
    {$R *.dfm}
  9. crea la sección de iniciación y añade en ella la directiva
    {$i unit.lrs}

   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)

Seleccionar el modo correcto de compilación

   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:

   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.

   Muchas unidades DELPHI compilan con FPC añadiendo a las mismas

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}

inmediatamente a continuación del nombre de la unidad.

   Para más detalles acerca de los modos de Free Pascal FPC ver Documentación de Free Pascal

Consideraciones sobre codificación para Multiplataforma

  • 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.
  • 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.
  • 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.
  • Si es necesario código específico para un SO, haz uso de bloques selectores (IFDEF). Ver más abajo una lista de macros.

Variables, "defines" y macros útiles del compilador

   Para escribir código que se adapte, y se comporte de forma distinta según el sistema, se utiliza la directiva

{$IFDEF identificador}.
  • {$IFDEF FPC}

   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}.

  • {$IFDEF LCL}

   Esta se define para utilizar el paquete LCL. Es útil para escribir código que funcione con LCL y Delphi.

  • {$IFDEF LCLGtk}
    ,
    {$IFDEF LCLWin32}
    ,
    {$IFDEF LCLQt}
    , ...

   Esta varible se define para utilizar el LCL en una determinada plataforma, usando los componentes visuales (widgetset).

  • {$IFDEF Unix} // para Linux, BSD, Mac OS X, Solaris
    ,
    {$IFDEF Win32}
    ,
    {$IFDEF Linux}
    // para Linux,
    {$IFDEF Darwin}
    // para OS X,
    {$IFDEF WinCE}
    // para WinCE,...

   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:

 {$IFDEF Linux}
   {$DEFINES Unix}
 {$ENDIF}

para que funcione en Kilix.

  • {$IFDEF ENDIAN_BIG}

   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.

  • {$IFDEF ENDIAN_BIG}

   Para más detalles ver Documentación de FPC.

Soporte para 32bit / 64 bit

   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:

  {$IFNDEF FPC}
  type
    PtrInt = integer;
    PtrUInt = cardinal;
  {$ENDIF}

   Sustituya todas las ocurrencias de integer(SomePointerOrObject) por PtrInt(SomePointerOrObject).

   Para más información ver Guía de programación para multiples plataformas Multiplatform Programming Guide

Buscando un identificador perdido

   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.

   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):

 grep -in ' tbutton =' lcl/*

   (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)

Diferencias mayores entre las unidades de Lazarus y las de Delphi

   ¡Por favor, añada lo que sepa sobre este tema!

  • Windows -> Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)

   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).

  • Messages -> LMessages

   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.

  • Graphics, Controls -> GraphType, GraphMath, Graphics, Controls

   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 ...

  • Mask -> MaskEdit

   Para racionalizar las convenciones sobre nombres, la unidad para la clase TMaskEdit se llama MaskEdit y no el confuso Mask de muchas versiones Delphi.

  • StdCtrls->StdCtrls,Buttons

   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.

Diferencias entre Delphi y FPC/LCL sobre propiedades y métodos

  • EL TBitmap de la LCL tiene una propiedad lienzo (canvas)
  • 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: Preguntas sobre Lazarus

Diferencias semánticas

Orden de evaluación de los parámetros
Delphi 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.
Procedimientos y funciones anidadas como variables de procedimiento
Delphi 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.
FPC, 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.
En resumen, no llames a procedimientos anidados a través de variables de procedimiento.

Diferencias de sintaxis

¡Por favor, añada lo que sepa sobre este tema!
Debido 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:
Al asignar una función de manejo de un evento, antepon un "@" a su nombre
Por ejemplo, se puede asignar la llamada a un botón manualmente
Delphi
OBJFPC
 begin
   if not Assigned(MiBoton.OnClick) then 
     MiBoton.OnClick:= UnaFuncion;
     //@ no necesario
     //más código...
 end;
 begin
   if not Assigned(MiBoton.OnClick) then
      MiBoton.OnClick:= @UnaFuncion;
     //@ Es necesario
     //más código...
 end;


Al llamar a una variable procedural usar esta sintaxis: ProcNombre()
En 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:
Delphi
OBJFPC
 With (UnObjeto) do 
  begin
   If Assigned(OnMiLlamada) then
     OnMiLlamada;
     //paréntesis no necesarios
  end;
 With (UnObjeto) do 
  begin
   If Assigned(OnMiLlamada) then
     OnMiLlamada();
     //los paréntesis son necesarios
  end;


Al obtener los valores de un puntero a registro hay que deshacer antes la referencia
En 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,
Delphi
OBJFPC
 Function DameValores(UnRegistro: PMiRegistro):Integer;
  begin
   If Assigned(UnRegistro) then
     Result:=UnRegistro.UnValor
   else
     Result:=0;
  end;
 Function DameValores(UnRegistro: PMiRegistro):Integer;
  begin
   If Assigned(UnRegistro) then
     Result:=UnRegistro^.UnValor
   else
     Result:=0;
  end;


Para acceder a caracteres de la cadena que es una propiedad de un objeto, esta debe ser encerrada entre paréntesis
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,
Delphi
OBJFPC
Type TUnComponente=class(TComponent)
  //Más código......
Published
Property MiCadena:String index 3 read GetMiCadena;
  //Más código....
End;

var
  MiLetra:char;
begin
  If Length(MiCadena)>2 then
    //paréntesis no necesarios
    MiLetra:= MiCadena[3];
    //Más código......
end;
 Type TUnComponente=class(TComponent)
  //Más código...
Published
Property MiCadena:String index 3 read GetMiCadena;
  //Más código...
End;

var
  MiLetra:char;
begin
  If Length(MiCadena)>2 then
    //paréntesis necesarios
    MiLetra:= (MiCadena)[3];
    //Más código......
end;


Hay que convertir los punteros al tipo real que espera la función con que se utiliza
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:
Delphi / ObjFPC
 Unit Unidad1
  Type TUnObjeto=class(TComponent)
    //Más código...
  End;
 Procedure HacerAlgo(Value: TSomeObject);
 Function GetUnObjeto: TUnObjeto;

 Unit Unidad2
  Type TUnComponente=class(TComponent)
   //Más código...
  Published UnObjeto: Pointer;
  //Más código...
  End;


Delphi
OBJFPC

   -- Aplicación ----------

 var 
   MiComponente: TUnComponente;
 begin
   MiComponente.UnObjeto:=GetUnObjeto
   //Más código...
   HacerAlgo(MiComponente.UnObjeto);
 end;

   -- Aplicación ----------

 var 
   MiComponente: TUnComponente;
 begin
   MiComponente.UnObjeto:=Pointer(GetUnObjeto);
   //Más código...
   HacerAlgo(TUnObjeto(MiComponente.UnObjeto));
 end;

Recursos

Los 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.
  • linux y *nix
  cd dir_de_lazarus/lazarus/tools
  make install
  • windows
    • Abrir una consola con CMD y escribir lo siguiente:
  cd dir_de_lazarus\tools
  dir_de_lazarus\fpc\2.2.0\bin\i386-win32\make install
(nota del traductor: esto en realidad construye todas las utilidades que hay en tools)
Para añadir rucursos a tu aplicación:
  • lazres mirecurso.lrs mi_dibujo.xpm otro_dibujo.xpm.
  • Añade la unidad LResources en ls cláusula Uses de la unidad.
  • Incluye la referencia al archivo .lrs creado dentro de bloque de iniciación.
Ejemplo:
 Unit Unidad1
  function TForm1.LoadGlyph(const NombreGrafico: String): TBitMap;
   begin
     Result:= TPixmap.Create; //¿no debería ser Result:= TBitMap.Create;?
     Result.LoadFromLazarusResource(NombreGrafico);
   end;
 //Más código...
 begin
   BotonRapido.glyph:= LoadGlyph('mi_dibujo');
   //Más código...
 end;

 initialization
  {$I Unidad1.lrs}
  {$I mirecurso.lrs}
 end.
Desde 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
Ejemplo:
 //hasta aquí todo igual

 initialization
  {$I Unidad1.lrs}
  {$R mirecurso.res}
 end.

Otro método para convertir proyectos Delphi o Kylix a Lazarus

  • 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...
  • Renombra o copia el archivo .dpr como .lpr.
  • Haz los cambios necesarios al archivo .lpr:
  1. Añade las directivas {$mode delphi}{$H+} o {$mode objfpc}{H+}
  2. Añade la unidad Interfaces a la clausula uses
  3. Comenta o borra la directiva {$R *.res} (esto no es necesario a partir de la versión 2.2 del FPC)
  • Haz los cambios necesarios a todas la unidades .pas:
  1. Añade las directivas {$mode delphi}{$H+} o {$mode objfpc}{H+}
  2. Añade la unidad LResources, y si el formulario tiene botones la unidad Buttons a la clausula uses
  3. Comenta o borra las directivas {$R *.dfm} o {$R *.xfm}
  4. Añade la sección Initialization al final de cada unidad, y añade una directiva {$I unitname.lrs} en su interior.
  • Crea un nuevo proyecto: Proyecto -> Nuevo proyecto desde archivo...
  • Selecciona el archivo .lpr que acabas de preparar
  • En la ventana Crear un proyecto nuevo selecciona Aplicación
  • 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
  • Guárdalo todo, y ya tienes un proyecto Lazarus :-)

Obtener ayuda

   Si encuentras un problema durante la conversión que no puedes resolver, hay una gran variedad de lugares donde obtener ayuda.

Documentación

Sobre Object Pascal y FPC El mejor sitio para empezar es la Documentación de Free Pascal de Michaël Van Canneyt y Florian Klämpfl.
Para cuestiones más enfocadas en Lazarus El proyecto de documentación de Lazarus Base de conocimientos Lazarus-CCR es el siguiente sitio donde buscar.

Soporte directo

Lista de correo Puedes enviar cuestiones a la lista de correo de Free Pascal Compiler o en los FPC foros, a los que un montón de espertos están suscritos.
Si tienes acceso a IRC: On irc.freenode.net: #fpc para FPC, o #lazarus-ide para Lazarus

Bases de conocimientos

   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:

Empaquetando y distribuyendo componentes

Creando un paquete Larazus para tu(s) componente(s)

   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 paquetes Lazarus que deben leerse antes de comenzar este proceso.

Documentación

   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.

   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 área de práctica.

Creando una página de lanzamiento de código

   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.

   El siguiente procedimiento permite crear el código de una página de lanzamiento de código con su navegador:

  • Acceda a lanzamiento de nuevos componentes
  • Escriba el nobre de su paquete o componente el la caja de texto y pulsa en Create Article
  • Cumplimenta la plantilla que aparecerá y guárdala.
  • Edita la página 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.

Envío del componente

   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 lanzamiento de nuevos componentes, para comenzar a crear la página.

   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 Usando el repositorio SVN de Lazarus-ccr.

Contribuciones y cambios

   Esta página ha sido convertida desde la versión epikwiki.

  • Versión incial por Tom Lisjac y Mattias Gärtner - 9/22/2003 VlxAdmin
  • Movido Cómo conseguir ayuda de la página principal. T. Lisjac - 9/24/2003 VlxAdmin
  • Añadida platillas de documentos, procedimientos y enlaces. 9/25/2003 VlxAdmin
  • LCLLinux renombrada como LCLIntf, Jesus Reyes, 9/27/2003
  • Añadida más información en los cambios de Unidad, AndrewJohnson 9/27/2003
  • Actualizadas las diferencias de sintaxis, incluyendo ejemplos, AndrewJohnson 9/27/2003
  • FPC 1.0.x no soporta interfaces, Vincent Snijders 9/28/2003
  • Nuevos ejemplos para la nueva definición de WikiWord, 9/28/2003 VlxAdmin
  • Mayor consistencia del Código para eliminar definiciones accidentales WikiWord, AndrewJohnson 9/27/2003
  • 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 10/17/2003
  • Utilización de estilo pascal para hacer los ejemplos más legibles, AndrewJohnson 10/18/2003
  • Adición de la sección 'Otro método para convertir proyectos Delphi o Kylix a Lazarus', George Lober, 2/17/2006
  • Versión en castellano (español) iskraelectrica (jldc) / mayo de 2008.