IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Constantes et Helper


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Constantes et Helper
    Bonjour,

    J'ai un premier fichier où je stocke des constantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    interface
     
       const CST_TOTO = 1; 
       const CST_TITI = 129;
     
    implementation
     
    end.
    Dans le deuxième, j'utilise la constante de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       CST_TOTO.ToString(); // Ne compile pas
       ShortInt(CST_TOTO).ToString(); // Compile
       CST_TITI.ToString(); // Compile
    end;
    La première ligne ne compile pas, tandis que les deux autres fonctionnes.

    La méthode ToString() est déclarée dans les Helper stocké dans l'unité System.SysUtils.

    Pourquoi le Helper ne fonctionne pas pour la 1ère ligne mais fonctionne pour les autres?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 681
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 681
    Points : 13 089
    Points
    13 089
    Par défaut
    Quelle version de Delphi ? Les helper pour byte n'existait peut-être pas encore (mais CST_TITI ne devrait pas compiler non plus ).

    Tu peux toujours forcer un type à la déclaration const CST_TOTO :shortint = 1;

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    je viens de tester sous Berlin Update 2 ça fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    {$APPTYPE CONSOLE}
    uses
      System.SysUtils,
    const
      TOTO = 1;
      TITI = 129;
      TUTU = $FFFFFF;
    begin
      WriteLn(TOTO.ToString);
      WriteLn(TITI.ToString);
      WriteLn(TUTU.ToString);
    end.
    NB: dans SysUtils on a un TByteHelper, un TShortIntHelper etc...avec des ToString() qui se contentent d'appeler IntToStr(Self)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Paul TOTH

    Effectivement, ton code fonctionne également chez moi. Mais dès lors que les constantes sont dans une autre unit, ça ne compile plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    uses
      System.SysUtils,
      Unit1 in 'Unit1.pas';
     
    begin
      WriteLn(TOTO.ToString);
      WriteLn(TITI.ToString);
      WriteLn(TUTU.ToString);
    end.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    unit Unit1;
     
    interface
     
    const
      TOTO = 1;
      TITI = 129;
      TUTU = $FFFFFF;
     
    implementation
     
    end.
    Andnotor

    J'utilise Delphi XE6.
    Oui, en spécifiant le type au niveau la constante, ça fonctionne... mais je me retrouve avec un autre problème tout aussi incompréhensible.
    Dans mon projet j'ai une procédure avec un paramètre par défaut égal à une de mes constantes... et lorsque je spécifie le type de la constante, une nouvelle fois le projet ne compile plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const CST_TOTO : integer  = 1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure test(i : integer = CST_TOTO);
    Bon après en surchargeant la procédure et en spécifiant explicitement le type sur la constante, on contourne tous mes problèmes. Mais ça reste quand même très étrange.

  5. #5
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    J'ai remarqué le problème la semaine dernière sur mon Berlin Update 2.

    Sur une unité avec seulement la constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unit Unit3;
     
    interface
     
    const
       abc = 1;
    Et sur une deuxième pour afficher le résultat dans un TEdit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm2.FormShow(Sender: TObject);
    begin
       Edit1.Text := abc.tostring;
    end;
    J'obtiens l'erreur [dcc32 Erreur] Unit2.pas(36): E2018 Type Record, Object ou Class requis, en revanche si la valeur de la constante est plus grande que 127 (type ShortInt) cela fonctionne, si la constante est locale à la fiche qui l'appelle aucun soucis.

    J'ai ouvert un ticket sur le bug tracker Embarcadero : https://quality.embarcadero.com/browse/RSP-16798

    C'est clairement un bug du compilateur, tu peux contourner le problème avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const abc = ShortInt(1);
    C'est comme ci le type vu par le compilateur était autre chose que ShortInt mais quoi ..

  6. #6
    Membre du Club
    Homme Profil pro
    Consultant en Automation
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Automation
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 46
    Points
    46
    Par défaut
    ... mais je me retrouve avec un autre problème tout aussi incompréhensible.
    Dans mon projet j'ai une procédure avec un paramètre par défaut égal à une de mes constantes... et lorsque je spécifie le type de la constante, une nouvelle fois le projet ne compile plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const CST_TOTO : integer  = 1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure test(i : integer = CST_TOTO);
    Bon après en surchargeant la procédure et en spécifiant explicitement le type sur la constante, on contourne tous mes problèmes. Mais ça reste quand même très étrange.
    Bonjour,

    C'est tout à fait normal, c'est la conséquence de l’aberration du concept de la syntaxe "constante typée affectable" : une constante typée génère une variable mémoire et non du code inline, donc CST_TOTO ne peut être utilisée comme constante après un signe "=" (d'ailleurs non plus par exemple dans ARRAY [0..CST_TOTO] OF ...) comme c'est le cas avec toute autre variable VAR.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/09/2003, 10h29
  2. requete SELECT avec un nombre constant
    Par gurumeditation dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/07/2003, 20h04
  3. Gestion des constantes
    Par valfredr dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/06/2003, 16h23
  4. [ADO] Constantes des types de champ
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/09/2002, 11h08
  5. Au sujet des constantes
    Par FranT dans le forum Langage
    Réponses: 8
    Dernier message: 09/08/2002, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo