Difference between revisions of "Code Conversion Guide/fr"

From Lazarus wiki
Jump to navigationJump to search
m (Fixed syntax highlighting)
 
(29 intermediate revisions by one other user not shown)
Line 30: Line 30:
  
 
Voir :
 
Voir :
* [http://www.freepascal.org/probs.html Problèmes connus]
+
* [http://www.freepascal.org/probs.var Problèmes connus]
* [http://www.freepascal.org/bugs/db.php3?statusfield=Unfixed Bogues non résolus]
+
* [http://bugs.freepascal.org/my_view_page.php Traqueur de bogues]
  
 
=== Questions sur l'OS et de plate-forme ===
 
=== Questions sur l'OS et de plate-forme ===
Line 126: Line 126:
 
Fichier de description d'unité de FPC
 
Fichier de description d'unité de FPC
 
|}
 
|}
 +
 +
Ainsi, un fichier .dcu de Delphi corresponds grossièrement aux fichiers FPC .o et .ppu dans un seul fichier. Le .ppu est principalement la partie entête (interface), le .o principalement la partie implementation. Les principales exceptions sont les fonctions en-ligne qui dans la forme à insérer sont dans le .ppu.
  
 
==== Convertir les projets/fiches/unités Delphi vers Lazarus ====
 
==== Convertir les projets/fiches/unités Delphi vers Lazarus ====
Line 184: Line 186:
 
   {$Define Unix}
 
   {$Define Unix}
 
  {$EndIf}
 
  {$EndIf}
pour travailler autour de ceci pour Kylix .
+
pour contourner ceci pour Kylix .
  
 
Pour plus de détails voir la [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 Documentation de Free Pascal].
 
Pour plus de détails voir la [http://www.freepascal.org/docs-html/prog/prog.html#QQ2-23-21 Documentation de Free Pascal].
 
'''Texte gras'''
 
'''Texte gras'''
 +
 +
==== 32bit / 64 bit support ====
 +
 +
Les pointeurs en 64bit demande 8 octets au lieu de 4 en 32bit. Le type 'Integer' demeure en 32bit pour compatibilité. Cela signifie que vous ne pouvez plus forcer les pointeurs en Integer et revenir en arrière. FPC définit deux nouveaux types : PtrInt and PtrUInt. PtrInt est une entier 32bit signé dans les plates-formes 32bit et un entier signé 64bit dans les plate-formes 64bit. La même chose avec PtrUInt mais en prenant des entiers non signés. Utilisez ce code qui devrait tourner pour Delphi et FPC :
 +
<syntaxhighlight lang="pascal">
 +
{$IFNDEF FPC}
 +
type
 +
  PtrInt = integer;
 +
  PtrUInt = cardinal;
 +
{$ENDIF}
 +
</syntaxhighlight>
 +
 +
Remplacer tous les '''integer(SomePointerOrObject)''' par '''PtrInt(SomePointerOrObject)'''.
 +
 +
Pour plus d'information, voir [[Multiplatform Programming Guide/fr|Guide de programmation Multi plate-forme]].
  
 
==== Trouver un identificateur manquant ====
 
==== Trouver un identificateur manquant ====
Line 203: Line 220:
 
* Windows->Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
 
* Windows->Interfaces, LCLIntf, LCLType, LCLProc, VCLGlobals, ...)
  
Comme la bibliothèque LCL n'est pas spécifique dédiée windows, le code qui est dans l'unité Windows de Delphi pour accéder directement à l'API Win32, est placé dans des interfaces distinctes, lequel se situe dans l'unité LCLIntf. Gardez à l'esprit que Lazarus n'émule pas  win32. Beaucoup de fonctions sont absentes et certaines ne fonctionnent pas comme leur homologues win32 . Ces fonctions existent seulement pour la compatibilité avec Delphi et devrait seulement être employées pour un portage rapide. la bibliothèque LCL modifie plusieurs des types , ainsi souvent LCLType, et parfois  VCLGlobals sont exigés . LCLProc contient également quelques fonctions ce qui peut être utile pour la manipulation de plus bas niveau comme "FreeThenNil", comme c'est le cas dans Delphi 5 (et plus). Utilisez "DeleteAmpersands" pour enlever des esperluètes additionnelles d'une chaîne de caractère pour les contrôles(& contre && etc). L'unité interfaces doit être incluse dans le fichier .lpr pour initialiser les jeux de composants graphiques appropriés .
+
Comme la bibliothèque LCL n'est pas spécifiquement dédiée à Windows, le code qui est dans l'unité Windows de Delphi pour accéder directement à l'API Win32, est placé dans des interfaces distinctes, lequel se situe dans l'unité LCLIntf. Gardez à l'esprit que Lazarus n'émule pas  win32. Beaucoup de fonctions sont absentes et certaines ne fonctionnent pas comme leur homologues win32. Ces fonctions existent seulement pour la compatibilité avec Delphi et devrait seulement être employées pour un portage rapide. La bibliothèque LCL modifie plusieurs des types, ainsi souvent LCLType, et parfois  VCLGlobals sont exigés. LCLProc contient également quelques fonctions ce qui peut être utile pour la manipulation de plus bas niveau comme "FreeThenNil", comme c'est le cas dans Delphi 5 (et plus). Utilisez "DeleteAmpersands" pour enlever des esperluètes additionnelles d'une chaîne de caractères pour les contrôles (& contre && etc). L'unité d'interfaces doit être incluse dans le fichier .lpr pour initialiser les jeux de composants graphiques appropriés .
  
 
* Messages->LMessages
 
* Messages->LMessages
  
Les messages Tcontrol des evenements callback de win32 au format WM_CALLBACK et leurs structures associées sont généralement situés dans DELPHI dans l’unité Messages. Dans la LCL ce type de messages et leurs structures se trouvent dans Lmessages, avec en général le changement de « WM » en « LM ». Par exemple WM_MOUSEENTER devient LM_MOUSEENTER et TWMMouse devient TLMMouse.
+
Les messages TControl des événements callback de Win32 au format WM_CALLBACK et leurs structures associées sont généralement situés dans DELPHI dans l’unité Messages. Dans la LCL ce type de messages et leurs structures se trouvent dans Lmessages, avec en général le changement de « WM » en « LM ». Par exemple WM_MOUSEENTER devient LM_MOUSEENTER et TWMMouse devient TLMMouse.
  
 
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls
 
* Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls
  
Afin de simplifier les référencements multiples et circulaires d’unités quelques nouveaux types ont été définis dans une unité appelée GraphType regroupant des éléments qui, dans Delphi, sont placés dans Graphics ou Controls (par exemple le BvNone des Panels). Vous aurez donc parfois à l’utiliser. De même, GraphMath est une autre unité, qui bien qu’incompatible avec Delphi inclue d’autres fonctionnalités utiles. Elle prend en compte la précision TfloatPoint, diverses routines de Beziers, les lignes, les arcs, la surcharge d’opérateur telle que Point1=Point2+Point3 et la comparaison de Trects :  
+
Afin de simplifier les référencements multiples et circulaires d’unités quelques nouveaux types ont été définis dans une unité appelée GraphType regroupant des éléments qui, dans Delphi, sont placés dans Graphics ou Controls (par exemple le BvNone des Panels). Vous aurez donc parfois à l’utiliser. De même, GraphMath est une autre unité, qui bien qu’incompatible avec Delphi inclut d’autres fonctionnalités utiles. Elle prend en compte la précision TFloatPoint, diverses routines de Béziers, les lignes, les arcs, la surcharge d’opérateur telle que Point1=Point2+Point3 et la comparaison de Trects :  
 
If (Rect1=Rect2) then …
 
If (Rect1=Rect2) then …
  
 
* Mask->MaskEdit
 
* Mask->MaskEdit
  
Afin de la nommer plus intelligement l’unité des TmaskEdit est nommée [MaskEdit] au lieu du nébuleux Mask de beaucoup de versions de Delphi.
+
Afin de la nommer plus intelligement l’unité des TMaskEdit est nommée [MaskEdit] au lieu du nébuleux Mask de beaucoup de versions de Delphi.
  
 
* StdCtrls->StdCtrls,Buttons
 
* StdCtrls->StdCtrls,Buttons
  
Dans beaucoup de versions de Delphi, Tbutton est situé dans StdCtrls, alors que TspeedButton et TbitBtn sont dans Buttons. Plus simplement, la LCL place tous les types de boutons dans Buttons, ce qui peut occasionnellement interrompre la traduction du code. Il est donc préférable de l’inclure systématiquement.
+
Dans beaucoup de versions de Delphi, Tbutton est situé dans StdCtrls, alors que TSpeedButton et TBitBtn sont dans Buttons. Plus simplement, la LCL place tous les types de boutons dans Buttons, ce qui peut occasionnellement interrompre la traduction du code. Il est donc préférable de l’inclure systématiquement.
  
 
==== Différences des Propriétés et methodes entre Delphi et FPC/LCL ====
 
==== Différences des Propriétés et methodes entre Delphi et FPC/LCL ====
 
* TBitmap inclu un Canvas dans la LCL
 
* TBitmap inclu un Canvas dans la LCL
 +
* [[Lazarus_Faq#Why are TForm.ClientWidth§ClientHeight the same as TForm.Width.2FHeight]]
  
 
====Différence sémantique====
 
====Différence sémantique====
Line 229: Line 247:
 
=====Ordre d'évaluation des paramètres=====
 
=====Ordre d'évaluation des paramètres=====
  
Delphi garantit que tous les paramètres sont évalués de la gauche vers la droite. FPC ne présente pas cette garantie et peut evaluer les paramètres dans n’importe quel ordre afin de générer un code optimal.
+
Delphi garantit que tous les paramètres sont évalués de la gauche vers la droite (sauf si une convention d'appel est précisée et spéficie autre chose, pour s'interfacer avec des routines C p.ex). FPC ne présente pas cette garantie et peut evaluer les paramètres dans n’importe quel ordre afin de générer un code optimal.
  
=====Nested procedures/functions as procedural variables=====
+
=====Procédures/Fonctions imbriquées en variables procédurales=====
 +
[https://en.wikipedia.org/wiki/Call_stack voir l'article Wikipedia(en)]
  
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.
+
Delphi passe le pointeur de cadre de la procédure parent toujours sur la pile, et c'est à l'appelant de l'enlever à nouveau. Cela signifie qu'aussi longtemps que vous n'accédez pas aux variables de la procédure parent, vous pouvez passer l'adresse de la fonction imbriquée à une autre fonction qui peut alors l'appeler comme n'importe quelle variable procédurale.
  
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.
+
FPC de son côté, passe toujours le pointeur de cadre de la procédure parent comme un premier paramètre caché selon la convention d'appel employée, ce qui signifie que si vous appelez une procédure imbriquée comme une variable procédurale normale, tous les paramètres seront "décalés" d'une position.
  
In short, do not call nested procedures via procedural variables.
+
En bref, n'appelez pas de procédure imbriquée au moyen d'une variable procédurale.
  
 
==== différence de syntaxe====
 
==== différence de syntaxe====
  
'''Please add to this topic!'''
+
'''SVP compléter cet article!'''
  
 
A cause de restrictions propres à FPC, des changements de synthaxe sont nécessaires.
 
A cause de restrictions propres à FPC, des changements de synthaxe sont nécessaires.
La directive {$Mode Delphi} autorise, comme Delphi, moins de rigueur. Aussi adaptez votre règles synthaxiques avec {$Mode ObjFPC} au plus vite, même si le code doit être partagé par Delphi et LCL. Certaines sont simplement de meilleurs pratiques
+
La directive {$Mode Delphi} autorise, comme Delphi, moins de rigueur. Aussi adaptez votre règles synthaxiques avec {$Mode ObjFPC} au plus vite, même si le code doit être partagé par Delphi et LCL. Certaines sont simplement de meilleurs pratiques et parfois parce que le mode Delphi n'est pas assez précis, ou dans quelques cas, un code acceptable pour Delphi ne fonctionne pas comme attendu avec FPC, même s'il pourrait compiler.
  
 +
À cette fin, même si tous ces éléments ne sont pas strictement requis, la liste suivante de changements devrait être considérée comme obligatoire :
  
 
+
=====Pour affecter un gestionnaire à un évènement vous devez le préfixer avec "@"=====
=====Pour assigner un point d'entrée à un évènement vous devez le préfixer avec "@"=====
 
  
 
Par exemple, pour assigner une procédure à un évènement "OnClick" d'un bouton :  
 
Par exemple, pour assigner une procédure à un évènement "OnClick" d'un bouton :  
Line 255: Line 274:
 
! Delphi !! FPC
 
! Delphi !! FPC
 
|-
 
|-
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
begin
 
begin
 
   if not Assigned(MyButton.OnClick) then  
 
   if not Assigned(MyButton.OnClick) then  
Line 263: Line 282:
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
begin
 
begin
 
   if not Assigned(MyButton.OnClick) then
 
   if not Assigned(MyButton.OnClick) then
Line 272: Line 291:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
|}
 
|}
 +
NB : cela n'est pas limité aux seuls événements, mais concerne tous les types procéduraux.
  
=====When calling a procedure variable use this syntax: theprocname()=====
+
=====En appelant une variable procédure utilisez cette syntaxe : 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 -
 
  
 +
En Delphi, il n'y a aucune différence entre un résultat de fonction et une variable. Par contre, il y en a une en FPC, ainsi pour appeler une fonction, même si elle n'a pas de paramètre, vous devez ajouter des parenthèses. Par exemple :
  
 
{| border="1" width="800"
 
{| border="1" width="800"
 
! Delphi !! FPC
 
! Delphi !! FPC
 
|-
 
|-
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
With (SomeObject) do  
 
With (SomeObject) do  
 
begin
 
begin
Line 289: Line 308:
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
With (SomeObject) do  
 
With (SomeObject) do  
 
begin
 
begin
Line 299: Line 318:
 
|}
 
|}
  
=====Pointeur de record=====
+
=====Déréférencement de pointeur d'enregistrement=====
 
 
Dans Delphi , lorqu’on tente d’acceder aux membres d’un Record, il n’est pas necessaire de faire la différence entre le pointeur du Record et le Record lui-même. FPC fait la distinction :
 
  
 +
Dans Delphi , lorqu’on tente d’accéder aux membres d’un Record, il n’est pas nécessaire de faire la différence entre le pointeur du Record et le Record lui-même. FPC fait la distinction :
  
 
{| border="1" width="800"
 
{| border="1" width="800"
 
! Delphi !! FPC
 
! Delphi !! FPC
 
|-
 
|-
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
Function GetSomeValue(ARecord: PMyRecord):Integer;
 
Function GetSomeValue(ARecord: PMyRecord):Integer;
 
begin
 
begin
Line 316: Line 334:
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
Function GetSomeValue(ARecord: PMyRecord):Integer;
 
Function GetSomeValue(ARecord: PMyRecord):Integer;
 
begin
 
begin
Line 329: Line 347:
 
=====Des parenthèses pour acceder aux chars d'une propriété string d'un objet =====
 
=====Des parenthèses pour acceder aux chars d'une propriété string d'un objet =====
  
Il est possible avec Delphi de traiter les propriétés commes des variables, meme pour acceder directement aux valeurs particulières des Char d’un String. C’est impossible avec FPC, notamment lorsque des propriétés sont indexées (traitées comme des tableaux). Dans ce cas, la propriété appelée doit être comprise dans des parenthèses. Même ce n’est pas toujour le cas il est préférable de s’y astreindre systématiquement. Exemple :
+
Il est possible avec Delphi de traiter les propriétés comme des variables, même pour accéder directement aux valeurs particulières des Char d’un String. C’est impossible avec FPC, notamment lorsque des propriétés sont indexées (traitées comme des tableaux). Dans ce cas, la propriété appelée doit être comprise dans des parenthèses. Même si ce n’est pas toujours, le cas il est préférable de s’y astreindre systématiquement. Exemple :
  
 
{| border="1" width="800"
 
{| border="1" width="800"
 
! Delphi !! FPC
 
! Delphi !! FPC
 
|-
 
|-
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
Type TSomeComponent=class(TComponent)
 
Type TSomeComponent=class(TComponent)
 
   //More code...
 
   //More code...
Line 351: Line 369:
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
Type TSomeComponent=class(TComponent)
 
Type TSomeComponent=class(TComponent)
 
//More code...
 
//More code...
Line 372: Line 390:
 
===== Ne confondez pas le pointeur et ce qui est pointé=====
 
===== Ne confondez pas le pointeur et ce qui est pointé=====
  
Parfois dans Delphi vous pouvez obtenir un pointeur, adressant un objet avec une valeur nulle. Bien que ce type de situation soit complexe, c’est très souvent le cas dans les grands paquets de composants afin de réduire les imbrications d’objets de différentes unités. Il est donc possible dans Delphi d’envoyer un pointeur nul à une fonction attendant un objet, sans se soucier du type d’objet associé au pointeur. En FPC vous ne devez pas confondre l’objet et son pointeur.  
+
Parfois dans Delphi vous pouvez obtenir un pointeur, adressant un objet avec une valeur nulle. Bien que ce type de situation soit complexe, c’est très souvent le cas dans les grands paquets de composants afin de réduire les imbrications d’objets de différentes unités. Il est donc possible dans Delphi d’envoyer un pointeur nul à une fonction attendant un objet, sans se soucier du type d’objet associé au pointeur. En FPC vous ne devez pas confondre l’objet et son pointeur. La conversion de type est nécessaire.
  
 
Exemple :
 
Exemple :
Line 379: Line 397:
 
! Delphi !! FPC
 
! Delphi !! FPC
 
|-
 
|-
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
Unit 1
 
Unit 1
 
   Type  
 
   Type  
Line 406: Line 424:
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
|<syntaxhighlight>
+
|<syntaxhighlight lang="pascal">
 
Unit 1
 
Unit 1
 
   Type  
 
   Type  
Line 434: Line 452:
 
|}
 
|}
  
==== Resources ====
+
==== Ressources ====
 +
 
 +
{{Note|La section ci-dessous n'est peut-être pas nécessaire. Les dernières versions de Lazarus supportent directement les fichers .res. L'installateur Windows de Lazarus inclut un compilateur de ressource qui supporte les fichiers .rc. Sur Unix, assurez-vous que windres est installé ainsi vous pouvez utiliser les fichiers .rc. Se reporter à [[Lazarus_Resources/fr#FPC_resources| Ressources FPC]].}}
  
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.
+
Les fichiers de ressource de Delphi sont spécifiques à Win32 et ne sont pas compatible avec Lazarus, donc vous devez les recréer et les compiler avec l'outil Lazres. Lazres peut être trouvé dans le sous-dossier lazarus/tools. Si vous avez téléchargé les sources de Lazarus, vous aurez besoin de le compiler.
 
* cd lazarus/tools
 
* cd lazarus/tools
 
* make install
 
* make install
To add a resource to your application:
+
Pour ajouter une ressource à votre application :
 
* lazres myresource.lrs mypix.xpm anotherpix.xpm
 
* lazres myresource.lrs mypix.xpm anotherpix.xpm
* Add the LResources unit to your Uses clause
+
* Ajouter l'unité LResources à votre clause Uses
* Include the .lrs file you created under the initialization block
+
* Incluez le fichier .lrs que vous avez créé sous le bloc d'initialisation
Example:
+
Exemple:
 
+
<syntaxhighlight lang="pascal">
<syntaxhighlight>
 
 
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;
 
function TForm1.LoadGlyph(const GlyphName: String): TBitMap;
 
begin
 
begin
Line 463: Line 482:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===Another method to convert a Delphi or Kylix project to Lazarus===
+
===Une autre méthode pour convertir un projet Delphi ou Kylix vers 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))
+
* Renommer ou copier tous les fichiers .dfm ou .xfm vers .lfm (les très anciennes versions de Delphi ne produisent pas de fichiers .dfm basés sur du texte. L'utilitaire convert est, si présent, dans le dossier \bin et doit être utilisé d'abord avec les .dfm)
* Rename or copy .dpr file to .lpr
+
* Renommer ou copier le fichier .dpr en .lpr.
* Make necessary changes to .lpr file:
+
* Apportez toutes les modifications nécessaires aux fichier .lpr.
Add {$mode delphi}{$H+} or {$mode objfpc}{H+} directives
+
Ajouter les directives {$mode delphi}{$H+} ou {$mode objfpc}{H+}  
Add 'Interfaces' to uses clause
+
Ajouter 'Interfaces' à la clause Uses
Comment out or delete {$R *.res} or directive
+
Commenter ou supprimer {$R *.res} ou mettre en directive au besoin
* Make necessary changes to all .pas unit files:
+
* Apporter les modifications nécessaires à tous les fichiers d'unités :
Add {$mode delphi}{$H+} or {$mode objfpc}{H+} directives
+
Ajouter la directive {$mode delphi}{$H+} ou {$mode objfpc}{H+}
Add 'LResources', and if the form has buttons, add 'Buttons' to uses clause
+
Ajouter 'LResources' - à faire : vérifier si c'est toujours à faire pour les les nouvelles versions de Lazarus
Comment out or delete {$R *.dfm} or {$R *.xfm} directive
+
#  Si la fiche contient des boutons, ajouter l'unité 'Buttons' à la clause Uses.
#   Add 'Initialization' section at the end of each unit file, and add {$I unitname.lrs} directive in it
+
Commenter ou supprimer les directives {$R *.dfm} or {$R *.xfm}
Select Project->New Project form file
+
# Ajouter la section 'Initialization' à la fin de chaque fichier d'unité, et ajouter la directive {$I unitname.lrs} dedans
Select the .lpr file
+
Sélectionner Projet->Nouveau projet depuis un fichier
At 'Create a new project' window, choose 'Application'
+
Sélectionner le fichier .lpr
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.  
+
Dans la fenêtre 'Créer un nouveau projet', choisissez 'Application'
Save all, and you have a Lazarus project :-)
+
Construisez le projet et faites les corrections nécessaire plus loin pour obtenir une compilation propre. A ce moment, le fichier .lpi est généré automatiquement. vous pouvez obtenir des messages 'Error reading Form', cliquer sur 'Continuer le chargement' dans ce cas.
 +
enregistrer tout, et vous avez un projet Lazarus :-)
  
== Getting Help ==
+
== Obtenir de l'aide ==
  
If you encounter a problem during conversion that you just can't solve, there are a wide variety of places to get help. For pure Object Pascal and FPC issues, 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. For more Lazarus oriented problems, the Lazarus Project Documentation in the Lazarus-CCR Knowledgebase [[Main Page]] is the next place to look. Finally 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.
+
Si vous rencontrez un problème pendant la conversion que vous ne pouvez pas résoudre, il y a une large variété d'endroits où l'on peut obtenir de l'aide.
  
There are some outstanding search and knowledge bases online that can also be a great help for learning new techniques and solving problems. Tamarack Associates operates a fast [http://www.tamaracka.com/search.htm search] engine specifically for the Borland usenet archives. Mer Systems Inc. provides a similar search [http://www.mers.com/searchsite.html engine]. 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].
+
{|
 +
| colspan="2" |
 +
=== Documentation ===
 +
|-
 +
| Pour les problèmes purement Pascal Objet et FPC
 +
| style="vertical-align: top" | Le meilleur endroit pour commencer est la [http://www.freepascal.org/docs-html/ Documentation de Free Pascal] par Michaël Van Canneyt et Florian Klämpfl.  
 +
|-
 +
| Pour les problème plus orientés vers Lazarus
 +
| style="vertical-align: top" | La documentation du projet dans la base de connaissance Lazarus-CCR [[Main Page/fr|Page principale]] est le prochain endroit où vous regarderez.  
 +
|-
 +
| colspan="2" |
  
== Packaging and Releasing your component ==
+
=== Support par les pairs ===
 +
Pour poser des questions à des experts ou des développeurs plus avancés :
 +
|-
 +
| style="white-space: nowrap" | Mailing lists
 +
| 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://forum.lazarus.freepascal.org/index.php?action=forum FPC/Lazarus forums] where a lot of experts are subscribed.
 +
|-
 +
| style="white-space: nowrap" | Si vous avez accès à IRC:
 +
| style="vertical-align: top" | sur irc.freenode.net: [irc://irc.freenode.net/fpc #fpc] pour FPC, ou [irc://irc.freenode.net/lazarus-ide #lazarus-ide] pour Lazarus
 +
|-
 +
| style="white-space: nowrap" | Forum francophone d'entraide :
 +
| style="vertical-align: top" | sur [http://www.developpez.net/forums/f21/autres-langages/pascal/ Developpez.com (Zone Pascal)]
 +
|}
  
=== Creating a Lazarus package for your component(s) ===
+
=== Bases de connaissance ===
 +
Il existe des bases de recherche et de connaissances exceptionnelles en ligne qui peuvent également être d'une grande aide pour apprendre de nouvelles techniques et résoudre des problèmes:
 +
* Tamarack Associates exploite un [<!--http://www.tamaracka.com/search.htm-->http://codenewsfast.com/  moteur de recherche] rapide particulièrement pour les archives Usenet de Borland.
 +
* Mer Systems Inc. fournit un [http://www.mers.com/searchsite.html moteur de recherche] similaire
 +
* Une autre source d'information exceptionnelle ainsi qu'une capacité de [http://www.efg2.com/Lab/search.htm recherche] sur site est Earl F. Glynn Computer Lab and Reference.
  
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.
+
== Empaqueter et livrer votre composant ==
  
=== Documentation ===
+
=== Création d'un paquet Lazarus pour votre(vos) composant(s) ===
  
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.
+
La création d'un paquet rend plus aisé le processus d'installation du code que vous avez converti... surtout si vous fournisseez plus d'un composant. Mattias Gärtner a écrit une vue d'ensemble des [[Lazarus Packages/fr|paquets Lazarus]] qui devrait être lus préalablement à ce processus.
  
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.
+
=== Documentation ===
  
=== Creating a Code Release Page ===
+
L'objectif de ce site et le format wiki vise à rendre facile et rapide la production d'une documentation de niveau professionnelle. Le wiki rend aussi possible de voir le résultat de votre travail immédiatement et de faire tous les changements que vous voulez en temps réel.
  
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.
+
L'utilisation du wiki Lazarus-CCR pour créer une documentation de bel aspect est très simple. Si vous n'avez jamais utilisez de balisage auparavant, vous pouvez vous y familiariser à l'aide de l'aire d'entrainement [[Sand Box/fr|bac à sable]].
  
The following procedure will let you create a Code Release Page with your browser:
+
=== Création d'une page de livraison du code ===
  
* Go to the [[Release new component]]
+
La livraison de la page de code contient l'information vitale sur votre composant qu'un téléchargeur aurait besoin de savoir, telle que la  licence, les plates-formes prévues, le statut (alpha, bêta, stable...), d'où le télécharger, qui l'a écrit, est-ce qu'un support est disponible... etc.
* Type the name of your component in the textbox and click on ''Create Article''
 
* Fill in the template and hit save.
 
* 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.
 
  
=== Submitting the component ===
+
La procédure suivante vous permettra de créer une page de publication de code avec votre navigateur :
  
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.
+
* Aller vers le [[Release new component/fr|Release new component]]
 +
* Taper le noms de votre composant dans la boîte de texte et cliquer sur ''Create Article''
 +
* Remplir le modèle et enregistrer.
 +
* Editer la page [[Components and Code examples/fr|Components and Code examples]] et ajouter le lien que vous venez de créer vers la section "Released Components". enregistrer la page modifiée.
  
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]].
+
=== Soumission de votre comoposant ===
  
== Contributors and Changes ==
+
Si vous n'êtes pas le responsable de la livraison dans le projet, remonter votre composant vers le système de livraison de SourceForge et ajoutez-le à la liste des paquets de livraison. Autrement, envoyez-le à l'un des administrateur du projet ([[User:Tom |Tom Lisjac]] ou [[User:Vincent |Vincent Snijders]]) et nous l'ajouterons au dépôt ("repository"). Avant que nous le déposions, vous devez créer une ''Page de livraison de code'' pour décrire votre composant. Vous pouvez utiliser la page [[Release new component/fr|Livraison d'un nouveau composant]] pour commencer la création d'une telle page.
  
This page has been converted from the epikwiki [http://lazarus-ccr.sourceforge.net/index.php?wiki=CodeConversionGuide version].
+
Si vous pensez que vous aurez encore besoin de développer votre composant, vous pouvez le déposer dans SVN, comme cela vous aurez encore accès à lui. Si nous nous lassons de soumettre vos correctifs, nous vous donnerons l'accès en écriture au SVN, afin que vous puissiez valider vos correctifs vous-même. Pour plus de détails, voir l'[[Using the Lazarus-ccr SVN repository/fr|Utilisation du référentiel SVN de Lazarus-ccr]].
* Initial version by Tom Lisjac and Mattias Gärtner - 9/22/2003 [[User:Tom | VlxAdmin]]
 
* Moved Getting help from the main page. T. Lisjac - 9/24/2003 [[User:Tom | VlxAdmin]]
 
* Added documentation templates, procedure and links. 9/25/2003 [[User:Tom | VlxAdmin]]
 
* LCLLinux was renamed to 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
 
* Updated Syntax differences, including some examples, [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
 
* Fixed some of the examples per new WikiWord definition, 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
 
* 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
 
* Use pascal stylesheet to make example code more readable, [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
 

Latest revision as of 00:31, 11 February 2020

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

Cette page traite de la façon de convertir le code existant en Delphi ou Kylix pour fonctionner avec le compilateur Free Pascal et l'IDE Lazarus. Bien que Lazarus et le compilateur Free Pascal ont des aspects en commun avec Delphi et Kylix, ce ne sont pas des clones. Il y a un certain nombre de différences de convention et d'appel de bibliothèque ... et dans quelques secteurs , FPC est amélioré et peut être plus exigeant sur une syntaxe correcte . Veuillez voir le guide Lazarus For Delphi Users pour une description de quelques unes des différences fonctionnelles .

Le but de ce guide est de documenter certaines des différences spécifiques qui sont fréquemment rencontrées pendant le processus de conversion de code en traduisant le code existant de Delphi à Lazarus.

Ce document a été placé dans la base de connaissance du wiki ainsi il pourrait être facilement complété par n'importe qui qui avait rencontré un problème unique et voudrait le signaler pour que d'autres s'en rendent compte.

Choix d'un composant ou d'une bibliothèque pour la conversion

Où trouver le code pour convertir

Il y a beaucoup de code disponible sur le net qui peut être converti pour être utilisé par FPC et Lazarus . Voici une Page de sites avec du code qui est juste un début. S'il vous plaît, complétez-le si vous connaissez d'autres bonnes adresses. TurboPower Software a récemment réalisé son offre commerciale entièrement sous MPL (Licence publique de Mozilla). Une liste de paquets disponibles peut être trouvée ici .

Pour éviter un double effort, les paquets qui ont été déjà été convertis sont listés sur la page composants et Exemples de code . Si vous avez converti un paquet ou travaillez sur un, veuillez ajouter une note sur la page Projets en cours de conversion .

Autorisation

Il existe des licences depuis le Freeware (domaine public) jusqu’à des versions plus restrictives interdisant toute modification, redistribution ou usage commercial. Avant d’entreprendre toute conversion, il est nécessaire d’examiner les droits attachés au code. Le type de la licence de protection est essentiel lorsque l’on colle sur une Form un composant imposant des droits incompatibles avec l’ensemble de l’application concernée.

Lors de la traduction de composants, respectez les souhaits de l’auteur et conservez les copyrights et les entêtes des licences avec les adresses E-mail et les url. De même, il souhaitable d'informer l'auteur que ses composants sont en cours de conversion ... Surtout si le composant est sous une License restrictive. Dans le cas de composants oubliés et plus exploités, les auteurs révisent souvent les droits associés.

Généralement le domaine public (Freeware) et le LGPL/MPL sont les plus souples pour la diffusion de composants. Pour obtenir plus d’information concernant la[Définition Open Source http://www.opensource.org/docs/definition.php] est un bon commencement. Vous trouverez aussi d’autres types de licences et leur impact sur le code y étant attaché.

Dépendances

Une autre étape avant de commencer à travailler sur une conversion est vérifier que le code n'a pas des dépendances profondes avec d'autres paquets qui pourraient ne pas être disponibles ou qui représente un défi considérable de conversion. Quelques offres de freeware sont liées à ou bien prolongent les paquets propriétaires qui ne sont fréquemment plus disponibles ou viennent avec des licences inadéquates.

Problèmes liés au Compilateur

Voir :

Questions sur l'OS et de plate-forme

Lazarus et le compilateur Free Pascal sont des outils de developpement multi plate-forme et multi-architecture. En revanche , la plupart du code existant Delphi a été spécifiquement conçu pour fonctionner sur un processeur Intel sous Win32 . Si votre composant candidat a beaucoup de code spécifique Win32 , il pourrait être sage d'essayer et de trouver une plateforme alternative . Mais ne laissez pas ceci vous stopper... c'est véritablement étonnant ce que la LCL supporte!

Faire la conversion

Paramétrer l'environnement de Lazarus pour un projet de conversion

Créer un projet test

  • Placer le code à convertir dans un sous-répertoire (par exemple: convertdir)
  • Lancer Lazarus
  • Fichier->Tout Enregistrer vers le sous-répertoire convertdir. Les noms significatifs pour le Projet et l'unité par défaut sont optionnels.
  • Ouvrir l'unité « principale » à convertir dans convertdir
  • L'ajouter au projet : Projet->Ajouter le fichier de l'éditeur au Projet
  • Lancer Outils->Vérification rapide de la syntaxe ou lancer Executer->Construire Tout pour commencer .

Choses initiales à regarder

  • Les noms de fichier sont sensibles à la casse avec les versions de compileurs 1.0.x. Si vous travaillez avec cette version, faire que tout vos noms de fichiers soient en minuscules. Vous obtiendrez les erreurs "fichiers non trouvés" si vous ne le faites pas.

Sources Delphi VCL, Kylix CLX dans Lazarus

En convertissant des sources Delphi/Kylix, il est souvent utile de trouver des déclarations pour voir ce qu'une fonction spécifique fait. L'EDI Lazarus peut analyser les sources Delphi/Kylix. Pour faire ceci il a besoin de quelques chemins de recherche et paramètres du compilateur. Vous pouvez facilement paramétrer ceci dans Configuration->Editeur des directives des outils de code...->Inserer un modèle

Problèmes de conversion et solutions

Fichier Delphi / Kylix équivalents dans Lazarus

Delphi / Kylix Description Lazarus Description
.pas

.dfm/.xfm,

.dcu/.dpu,

.dpr(Code source du projet),

.res,

.dof/.kof

---

---

---

Fichier source Delphi,

Fiche Delphi,

Unité compilée Delphi,

Projet Delphi,

Fichier de ressource Windows,

Fichier d'options Delphi

.pas, .pp

.lfm,

.o,

.lpr

---

---

.lrs,

.lpi(Fichier de projet),

.ppu

Fichier unité Pascal,

Fichier de donnée de fiche,

Fichier d'unité compilée,

Fichier de projet,

Fichier de ressource,

Fichier d'options du projet,

Fichier de ressource de Lazarus,

Fichier d'information de projet Lazarus,

Fichier de description d'unité de FPC

Ainsi, un fichier .dcu de Delphi corresponds grossièrement aux fichiers FPC .o et .ppu dans un seul fichier. Le .ppu est principalement la partie entête (interface), le .o principalement la partie implementation. Les principales exceptions sont les fonctions en-ligne qui dans la forme à insérer sont dans le .ppu.

Convertir les projets/fiches/unités Delphi vers Lazarus

Renommez ou copiez le fichier .dpr vers un fichier .lpr. Mettre en commentaire ou enlevez la directive {$R *.res} et ajouter une directive {$mode delphi}{$H+} ou {$mode objfpc}{$H+} au fichier .lpr. L'IDE Lazarus peut vous assister dans cette conversion à travers l'item du menu outils "Convertir un projet Delphi en projet Lazarus...". Il demande un fichier .dpr (projet Delphi) et le convertit en .lpr; en outre, il crée le fichier .lpi et convertit toutes les unités .

Beaucoup de fiches existantes de Delphi peuvent être converties pour fonctionner avec Lazarus en employant le convertisseur de fiche .dfm vers .lfm intégré de l'IDE. Il peut être trouvé sous le menu outils à l'item "Convertir un fichier DFM en LFM...". Faire appel à la boite de dialogue fichier, sélectionnez le(s) fichier(s) dfm et le convertisseur fera le reste .

Si vous devez convertir l'unité entière (avec ou sans une fiche), Lazarus inclut également un item intégré "Convertir une unité Delphi en unité Lazarus..." qui fera ce qui suit pour vous -

  1. fixe le cas des noms de fichier include et des sections uses.
  2. converti les fichiers .dfm vers les fichiers .lfm (actuellement sans contrôler le contenu, juste le format)
  3. crée un fichier vide .lrs (le contenu sera créé plus tard )
  4. Ajoute la directive {$mode delphi}
  5. Remplace l'unité windows par LCLIntf
  6. Ajoute l'unité LResources si nécessaire (c.-à-d. , si l'unité .lrs doit être utilisée; uses LResources peut être dans la partie implémentation )
  7. Enlève l'unité de variantes
  8. Enlève la directive {$R *.dfm}
  9. Ajoute la section d'initialisation et la directive {$i unit.lrs}

Ceci permet la conversion rapide et facile de la plupart des unités du format Delphi au format Lazarus. Il ne fait aucun contrôle de validité, ou changements automatiques de syntaxe, aussi tout les changements de syntaxe que vous devez faire, les changements additionnels d'unité/de nom d'unité, ou les changements de fichier dfm/pas pour les contrôles/les différences de composants, doivent toujours être fait manuellement, bien que dans le temps quelques assistants(wizards) facilitant une partie de ceci, particulièrement la réparation des fiches converties(lfm), puissent devenir disponible .

Choix du bon mode du compilateur

Le compilateur Free Pascal supporte 5 modes Pascal différents. Par exemple TP pour turbo pascal, vous laisse compiler des unités en turbo pascal. Il y a également un mode de compatibilité DELPHI qui peut être choisi pour rendre le code existant plus facile à convertir. Lazarus préfère le mode OBJFPC, qui est presque égal au mode DELPHI, mais est moins ambigu que la syntaxe de Delphi. Voici les points importants :

Le mode peut être choisi en ligne de commande ou au début de la source . Employer la ligne de commande a l'avantage , que vous n'avez pas besoin de changer la source, mais l'inconvénient , que les autres doivent être renseignés .

La plupart des unités Delphi peuvent être compilées par le compilateur Free Pascal en ajoutant

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

juste après le nom de l'unité .

Pour plus de détails à propos des modes de Free Pascal voir la Documentation de Free Pascal

Considérations sur les logiciels multiplate-formes

  • L'assembleur inline est toujours un problème parce qu'il liera le code à l'architecture Intel. Quelques développeurs font des prototypes d'algorithme en Pascal et utilisent la directive IFDEF avec leur assembleur optimisé. Heureusement TurboPower a fait ceci dans de nombreux endroits avec leur code . Si c'est le cas avec le paquet que vous convertissez , remettez la directive sur Pascal.
  • Ne pas mettre en référence des endroits de mémoire spécifique comme le secteur de données du BIOS. Découvrez ce dont le code a besoin et essayez de trouver une alternative multiplate-forme .
  • Ne pas faire les tours spécifiques du processeur (comme employer le compteur temporel d'Intel (time stamp counter)) sans insérer votre code dans une directive IFDEF pour la plate-forme que le code nécessite ... et fournissant une alternative pour des environnements qui n'ont pas les possibilités matérielles .
  • Si vous avez besoin de quelque code spécifique au système d'exploitation(OS) , alors vous pouvez employer la directive IFDEF. Voir ci-dessous pour une liste des macros .

Les variables utiles pour le compilateur

Pour écrire du code, qui se comporte sur divers systèmes différemment, vous pouvez employer les directives {$IFDEF Name}.

  • {$IfDef LCL}

Cette variable est définie en utilisant le paquet LCL. Utile pour écrire du code qui fonctionne avec la bibliothèque LCL et Delphi.

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

Cette variable est définie en utilisant le paquet LCL et le jeux de composants spécifique est actuellement employé. Utile pour écrire du code qui fonctionne avec la bibliothèque LCL sur une plate-forme spécifique.

  • {$IfDef FPC}

Cette variable est définie, en utilisant le compilateur FPC. Utile pour écrire du code, qui fonctionne avec FPC et Delphi.

  • {$IfDef Unix}, {$IfDef Win32}, ...

Défini par FPC pour le système d'exploitation cible courant. Delphi définit "Linux", "Win32" et "MSWindows". Free Pascal s'exécute sur beaucoup plus de plate-formes et ainsi on lui recommande d'employer l'item le plus courant. Par exemple "Unix" est défini pour Linux, FreeBSD, NetBSD et OpenBSD, là où Lazarus s'exécute déjà . Utilisez

{$IfDef Linux}
  {$Define Unix}
{$EndIf}

pour contourner ceci pour Kylix .

Pour plus de détails voir la Documentation de Free Pascal. Texte gras

32bit / 64 bit support

Les pointeurs en 64bit demande 8 octets au lieu de 4 en 32bit. Le type 'Integer' demeure en 32bit pour compatibilité. Cela signifie que vous ne pouvez plus forcer les pointeurs en Integer et revenir en arrière. FPC définit deux nouveaux types : PtrInt and PtrUInt. PtrInt est une entier 32bit signé dans les plates-formes 32bit et un entier signé 64bit dans les plate-formes 64bit. La même chose avec PtrUInt mais en prenant des entiers non signés. Utilisez ce code qui devrait tourner pour Delphi et FPC :

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

Remplacer tous les integer(SomePointerOrObject) par PtrInt(SomePointerOrObject).

Pour plus d'information, voir Guide de programmation Multi plate-forme.

Trouver un identificateur manquant

Il y a des différences dans la façon dont la bibliothèque LCL est organisée en comparaison avec la bibliothèque VCL de Delphi . Si vous obtenez une erreur "not found" du compilateur au sujet d'une classe ou d'un identificateur important, les chances sont bonnes qu'il/elle soit dans une unité différente. Une correspondance complète peut être trouvée en utilisant la commande grep avec le sous répertoire lazarus/docs/xml ou lcl.

Par exemple la classe tbutton utilisée généralement donne typiquement une erreur dans le code Delphi parce qu'il est placé dans une unité appelée buttons.pp. La commande suivante trouve l'unité correcte très rapidement (dans le répertoire source de Lazarus ):

 grep -in ' tbutton =' lcl/*

Différences principales d'unité entre Lazarus et Delphi

Please add to this topic!

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

Comme la bibliothèque LCL n'est pas spécifiquement dédiée à Windows, le code qui est dans l'unité Windows de Delphi pour accéder directement à l'API Win32, est placé dans des interfaces distinctes, lequel se situe dans l'unité LCLIntf. Gardez à l'esprit que Lazarus n'émule pas win32. Beaucoup de fonctions sont absentes et certaines ne fonctionnent pas comme leur homologues win32. Ces fonctions existent seulement pour la compatibilité avec Delphi et devrait seulement être employées pour un portage rapide. La bibliothèque LCL modifie plusieurs des types, ainsi souvent LCLType, et parfois VCLGlobals sont exigés. LCLProc contient également quelques fonctions ce qui peut être utile pour la manipulation de plus bas niveau comme "FreeThenNil", comme c'est le cas dans Delphi 5 (et plus). Utilisez "DeleteAmpersands" pour enlever des esperluètes additionnelles d'une chaîne de caractères pour les contrôles (& contre && etc). L'unité d'interfaces doit être incluse dans le fichier .lpr pour initialiser les jeux de composants graphiques appropriés .

  • Messages->LMessages

Les messages TControl des événements callback de Win32 au format WM_CALLBACK et leurs structures associées sont généralement situés dans DELPHI dans l’unité Messages. Dans la LCL ce type de messages et leurs structures se trouvent dans Lmessages, avec en général le changement de « WM » en « LM ». Par exemple WM_MOUSEENTER devient LM_MOUSEENTER et TWMMouse devient TLMMouse.

  • Graphics, Controls->GraphTypes, GraphMath, Graphics, Controls

Afin de simplifier les référencements multiples et circulaires d’unités quelques nouveaux types ont été définis dans une unité appelée GraphType regroupant des éléments qui, dans Delphi, sont placés dans Graphics ou Controls (par exemple le BvNone des Panels). Vous aurez donc parfois à l’utiliser. De même, GraphMath est une autre unité, qui bien qu’incompatible avec Delphi inclut d’autres fonctionnalités utiles. Elle prend en compte la précision TFloatPoint, diverses routines de Béziers, les lignes, les arcs, la surcharge d’opérateur telle que Point1=Point2+Point3 et la comparaison de Trects : If (Rect1=Rect2) then …

  • Mask->MaskEdit

Afin de la nommer plus intelligement l’unité des TMaskEdit est nommée [MaskEdit] au lieu du nébuleux Mask de beaucoup de versions de Delphi.

  • StdCtrls->StdCtrls,Buttons

Dans beaucoup de versions de Delphi, Tbutton est situé dans StdCtrls, alors que TSpeedButton et TBitBtn sont dans Buttons. Plus simplement, la LCL place tous les types de boutons dans Buttons, ce qui peut occasionnellement interrompre la traduction du code. Il est donc préférable de l’inclure systématiquement.

Différences des Propriétés et methodes entre Delphi et FPC/LCL

Différence sémantique

Ordre d'évaluation des paramètres

Delphi garantit que tous les paramètres sont évalués de la gauche vers la droite (sauf si une convention d'appel est précisée et spéficie autre chose, pour s'interfacer avec des routines C p.ex). FPC ne présente pas cette garantie et peut evaluer les paramètres dans n’importe quel ordre afin de générer un code optimal.

Procédures/Fonctions imbriquées en variables procédurales

voir l'article Wikipedia(en)

Delphi passe le pointeur de cadre de la procédure parent toujours sur la pile, et c'est à l'appelant de l'enlever à nouveau. Cela signifie qu'aussi longtemps que vous n'accédez pas aux variables de la procédure parent, vous pouvez passer l'adresse de la fonction imbriquée à une autre fonction qui peut alors l'appeler comme n'importe quelle variable procédurale.

FPC de son côté, passe toujours le pointeur de cadre de la procédure parent comme un premier paramètre caché selon la convention d'appel employée, ce qui signifie que si vous appelez une procédure imbriquée comme une variable procédurale normale, tous les paramètres seront "décalés" d'une position.

En bref, n'appelez pas de procédure imbriquée au moyen d'une variable procédurale.

différence de syntaxe

SVP compléter cet article!

A cause de restrictions propres à FPC, des changements de synthaxe sont nécessaires. La directive {$Mode Delphi} autorise, comme Delphi, moins de rigueur. Aussi adaptez votre règles synthaxiques avec {$Mode ObjFPC} au plus vite, même si le code doit être partagé par Delphi et LCL. Certaines sont simplement de meilleurs pratiques et parfois parce que le mode Delphi n'est pas assez précis, ou dans quelques cas, un code acceptable pour Delphi ne fonctionne pas comme attendu avec FPC, même s'il pourrait compiler.

À cette fin, même si tous ces éléments ne sont pas strictement requis, la liste suivante de changements devrait être considérée comme obligatoire :

Pour affecter un gestionnaire à un évènement vous devez le préfixer avec "@"

Par exemple, pour assigner une procédure à un évènement "OnClick" d'un bouton :

Delphi FPC
begin
  if not Assigned(MyButton.OnClick) then 
    MyButton.OnClick:= SomeFunction;
    //@ not required
    //more code...
end;
begin
  if not Assigned(MyButton.OnClick) then
    MyButton.OnClick:= @SomeFunction;
    //@ IS required
    //more code...
end;

NB : cela n'est pas limité aux seuls événements, mais concerne tous les types procéduraux.

En appelant une variable procédure utilisez cette syntaxe : theprocname()

En Delphi, il n'y a aucune différence entre un résultat de fonction et une variable. Par contre, il y en a une en FPC, ainsi pour appeler une fonction, même si elle n'a pas de paramètre, vous devez ajouter des parenthèses. Par exemple :

Delphi FPC
With (SomeObject) do 
begin
  If Assigned(OnMyCallback) then
    OnMyCallback;
    //parenthesis not required
end;
With (SomeObject) do 
begin
  If Assigned(OnMyCallback) then
    OnMyCallback();
    //parenthesis required
end;
Déréférencement de pointeur d'enregistrement

Dans Delphi , lorqu’on tente d’accéder aux membres d’un Record, il n’est pas nécessaire de faire la différence entre le pointeur du Record et le Record lui-même. FPC fait la distinction :

Delphi FPC
Function GetSomeValue(ARecord: PMyRecord):Integer;
begin
  If Assigned(ARecord) then
    Result:=ARecord.SomeValue
  else
    Result:=0;
end;
Function GetSomeValue(ARecord: PMyRecord):Integer;
begin
  If Assigned(ARecord) then
    Result:=ARecord^.SomeValue
  else
    Result:=0;
end;
Des parenthèses pour acceder aux chars d'une propriété string d'un objet

Il est possible avec Delphi de traiter les propriétés comme des variables, même pour accéder directement aux valeurs particulières des Char d’un String. C’est impossible avec FPC, notamment lorsque des propriétés sont indexées (traitées comme des tableaux). Dans ce cas, la propriété appelée doit être comprise dans des parenthèses. Même si ce n’est pas toujours, le cas il est préférable de s’y astreindre systématiquement. Exemple :

Delphi FPC
Type TSomeComponent=class(TComponent)
  //More code...
Published
Property MyString:String index 3 read GetMyString;
//More code...
End;

var
  MyChar:char;
begin
  If Length(MyString)>2 then
    //no parenthesis needed
    MyChar:= MyString[3];
    //More code...
end;
Type TSomeComponent=class(TComponent)
//More code...
Published
Property MyString:String index 3 read GetMyString;
//More code...
End;

var
  MyChar:char;
begin
  If Length(MyString)>2 then
    //parenthesis sometimes needed
    MyChar:= (MyString)[3];
    //More code...
end;
Ne confondez pas le pointeur et ce qui est pointé

Parfois dans Delphi vous pouvez obtenir un pointeur, adressant un objet avec une valeur nulle. Bien que ce type de situation soit complexe, c’est très souvent le cas dans les grands paquets de composants afin de réduire les imbrications d’objets de différentes unités. Il est donc possible dans Delphi d’envoyer un pointeur nul à une fonction attendant un objet, sans se soucier du type d’objet associé au pointeur. En FPC vous ne devez pas confondre l’objet et son pointeur. La conversion de type est nécessaire.

Exemple :

Delphi FPC
Unit 1
  Type 
    TSomeObject=class(TComponent)
      //More code...
    End;

  Procedure DoSomething(Value: TSomeObject);
  Function GetSomeObject: TSomeObject;

Unit 2
  Type 
    TSomeComponent=class(TComponent)
    //More code...
    Published SomeObject: Pointer;
    //More code...
  End;

Application
var 
  MyComponent: TSomeComponent;
begin
  MyComponent.SomeObject:=GetSomeObject;
  //More code...
  DoSomething(MyComponent.SomeObject);
end;
Unit 1
  Type 
    TSomeObject=class(TComponent)
   //More code...
  End;

  Procedure DoSomething(Value: TSomeObject);
  Function GetSomeObject: TSomeObject;

Unit 2
  Type TSomeComponent=class(TComponent)
    //More code...
    Published SomeObject: Pointer;
    //More code...
  End;

Application
var 
  MyComponent: TSomeComponent;
begin
  MyComponent.SomeObject:=Pointer(GetSomeObject);
  //More code...
  DoSomething(TSomeObject(MyComponent.SomeObject));
end;

Ressources

Light bulb  Remarque: La section ci-dessous n'est peut-être pas nécessaire. Les dernières versions de Lazarus supportent directement les fichers .res. L'installateur Windows de Lazarus inclut un compilateur de ressource qui supporte les fichiers .rc. Sur Unix, assurez-vous que windres est installé ainsi vous pouvez utiliser les fichiers .rc. Se reporter à Ressources FPC.

Les fichiers de ressource de Delphi sont spécifiques à Win32 et ne sont pas compatible avec Lazarus, donc vous devez les recréer et les compiler avec l'outil Lazres. Lazres peut être trouvé dans le sous-dossier lazarus/tools. Si vous avez téléchargé les sources de Lazarus, vous aurez besoin de le compiler.

  • cd lazarus/tools
  • make install

Pour ajouter une ressource à votre application :

  • lazres myresource.lrs mypix.xpm anotherpix.xpm
  • Ajouter l'unité LResources à votre clause Uses
  • Incluez le fichier .lrs que vous avez créé sous le bloc d'initialisation

Exemple:

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
{$I unit1.lrs}
{$I myresource.lrs}
end.

Une autre méthode pour convertir un projet Delphi ou Kylix vers Lazarus

  • Renommer ou copier tous les fichiers .dfm ou .xfm vers .lfm (les très anciennes versions de Delphi ne produisent pas de fichiers .dfm basés sur du texte. L'utilitaire convert est, si présent, dans le dossier \bin et doit être utilisé d'abord avec les .dfm)
  • Renommer ou copier le fichier .dpr en .lpr.
  • Apportez toutes les modifications nécessaires aux fichier .lpr.
  1. Ajouter les directives {$mode delphi}{$H+} ou {$mode objfpc}{H+}
  2. Ajouter 'Interfaces' à la clause Uses
  3. Commenter ou supprimer {$R *.res} ou mettre en directive au besoin
  • Apporter les modifications nécessaires à tous les fichiers d'unités :
  1. Ajouter la directive {$mode delphi}{$H+} ou {$mode objfpc}{H+}
  2. Ajouter 'LResources' - à faire : vérifier si c'est toujours à faire pour les les nouvelles versions de Lazarus
  3. Si la fiche contient des boutons, ajouter l'unité 'Buttons' à la clause Uses.
  4. Commenter ou supprimer les directives {$R *.dfm} or {$R *.xfm}
  5. Ajouter la section 'Initialization' à la fin de chaque fichier d'unité, et ajouter la directive {$I unitname.lrs} dedans
  • Sélectionner Projet->Nouveau projet depuis un fichier
  • Sélectionner le fichier .lpr
  • Dans la fenêtre 'Créer un nouveau projet', choisissez 'Application'
  • Construisez le projet et faites les corrections nécessaire plus loin pour obtenir une compilation propre. A ce moment, le fichier .lpi est généré automatiquement. vous pouvez obtenir des messages 'Error reading Form', cliquer sur 'Continuer le chargement' dans ce cas.
  • enregistrer tout, et vous avez un projet Lazarus :-)

Obtenir de l'aide

Si vous rencontrez un problème pendant la conversion que vous ne pouvez pas résoudre, il y a une large variété d'endroits où l'on peut obtenir de l'aide.

Documentation

Pour les problèmes purement Pascal Objet et FPC Le meilleur endroit pour commencer est la Documentation de Free Pascal par Michaël Van Canneyt et Florian Klämpfl.
Pour les problème plus orientés vers Lazarus La documentation du projet dans la base de connaissance Lazarus-CCR Page principale est le prochain endroit où vous regarderez.

Support par les pairs

Pour poser des questions à des experts ou des développeurs plus avancés :

Mailing lists You can post a question on any of the mailing lists for the Free Pascal Compiler or the FPC/Lazarus forums where a lot of experts are subscribed.
Si vous avez accès à IRC: sur irc.freenode.net: #fpc pour FPC, ou #lazarus-ide pour Lazarus
Forum francophone d'entraide : sur Developpez.com (Zone Pascal)

Bases de connaissance

Il existe des bases de recherche et de connaissances exceptionnelles en ligne qui peuvent également être d'une grande aide pour apprendre de nouvelles techniques et résoudre des problèmes:

  • Tamarack Associates exploite un moteur de recherche rapide particulièrement pour les archives Usenet de Borland.
  • Mer Systems Inc. fournit un moteur de recherche similaire
  • Une autre source d'information exceptionnelle ainsi qu'une capacité de recherche sur site est Earl F. Glynn Computer Lab and Reference.

Empaqueter et livrer votre composant

Création d'un paquet Lazarus pour votre(vos) composant(s)

La création d'un paquet rend plus aisé le processus d'installation du code que vous avez converti... surtout si vous fournisseez plus d'un composant. Mattias Gärtner a écrit une vue d'ensemble des paquets Lazarus qui devrait être lus préalablement à ce processus.

Documentation

L'objectif de ce site et le format wiki vise à rendre facile et rapide la production d'une documentation de niveau professionnelle. Le wiki rend aussi possible de voir le résultat de votre travail immédiatement et de faire tous les changements que vous voulez en temps réel.

L'utilisation du wiki Lazarus-CCR pour créer une documentation de bel aspect est très simple. Si vous n'avez jamais utilisez de balisage auparavant, vous pouvez vous y familiariser à l'aide de l'aire d'entrainement bac à sable.

Création d'une page de livraison du code

La livraison de la page de code contient l'information vitale sur votre composant qu'un téléchargeur aurait besoin de savoir, telle que la licence, les plates-formes prévues, le statut (alpha, bêta, stable...), d'où le télécharger, qui l'a écrit, est-ce qu'un support est disponible... etc.

La procédure suivante vous permettra de créer une page de publication de code avec votre navigateur :

  • Aller vers le Release new component
  • Taper le noms de votre composant dans la boîte de texte et cliquer sur Create Article
  • Remplir le modèle et enregistrer.
  • Editer la page Components and Code examples et ajouter le lien que vous venez de créer vers la section "Released Components". enregistrer la page modifiée.

Soumission de votre comoposant

Si vous n'êtes pas le responsable de la livraison dans le projet, remonter votre composant vers le système de livraison de SourceForge et ajoutez-le à la liste des paquets de livraison. Autrement, envoyez-le à l'un des administrateur du projet (Tom Lisjac ou Vincent Snijders) et nous l'ajouterons au dépôt ("repository"). Avant que nous le déposions, vous devez créer une Page de livraison de code pour décrire votre composant. Vous pouvez utiliser la page Livraison d'un nouveau composant pour commencer la création d'une telle page.

Si vous pensez que vous aurez encore besoin de développer votre composant, vous pouvez le déposer dans SVN, comme cela vous aurez encore accès à lui. Si nous nous lassons de soumettre vos correctifs, nous vous donnerons l'accès en écriture au SVN, afin que vous puissiez valider vos correctifs vous-même. Pour plus de détails, voir l'Utilisation du référentiel SVN de Lazarus-ccr.