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

 Delphi Discussion :

XML operation de pointer incorrect


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    991
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 991
    Par défaut XML operation de pointer incorrect
    Bonjour, je charge un xml et à l'éxecution j'ai le message "operation de pointeur incorrect" à la fin de cette procedure, je ne trouve pas pourquoi. J'ai tout viré dedans et sa continue. Je crée le XML sans souçi dans la même unité. Merci à vous grand professionnel de l'informatique en pas a pas sa m'emmène dans "Classes" et sa plante dans "procedure TInterfaceList.Clear;"
    Si je commente la ligne rouge je n'ai plus l'erreur.

    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
    Procedure LoadFromXML(sFileName: String);
    Var
      PackagesXML:      TXMLDocument;
      PackagesListNode: IXMLNode;
    Begin
      PackagesXML := TXMLDocument.Create(Nil);
      Try
        PackagesXML.FileName := sFileName;
        PackagesXML.Active   := True;
        PackagesListNode     := PackagesXML.ChildNodes.First; // get root node
    
        PackagesXML.Active := False;
      Finally
        PackagesXML.Free;
      End;
    End;

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    Par défaut
    Deux Solutions possibles :
    - Soit tu ajoutes un Owner, cela améliora la gestion du comptage de référence du noeud racine
    - Soit tu libères explicitement le noeud via ClearDocumentRef

    Voici un exemple des deux solutions : [XML] TXMLDocument dans une DLL de 2007, le même problème que toi dans
    un sujet de 2010 : [XML] Erreur à la fermeture du programme ayant une unité de liaison XML qui s'est résolu par la même réponse de 2007

    en théorie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        RootNode     := PackagesXML.Node; // En général, j'utilise celui là !
        PackagesListNode  := RootNode.ChildNodes.First(); 
     
      Finally
        (RootNode as IXMLNodeAccess).ClearDocumentRef();
        PackagesXML.Free;
      End;
    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 émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    991
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 991
    Par défaut
    Tu me sauve, j'ai fait comme sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      PackagesXML := TXMLDocument.Create(sFileName);
      Try
        PackagesXML.Active   := True;
        PackagesListNode     := PackagesXML.ChildNodes.First; // get root node
        ...
        PackagesXML.Active   := False;
      Finally
        (PackagesListNode as IXMLNodeAccess).ClearDocumentRef;
        PackagesXML := NIL;
      End;
    Merci beaucoup.

  4. #4
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    991
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 991
    Par défaut
    J'ai répondu trop vite, une fois tout dé commenté je me suis pris une exception, du coup j'ai testé de viré les with utiliser des variable node libéré comme le root sans succès donc j'ai opté pour ta solution du TComponent temporaire. Et la c'est bon !

    L'écriture se fait sans owner et je n'ai pas de souci c'est pénible cette façon de l'utiliser

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 933
    Par défaut
    Si TXMLDocument n'a pas de propriétaire, il se comporte comme une interface. Tu fais à mon avis 2 libérations. Je coderais cette procédure ainsi (sans Free) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Procedure LoadFromXML(sFileName: String);
    Var
      PackagesXML:      IXMLDocument;
      PackagesListNode: IXMLNode;
    Begin
      PackagesXML := TXMLDocument.Create(Nil);
      PackagesXML.LoadFromFile(sFileName);
      PackagesListNode := PackagesXML.DocumentElement; // get root node
      ...
    End;

  6. #6
    Membre émérite
    Avatar de ouiouioui
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    991
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 991
    Par défaut
    Voila j'ai corrigé avec ta proposition et je n'ai plus d'erreur et sa permet de se passer du TComponent. Je mélange composant et interface ce n'est pas clair faut que je lise un peu je crois ...

    Lors de la sauvegarde je faisais pareil sans que sa ne provoque d'erreur j'ai corrigé avec IXMLDocument.

    Un grand MERCI, tu ne vois pas dans le noir ? Parce que à force d'aider tout le monde sur le forum comme tu le fait tu va choper une auréole

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    Par défaut
    Citation Envoyé par ouiouioui Voir le message
    J'ai répondu trop vite
    En même temps, tu n'as pas recopié ce que j'avais recommandé,
    tu n'as pas fait attention à l'utilisation d'un RootNode intermédiaire pour stocker PackagesXML.Node et non PackagesXML.ChildNodes.First !
    Le ClearDocumentRef devant être fait sur Node (qui est encore au dessus de DocumentElement) et non sur ChildNodes.First.

    Sinon la solution par Interface fonctionne très bien aussi, perso, je trouvais cela intolérable que cela ne fonctionne pas en Objet, je n'aime pas me résoudre à une solution alternative sans comprendre l'origine d'un problème !
    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

  8. #8
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Moi ça fait bien longtemps que je n'utilise plus TXMLDocument... J'ai jamais trop aimé le mélange des interfaces quand même possédées par un TComponent.

    J'utilise IXMLDOMDocument directement, avec quelques routines facilitant le chargement et l'enregistrement.

    Du coup chez moi le code précédent donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure LoadFromXML(sFileName: String);
    var
      PackagesXML:      IXMLDOMDocument;
      PackagesListNode: IXMLNode;
    begin
      PackagesXML := LoadXMLDocumentFromFile(sFileName);
      PackagesListNode := PackagesXML.DocumentElement; // get root node
      ...
    end;
    Et les routines d'enregistrement supportent l'encodage propre en UTF-8 ainsi que l'indentation du XML enregistré, ce qui est, je trouve, indispensable.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

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

Discussions similaires

  1. Operation virgule flottante incorrecte.
    Par petitcoucou31 dans le forum Langage
    Réponses: 4
    Dernier message: 31/10/2011, 13h50
  2. XML::Twig et caracteres incorrectes
    Par ellgafsi dans le forum Modules
    Réponses: 12
    Dernier message: 26/03/2009, 15h55
  3. POO - Operation de pointeur incorrect sur Free
    Par Diablo64 dans le forum Langage
    Réponses: 9
    Dernier message: 17/03/2009, 13h46
  4. Réponses: 4
    Dernier message: 04/08/2005, 14h15
  5. Réponses: 2
    Dernier message: 03/08/2005, 00h39

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