Les possibles évolutions du langage Delphi sous Delphi 2005Date de publication : 09/10/2004 , Date de mise a jour : 15/10/2004
Par
Laurent Dardenne (home page)
Pour une présentation de Delphi 2005, vous pouvez consulter l'article de Pierre Castelain. 1. Convention d'appel INLINE 2. Déclarations imbriquées 2.1. Déclaration de types imbriqués 2.1.1. Déclarer et accèder aux classes imbriqués 2.2. Déclarations de constantes imbriquées 3. Itération sur des conteneurs et des classes 3.1. Rappel de linstruction For 3.2. Itération sur des conteneurs 3.3. Itération sur des classes 4. Les directives de compilations 4.1. MESSAGE 4.2. REALCOMPATIBILITY 4.3. UNSAFE 4.4. NODEFINE 4.5. NOINCLUDE 1. Convention d'appel INLINE
Dans la déclaration d'une procédure ou d'une fonction, vous pouvez spécifier la nouvelle directive INLINE qui permet daméliorer l'exécution des fonctions et des procédures. Si la fonction ou la procédure répond à certains critères, le compilateur insérera le code directement, plutôt que de produire un appel ( Call xxxx). Elle permet dobtenir un code plus rapide par une optimisation de l'exécution, mais aux dépens de l'espace mémoire. Cette directive dupliquant le code à chaque fois. Son comportement est proche des macro-instructions disponibles dans les langages assembleur ( elle existait déjà sous TP6 & 7 ). La directive INLINE générera toujours un fichier binaire de taille plus important. Elle est employée comme d'autres directives telle que cdecl ou safecall. Par exemple :
La directive inline est une suggestion faite au compilateur. Il n'y a aucune garantie que le compilateur duplique le code dune routine particulière, car il existe certaines circonstances où cette directive ne peut pas être utilisé ( + de 10 cas recensés ), par exemple :
Si vous modifiez l'implémentation dune routine INLINE, vous provoquerez une recomplilation de toutes les unités qui lutilisent. C'est une modification des règles traditionnelles de reconstruction qui sont déclenchées seulement par des changements de la section d'interface d'une unité.
La directive de compilation {$INLINE [ON(default),OFF,AUTO]} vous offrira un contrôle plus fin des différents cas de figure.
2. Déclarations imbriquées2.1. Déclaration de types imbriqués
Des déclarations de types peuvent être imbriquées dans une déclaration de classe. Les types imbriqués sont employés dans tout le framework .NET, et généralement dans toute Programmation Orientée Objet. Ce type de déclaration présente linterêt de regrouper les types conceptuellement associés, et d'éviter des collisions de nom. La même syntaxe peut être désormais employée avec le compilateur Win32 de Delphi 2005. Exemple de déclaration de types imbriqués :
Là où DeclarationDeTypeImbriqué suit la syntaxe de déclaration de type définie dordinaire dans la partie de déclaration nommée Type. Les déclarations de types imbriqués prennent fin dès la première occurance d'un élément du langage autre quun identifieur, par exemple, procedure , class, type, ou tous les spécificateurs de portée . Les règles normales d'accés s'appliquent aux types imbriqués et à leurs types contenants, cest à dire de niveau supèrieure que jappellerai classe conteneur ) . Un type imbriqué peut accéder à une variable dinstance (champ, propriété, ou méthode) de sa classe conteneur, mais il doit utiliser une référence d'objet pour le faire. Un type imbriqué peut accéder à des champs de classe, des propriétés de classe, et des méthodes statiques de la classe sans référence d'objet, mais dans ce cas les règles normales de visibilité de Delphi s'appliquent. Les types imbriqués n'augmentent pas la taille de la classe conteneur. En d'autres termes, créer une instance de la classe conteneur ne crée pas par la même occasion une instance du type imbriqué. Les types imbriqués sont associés à leurs classes conteneur uniquement par le contexte de leur déclaration. 2.1.1. Déclarer et accèder aux classes imbriqués
Les exemples suivants vous indiquent comment déclarer et accéder à des champs et à des méthodes de classe imbriqués.
Pour appliquer la méthode ProcImbrique dune classe imbriquée, vous devez qualifier son nom avec le nom de la classe conteneur. Par exemple :
Pour accéder aux membres du type imbriqué, employez la notation habituelle ( notation pointée : Classe.Membre). Par exemple :
2.2. Déclarations de constantes imbriquées
Des constantes peuvent être déclarées dans des types de classe de la même manière que la section type imbriqués. Les sections constante sont terminées de la même maniére que les sections de type imbriquées. les constantes typées ne sont pas supportées, vous ne pouvez donc pas déclarer des constantes imbriqués tels que Currency, ou TDateTime. Les constantes imbriquées peuvent être de n'importe quel type simple : ordinaux et sous-ensemble ordinaux, énumération, String et Real . Exemple de code de déclaration de constantes imbriquées :
3. Itération sur des conteneurs et des classes3.1. Rappel de linstruction For
Une instruction For, à la différence d'une instruction Repeat ou While, exige que vous indiquiez explicitement le nombre d'itérations souhaitée. La syntaxe dune instruction FOR est soit :
soit :
où :
3.2. Itération sur des conteneurs
Delphi 2005 supporte, pour .NET et Win32, l'itération sur des éléments dune collection (iteration over containers). Les itérations de conteneur suivantes sont reconnues par le compilateur :
Le type de la variable d'itération doit correspondre au type contenu dans le conteneur. Pour chaque itération de la boucle, la variable d'itération pointe sur le membre courant de la collection. Comme avec les boucles classique, la variable d'itération doit être déclarée dans le même bloc que pour linstruction. La variable d'itération ne peut pas être modifiée dans la boucle. Ceci inclut lassignation, et passage de paramétre à un paramètre de var d'une procédure. Procéder ainsi aura comme conséquence une erreur lors de la compilation. Les expressions de tableau peuvent être de type simple ou multi-dimensionnelle, de longueur fixe, ou dynamique. Le tableau est parcouru dans l'ordre croissant, commençant à partir de lindice de limite inférieure et finissant à lindice max du tableau. Lexemple de code ci-dessous parcourt les différents types de tableaux :
Le code suivant concerne litération sur des expressions de type chaîne ( String ) :
Le code suivant concerne litération sur des expressions de type ensemble ( Set ) :
3.3. Itération sur des classes
Pour utiliser la construction de boucle for-in sur une classe, la classe doit implémenter un pattern de collection imposé (prescribed collection pattern).
Un type qui implémente le pattern de collection doit avoir les attributs suivants :
Si le type de lénumérateur retourné par la méthode GetEnumerator() implémente l'interface IDisposable, le compilateur appellera la méthode Dispose du type lorsque la boucle se terminera. Le code suivant concerne litération sur un conteneur 'énumérable' sous Delphi 2005.
Les classes suivantes et leurs descendants supportent la syntaxe For-in:
4. Les directives de compilations4.1. MESSAGE
Syntaxe: {$MESSAGE HINT|WARN|ERROR|FATAL 'texte' } La directive MESSAGE permet au code source d'émettre des conseils, des avertissements, et des erreurs comme le fait le compilateur . C'est une directive semblable à #emit ou pragma warn du C et C++. Le type de message (HINT, WARN, ERROR, ou FATAL) est optionnel. Si aucun type de message n'est indiqué, celui par défaut est HINT. Le texte doit être délimité par de simples quotes. Exemples :
4.2. REALCOMPATIBILITY
Notez que l'utilisation du type Real48 n'est plus recommandé (deprecated) sous .NET.
Préférez dans la plupart des cas le type double .
4.3. UNSAFE
Syntaxe:
Spécifique à la plateforme Dot Net. La directive UNSAFECODE indique si le mot-clé unsafe est accepté par le compilateur. Avec {$UNSAFECODE ON}, vous pouvez identifier des procédures et des fonctions avec le mot-clé unsafe, par exemple :
Cette directive est utile seulement en .NET ( en Win32 est elle ignorée ). Unsafe signifie que le code sera compilé en non managé.
4.4. NODEFINE
Syntaxe:
La directive NODEFINE empêche le symbole indiqué d'être inclus dans le fichier d'en-tête généré pour le C++, tout en permettant la génération d'information dans le fichier OBJ. Quand vous employez NODEFINE, il est de votre responsabilité de définir n'importe quels types nécessaires avec HPPEMIT. Par exemple :
4.5. NOINCLUDE
Syntaxe:
La directive NOINCLUDE empêche le fichier indiqué d'être inclus dans les fichiers d'en-tête produits pour le C++. Par exemple, {#$$NOINCLUDE>Unit1} enlève #include Unit1.
Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur.
La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
|