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

Lazarus Pascal Discussion :

Problème de debugger et transtypage TJSonObject [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 65
    Par défaut Problème de debugger et transtypage TJSonObject
    Bonjour à tous :-)

    J'ai un problème avec le debugger (DBG) lors du transtypage d'un TJsonObject.
    Ci-dessous un programme pour montrer ce bug.

    1) Je crée un nouvelle Class TJSonObjectChild qui hérite de TJSonObject, sans implémenter de nouvelles procédures ou functions.
    2) Lorsque je veux transtyper un TJSonObject en TJSonObjectChild avec TJSonObjectChild(...), j'ai une erreur du debugger Invalid typecast

    Lorsque je décoche l'option [Verifiy method calls (-CR)] dans Options du projet/Compiler Options/Debugging,
    je n'ai aucune erreur et ça marche nickel...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    program TestHeritageJson;
    uses
       fpjson,
       jsonparser;
    type
       TJSonObjectChild = class(TJsonObject);
    var
       vJO:  TJSonObjectChild;
       vJSD: TJSonData;
    begin
       vJSD  := GetJSON('{"name" : "test"}');
       vJO := TJSonObjectChild(vJSD); { ICI exception class 'RunError(219)' :  Invalid typecast }
       Write(vJO.AsJSON);
    end.
    J'ai testé cela avec Lazarus 2.0.2 et 2.1. -> pas de differences
    Avec DBG 7.3.50 et 7.7.50 -> pas de differences.

    Est-ce moi qui déconne ?
    Est-ce un bug de Lazarus, de DBG ?
    A quoi sert cette option -CR ?

    Merci de m'avoir lu jusqu'ici ;-)

  2. #2
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Bonjour premierement tu ne doit pas faire de transtypage de l'enfant au parent "TChild(TParent)" mais "TParent(TChild)" ce qui est logique car tu vas ajouter des méthodes ou des propriétés dans dans ton enfant. Celles-ci sont forcément absentes dans le parent. Sans l'option -CR, tu n'as pas de message car dans ton exemple, ton TChild est identique au TParent. Donc c'est normal. Bref ton approche est à proscrire et est erronée.

    TChild as TParent NON, TParent as TChild OUI

    A+

    Jérôme

    cf les excellents tuto de Gilles ici et la
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Membre confirmé
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2006
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 65
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    TChild as TParent NON, TParent as TChild OUI
    Mettons nous d'accord sur la terminologie, pour moi parent/enfant c'est TChild = class(TParent)
    Le Child hérite du Parent... normal ?

    Dans ce cas "TParent as TChild" est respecté dans mon exemple : "TJSonObjectChild(vJSD) <=> vJSD as TJSonObjectChild" ou vJSD est un TJsonData, donc parent de TJSonObjectChild.

    Bon j'ai bien lu tes explications, j'ai cogité et j'ai trouvé mon erreur que l'on peut expliquer grace a ce petit programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    program TestHeritage;
    type
       TChildOfObject = class(TObject);
    var
       vObject: TObject;
       vChildOfObject: TChildOfObject;
    begin
       //vObject:=TObject.Create; { LA j'ai une erreur de Casting }
       vObject:=TChildOfObject.Create; { LA ça marche }
       vChildOfObject:=TChildOfObject(vObject);
       writeln(vChildOfObject.ClassName);
    end.
    Il faut que l'objet stocké dans le Parent (ici TObject) soit de la même class que l'objet que l'on veut transtyper... logique !

    Ce qui ne m'arrange pas dans mon cas, car il va falloir que je trouve une façon de transformer mon TJSonData en TJSonObjectChild.
    Ou faire une procedure du type : TJSonObjectChild.assign(AJD: TJSonData);

    Citation Envoyé par BeanzMaster Voir le message
    Sans l'option -CR, tu n'as pas de message car dans ton exemple, ton TChild est identique au TParent. Donc c'est normal.
    Pour info, méme avec un TChild ayant de nouvelles procedures et functions, si -CR est déactivé, ça marche bien et je n'ai pas d'erreur.
    Mais c'est peut etre juste un coup de bol !

    En tout cas merci d'avoir pris le temps de me répondre et de m'avoir mis sur la bonne piste.

  4. #4
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par visithierry Voir le message
    Mettons nous d'accord sur la terminologie, pour moi parent/enfant c'est TChild = class(TParent)
    Le Child hérite du Parent... normal ?
    C'est ça

    Citation Envoyé par visithierry Voir le message
    Dans ce cas "TParent as TChild" est respecté dans mon exemple : "TJSonObjectChild(vJSD) <=> vJSD as TJSonObjectChild" ou vJSD est un TJsonData, donc parent de TJSonObjectChild.

    Bon j'ai bien lu tes explications, j'ai cogité et j'ai trouvé mon erreur que l'on peut expliquer grace a ce petit programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    program TestHeritage;
    type
       TChildOfObject = class(TObject);
    var
       vObject: TObject;
       vChildOfObject: TChildOfObject;
    begin
       //vObject:=TObject.Create; { LA j'ai une erreur de Casting }
       vObject:=TChildOfObject.Create; { LA ça marche }
       vChildOfObject:=TChildOfObject(vObject);
       writeln(vChildOfObject.ClassName);
    end.
    Il faut que l'objet stocké dans le Parent (ici TObject) soit de la même class que l'objet que l'on veut transtyper... logique !
    C'est ça

    Dans ton premier exemple tu as

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type
       TJSonObjectChild = class(TJsonObject);
    var
       vJO:  TJSonObjectChild;
       vJSD: TJSonData;
    begin
       vJSD  := GetJSON('{"name" : "test"}');
       vJO := TJSonObjectChild(vJSD);
    Regardes bien la structure dans l'unité fpjson tu devrais comprendre ton erreur

    Citation Envoyé par visithierry Voir le message
    Ce qui ne m'arrange pas dans mon cas, car il va falloir que je trouve une façon de transformer mon TJSonData en TJSonObjectChild.
    Ou faire une procedure du type : TJSonObjectChild.assign(AJD: TJSonData);
    C'est une possibilité de rajouter une méthode "assignJSonData"

    Mais pour que ton exemple fonctionne comme tu le souhaites tu dois faire 2 transtypages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    vJO := TJSonObjectChild(TJSonObject(vJSD));
    // ou
    vJO := TJSonObjectChild(vJSD as TJSonObject);
    // ou
    vJO := (vJSD as TJSonObject) as TJSonObjectChild;


    [EDIT] Oups je me suis trompé c'est l'inverse que tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vJSD := (vJO as TJSonObjectChild) as TJSonData;

    Tu vois ou je veux en venir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Type
      TJSonObject = class(TJSonData);
      TJSonObjectChild = class(TJsonObject);
    A l'inverse tu pourrais faire (TJSonObjectChild as TJSonData) mais cela n'a aucun intérêt et n'est sémantiquement pas correcte.

    Citation Envoyé par visithierry Voir le message
    Pour info, méme avec un TChild ayant de nouvelles procedures et functions, si -CR est déactivé, ça marche bien et je n'ai pas d'erreur.
    Mais c'est peut etre juste un coup de bol !

    En tout cas merci d'avoir pris le temps de me répondre et de m'avoir mis sur la bonne piste.
    Toujours normal que tu n'ais pas d'erreur

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

Discussions similaires

  1. Problème de debugger avec Ganymede
    Par felix79 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 04/08/2009, 14h26
  2. [AS3] Problème de debugger
    Par WhiteD dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 04/08/2008, 00h53
  3. Réponses: 11
    Dernier message: 05/09/2007, 18h23
  4. Problèmes de debugger - Visual Studio 2005
    Par estebann10 dans le forum MFC
    Réponses: 3
    Dernier message: 15/02/2006, 00h26
  5. [Dev cpp] Problème pour debugger
    Par gl0be dans le forum Dev-C++
    Réponses: 5
    Dernier message: 03/12/2005, 20h09

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