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 :

Erreur interne URW1187 sur déclaration d'un type


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 200
    Points : 165
    Points
    165
    Par défaut Erreur interne URW1187 sur déclaration d'un type
    Bonjour à tous,

    Avec Delphi Tokyo j'ai créé une application VCL (qui ne fait vraiment rien) dont voici le code ci dessous.
    La question est ... pourquoi la définition de TMonField2 avec "= type" provoque cette erreur ?
    Pour rappel ou info l'utilisation de "= type" oblige l'utilisation du nouveau type pour les variable de ce type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    unit main;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
      Data.Win.ADODB,
      Data.DB;
     
    type
      TForm1 = class(TForm)
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        toto: TForm1;
      end;
     
      TMonField = TField; //ok
      TMonField2 = Type TField; //provoque une erreur interne URW1187
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    end.
    Merci
    Si vous avez votre réponse n'oubliez pas !

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    parce que cela n'a pas de sens en Delphi, ce n'est pas la syntaxe pour déclarer un type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type
      TMonField = TField; //ok
      TMonField2 = class(TField); ok
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 200
    Points : 165
    Points
    165
    Par défaut
    C'est vrai que dans le cas d'objet j'utilise plutôt TMonObjet= class(TAncetre).
    Mais je pose la question car je suis en train de passer un projet de Delphi 2010 vers Tokyo. Et je suis tombé plusieurs fois sur ce type de redéfinition, qui ne posait pas de problème avec Delphi 2010.
    En fait je pense que le développeur avait utilisé "=type" pour bien indiquer que les deux objets étaient bien les mêmes. J'avais généralement le cas suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     {$IFDEF CONDITION}
     TMonField2 = Type TField;
     {$ELSE CONDITION}
     TMonField2 = class(...)
     ...
     end;
     {$ENDIF CONDITION}
    Ca ne me dérange pas de modifier la déclaration mais je veux être sûr qu'il n'y a pas d'implication invisible à la compilation mais qui vous explose à figure dans certain cas à l'exécution.

    Pour info voici ma page de référence sur l'utilisation du "= type"
    http://www.delphibasics.co.uk/RTL.asp?Name=Type

    Merci
    Si vous avez votre réponse n'oubliez pas !

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    je ne connais pas cette syntaxe mais suffit de lire l'aide Types de données, variables et constantes - Index (Delphi)

    La portée d'un identificateur de type n'inclut pas la déclaration de type même (sauf pour les types pointeur). Il n'est donc pas possible de définir, par exemple, un type enregistrement qui s'utilise lui-même de manière récursive.

    Quand vous déclarez un type identique à un type existant, le compilateur traite le nouvel identificateur de type comme un alias de l'ancien. Ainsi, étant donné les déclarations suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type TValue = Real;
    var
      X: Real;
      Y: TValue;

    X et Y sont du même type ; à l'exécution, il n'est pas possible de distinguer TValue de Real. Généralement, cela ne pose pas problème, mais si vous définissez un nouveau type pour utiliser des informations de type à l'exécution (par exemple, pour associer un éditeur de propriété aux propriétés d'un type donné), la distinction entre "nom différent" et "type différent" devient importante. Dans un tel cas, utilisez la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type newTypeName = type KnownType
    Pour résumer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     TMonField2 = TField; // juste un alias
     TMonField3 = Type TField; // un type copie de l'autre
     TMonObjet= class(TAncetre) // type héritant d'un autre, spécifique aux classes
    En fait je pense que le développeur avait utilisé "=type" pour bien indiquer que les deux objets étaient bien les mêmes
    Et du coup tu penses faux, " = type " force un type à part entière, certes ayant la même structure mais bien différent d'un point de vue RTTI
    D'un point de vue héritage je ne sais pas ce que cela donne si l'on hérite du type original cela doit être différent de faire un héritage du type copié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     {$IFDEF CONDITION}
     TMonField2 = Type TField;
     {$ELSE CONDITION}
     TMonField2 = class(...)
     ...
     end;
     {$ENDIF CONDITION}
    Etrange comme structure, en terme de POO cela doit avoir un sacré impact

    TMonField2 = class(TField); devrait faire l'affaire pour différencier les deux types, après faut chercher l'utilsation des is, as et inheritsfrom.



    J'ai parfois ce genre d'erreur "Erreur interne URW1187", je revois mon code car c'est signe que je suis allé trop loin dans le délire artistique.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 200
    Points : 165
    Points
    165
    Par défaut
    Merci pour tes éclaircissements, ShaiLeTroll. Il ne me reste plus qu'à vérifier l'impact de la correction de ces délires artistiques
    Si vous avez votre réponse n'oubliez pas !

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

Discussions similaires

  1. Erreur du linker sur déclaration EXTERN
    Par _dieb dans le forum C
    Réponses: 2
    Dernier message: 19/09/2016, 14h42
  2. Réponses: 1
    Dernier message: 28/01/2008, 16h33
  3. [XSLT] Débutant erreur sur déclaration template
    Par nagdrir dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 27/08/2007, 16h08
  4. Erreur sur déclaration de liste
    Par La Truffe dans le forum C++
    Réponses: 4
    Dernier message: 19/02/2006, 19h38
  5. Réponses: 16
    Dernier message: 19/11/2005, 16h47

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