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 Debugger et transtypage TJSonObject


Sujet :

Lazarus Pascal

  1. #1
    Membre régulier
    Problème Debugger et transtypage TJSonObject
    Ce message n'a pas pu être affiché car il comporte des erreurs.

  2. #2
    Membre expert
    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 régulier
    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
    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

###raw>template_hook.ano_emploi###