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 :

SaveToFile d'une liste


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut SaveToFile d'une liste
    Bonjour à tous.

    Dans 1 appli, je créé dynamiquement des pseudo-panel mémorisés dans une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    type TMonPnl=class(TPanel);            
    Type
      TEntite=record
        Id:Integer;
        Carre:TMonPnl;
        Ancetre,Fils,Aine,Cadet:Integer;
      end;
      PTEntite = ^TEntite;
      TEntiteList = class(TObject)
      private
    etc...
    ces pseudo-panels sont affichés sur un TPanel, et comme ils sont déplaçables, j'ai besoin de les différencier lors du DragDrop, d'où l'utilisation de TMonPnl.

    Mon souci est de mémoriser cette liste dans un fichier...et bien sûr, chaque "carre" doit conserver ses propriétés.

    J'ai jeté un oeil là : http://nono40.developpez.com/sources/source0064/

    Est-ce applicable compte-tenu du fait que LE composant (carre=TMonPnl) est enfoui dans chaque item de la liste ?

    Sinon, comment faire ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Personellment j'utiliserait un TXMLDocument.

    1° Poser un tXMldocument sur votre form
    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
     
    // Vider Xml document
    MyXmlDocument.Active := False;
    MyXmlDocument.fileName := '';
    MyXmlDocument.Xml.Clear;
     
    // Créer le Noeud a partire duquelle la sauvegarde vas etre faite
    // GlobalNode est un IXMLNODE
    MyXmlDocument.Active := true;
    globalnode          := XMLDocument.CreateNode('NomDuNoeudDeBase', ntElement);
    XML.DocumentElement := globalnode;
     
    // Boucle pour suavegarder tous les panel
    For I = 0 To NombreDePanel do begin
      MonPanel := .....
     
    // sauvegarde pour un panel
    // 1° noeud du panel
    Panelnode := Globalnode.AddChild('NomPanel');
    // 2° Valeurs a sauvegarder
    node :=  Panelnode.AddChild('Valeur1');
    Node.NodeValue := Valeur1;
    node :=  Panelnode.AddChild('Valeur2');
    Node.NodeValue := Valeur2;
    etc.
     
    end;
     
      MyXmlDocument.SaveTofile(.....);
      MyXmlDocument.Acive := False;
    La sauvegarde et sous la form XML, vous pouvez donc le consulter et le modifier avec un editeur XML ou un editeur de fichier text.

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Tu me proposes de travailler avec les éléments individuels alors que tout mon prog s'appuie sur la liste . Ca fait beaucoup de modifs ça...

  4. #4
    Membre émérite
    Avatar de Merlin
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2002
    Messages
    524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 524
    Points : 2 883
    Points
    2 883
    Par défaut
    Pour sauvegarder la liste il faudrait que tu utilises des classes sérialisables.
    Il faut donc que chaque élément descendent de TPersistent pour commencer.
    Pour la liste il faut utiliser un descendant de TCollection, chaque item descendant de TCollectionItem. Dans ce cas soit ces derniers encapsuble la classe descendante de TPersistent, soit tu codes directement dans le TItemCollection.

    Ensuite un Read / WriteCompotentResFile par exemple permet d'écrire un flux objet sur disque et de le recharger.

  5. #5
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    ne peux-tu pas faire un fichier File of TEntite tout simplement ?

  6. #6
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    C'était ma première orientation, mais je perds tout ce qui concerne "carre"...
    Ou alors j'ai une M**** dans mon code:
    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
     
    function TEntiteList.SaveToFile(nomFichier:string):Boolean;
    var recEntite:TEntite;
        fileEntite:file of TEntite;
        i:Integer;
    begin
         result:=True;
         AssignFile(fileEntite,NomFichier);
         {$i-}
         Rewrite(fileEntite);
         {$i+}
         if IoResult<>0 then begin
            result:=False;
            exit;
         end;
         { boucle d'écriture }
         for i:=0 to FList.Count-1 do begin
            recEntite:=GetItem(i) ;
            Write(fileEntite,recEntite);
         end;
         CloseFile(fileEntite);
    end;
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function TEntiteList.GetItem(Index: Integer): TEntite;
    begin
      result := PTEntite(FList[Index])^;
    end;
    alors ...

    (ce code marche parfaitement si "carre" est complètement décrit (mais alors ce n'est plus un pseudo-panel et faut que je me paie toutes les props et méthodes)

  7. #7
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    que représente carre ? le parent ? si c'est le cas ne peux-tu pas simplement ecrire son nom en string ?

  8. #8
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut


    Cf mon 1er post, carre est (du moins dans mon esprit) un TPanel-like, aucun ajout/modif de propriété/méthode, j'ai juste besoin d'un nom de classe qui ne soit pas TPanel.
    Pour le reste, je le manipule comme un TPanel, en profitant des props et méthodes de cette classe.

  9. #9
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    heu... si tu ne modifie pas la classe TPanel je ne vois pas bien pourquoi tu la dérives ? pourquoi un nom de classe différent ?

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Salut qi30,

    Pour ton problème je te suggères ceci de passer par les TStream, tu vas voir, ça va marcher.

    Si tu peux attendre ce soir je te poste du code, je dois aller chercher les enfants à l'école

    Sinon, voici en gros l'algorithme (attention, ça ne compile pas, c'est bien un algo !):

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function TEntiteList.SaveToFile(nomFichier:string):Boolean; 
    var i:integer;
         UnStream:TFIleStream;
         Panel:TMonPnl;
         PanelExiste:boolean;
         recEntite:TEntite;
    begin
       UnStream:=TFIleStream.create(nomFichier,Ecriture);
       UnStream.Write(count,sizeof(integer));
       for i:=0 to count-1 do
       begin
          recEntite:=GetItem(i);
          Panel:=recEntite.Carre;
          PanelExiste:=(Panel<>nil);
          UnStream.Write(PanelExiste,sizeof(boolean));
          if PanelExiste then
          UnStream.SaveComponent(Panel);
          recEntite.Carre:=nil;
          UnStream.Write(recEntite,sizeof(TEntite));
       end;
       UnStream.Free;
    end;
     
    function TEntiteList.LoadFromFile(nomFichier:string):Boolean; 
    var i,n:integer;
         UnStream:TFIleStream;
         Panel:TMonPnl;
         PanelExiste:boolean;
         recEntite:TEntite;
     
    begin
       UnStream:=TFIleStream.create(nomFichier,Lecture);
       UnStream.Read(n,sizeof(n));
       for i:=0 to n-1 do
       begin
          Panel:=recEntite.Carre;
          PanelExiste:=(Panel<>nil);
          UnStream.Read(PanelExiste,sizeof(boolean));
          if PanelExiste then  UnStream.ReadComponent(Panel);      
          UnStream.Read(recEntite,sizeof(TEntite));
          if PanelExiste then recEntite.Carre:=Panel;
         add(recEntite);
       end;
       UnStream.Free;
    end;
    Si avec ça tu ne t'en sort pas avant que je te livre la version finale...
    Celà dit ce serrait quand même bien de connaitre la strucutre de TMonPnl

  11. #11
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Je suis toujours preneur d'une solution cousue-main

  12. #12
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut Aparté
    Mais, je ne suis qu'un grossier bricoleur .

    Et c'est un doux euphémisme pour signaler l'approche de mon seuil d'incompétence quand je commence à créer mes propres classes; je l'avoue sans honte .

    Je suis de la génération TP, autant dire que je ne suis pas né avec les classes; même si j'en perçois tout le bien-fondé et que je trouve cela merveilleux à utiliser... au travers de la VCL.

    Après j'avance en terrain inconnu, avec toute l'aide et le temps que les forumeurs veulent bien m'accorder...et je les en remercie.

    Je ne disconviens pas du fait qu'il faille utiliser
    les classes sérialisables.
    Il faut donc que chaque élément descendent de TPersistent pour commencer.
    Pour la liste il faut utiliser un descendant de TCollection, chaque item descendant de TCollectionItem
    Et que tout ceci soit LA solution, mais c'est clairement hors de ma portée immédiate.

    Puisque tu as l'air de maîtriser ce genre de problématique, peut-être pourrais-tu rédiger un tutoriel sur le sujet ? (on dira que c'est un philtre pour devenir pro !)

    Je crois qu'il serait utile à beaucoup de bricoleurs .

  13. #13
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    Salut

    comme te le fait remarquer merlin le meilleur moyen est de passer par les collection

    regarde ce tuto
    http://sjrd.developpez.com/delphi/de...ge=collections

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Résultat des courses :ça marche avec la méthode que j'ai proposé !

    Voir pièce jointe pour le code :
    Fichiers attachés Fichiers attachés

  15. #15
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par anapurna
    ta tlist oblige a tout reecrire
    Pas avec mon utilitaire maison :
    http://waskol.developpez.com

  16. #16
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    Et revoila le message.... Avec des commentaires en moins

  17. #17
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    En cette avant-veille de fête du travail, je capitalise sur le bricolage de Waskol...

    Merci à tous de votre contribution engagée.

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

Discussions similaires

  1. Faire une liste de device??
    Par jackjack dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 14h43
  2. Réponses: 4
    Dernier message: 24/04/2003, 22h28
  3. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 15h30
  4. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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