md
Écueils dans Free Pascal/Lazarus
2016-04-04

J’estime que passer de Delphi à FreePascal/Lazarus se fait sans accrocs majeurs et, à certains égards, s’avère tout à fait agréable. Mais il y a de petites différences qui peuvent être la source de casses-tête. Voici quelques écueils qui m’ont piégé dans le passé et me font encore trébucher à l’occasion.

Affectation de types procéduraux et de gestionnaires d'événement en mode objfpc vs en mode Delphi.

En mode objfpc, les types procédure doivent être affectés avec l’opérateur d’adresse @ comme l’indique clairement le manuel. L'opérateur n’est pas nécessaire en modes delphi ou turbo pascal. Les gestionnaires d'événements sont des types procéduraux de sorte que la même règle s’applique pour eux. Cependant, dans ce cas, le message d'erreur en absence de l'opérateur d’adresse, Error: Wrong number of parameters specified for call to "EditChange" me confond souvent et me dirige vers un comptage inutile des paramètres en me demandant pourquoi il y a un problème. Après tout, le gestionnaire EditChange a exactement un paramètre tel qu’exigé d'un gestionnaire de type TNotifyEvent .

Récursion en mode objfpc vs en mode Delphi

Une fonction sans paramètre ne peut s’appeler récursivement à moins d’ajouter des parenthèses vides au nom de la fonction :

function maFonction: integer; begin ... result : = 32 * maFonction(); // Ne pas oublier le ()! ... end;

Cette convention d'appel de style C n’est pas nécessaire dans Delphi et n'est pas nécessaire dans un programme Free Pascal quand le mode Delphi {$ mode Delphi} est utilisé au lieu du mode par défaut {mode $ objfpc}.

Affectation des types procéduraux objfpc en mode vs en mode Delphi

Ceci est à peu près le même problème que ci-dessus. Si un type procédure est définie pour les fonctions sans paramètre, il est nécessaire d'ajouter des parenthèses à la variable procédurale pour appeler la fonction.

type TFunctionType = function: integer; var aFunction: TFunctionType; begin aFunction := @recur2; Label1.Caption := 'recur2 = ' + inttostr(aFunction()); // Don't forget the ()!

Pas de mode de création Debug et Release

Les modes de création Debug et Release ne sont pas définis par défaut dans un nouveau projet. Cependant, ils sont facilement créés en cochant Modes de création dans Options pour le projet : MonProject. Vous pouvez accéder à cette fenêtre dans l'EDI de Lazarus en sélectionnant les options de menu suivantes : Projet / Options du projet ... / Options du compilateur. Une fenêtre intitulée Mode Construction apparaît. Cliquez sur bouton libellé Create Debug et Release modes pour ajouter ces deux modes de construction au mode par défaut.

Symboles DEBUG et RELEASE non définis dans les modes de construction correspondants.

Pour ajouter ces symboles, cliquez sur le choix des Options personnalisées dans les options du compilateur (voir ci-dessus). Ensuite, cliquez sur le bouton Définitions... pour définir et ajouter les deux symboles DEBUG et RELEASE. Fermez la fenêtre Définitons : en cliquant sur le bouton OK et sélectionnez le mode Debug dans la liste déroulante du mode de création. Cliquez sur le bouton Définitions... à nouveau et cochez le symbole DEBUG et décochez le symbole RELEASE si nécessaire et cliquez sur le bouton OK. Le mémo des Options personnalisées doit alors contenir -dDEBUG. Sélectionnez le mode de création Release et cliquez sur Définitions ... et, cette fois, cochez le symbole RELEASE et décochez le symbole DEBUG. Cliquez sur le bouton OK et vérifiez que -dRELEASE apparaît dans le mémo d’Options personnalisées.

L'archive gotcha.zip contient un petit programme qui illustre les problèmes et solutions. Assurez-vous d'exécuter le programme quatre fois, une fois avec la directive {$mode objfpc} défini et {$mode delphi} non defini puis inversez ces définitions dans Unit1.pas puis à nouveau dans Unit2.pas. Les modes de construction Debug et Release sont définis dans ce projet ainsi que les symboles DEBUG et RELEASE correspondants.