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

C++Builder Discussion :

Problème d'enregistrement avec le composant Virtual Treeview


Sujet :

C++Builder

  1. #1
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 740
    Points : 3 249
    Points
    3 249
    Par défaut Problème d'enregistrement avec le composant Virtual Treeview
    Bonjour,


    J'ai une application qui utilise le composant Virtual Treeview. Les données marchent bien que sa soit pour l'insertion ou la suppression. Sur cela j'ai aucun soucis. Par contre j'ai une option sauvegarde et chargement de la liste et la sa merdouille un peu. Je m'explique:

    Dans le code du bouton de chargement j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ODialog->InitialDir = "C:\\";
    if (ODialog->Execute())
    {
          VTree->LoadFromFile(ODialog->FileName);
    }
    et dans le code pour la sauvegarde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SDialog->InitialDir = "C:\\";
    if (SDialog->Execute())
    {
           VTree->SaveToFile(SDialog->FileName);
    }

    Pour rappel ODialog et SDialog sont des composants OpenDialog et SaveDialog. Il m'enregistre bien un fichier sur l'endroit que je lui dit.

    Par contre le soucis, quand je recharge via le fichier, il ne m'affiche que la structure des données et non les titres de chaque section sur le Virtual Treeview.


    Et je vois pas trop comment modifier sa

    Quelqu'un a une idée ?


  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    As-tu activé l'option "TreeOptions->StringOptions->toSaveCaption" ?

  3. #3
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 740
    Points : 3 249
    Points
    3 249
    Par défaut
    Oui et cela a pas marcher cependant j'ai trouver un tuto en delphi qui dit que pour enregistrer il faut mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.vstSaveNode(Sender: TBaseVirtualTree; Node:
    PVirtualNode;
    Stream: TStream);
    var
    Data: PTreeData;
    Len: integer;
    begin
    Data := vst.GetNodeData(Node);
    Len := Length(Data.TestStr);
    Stream.write(Len, SizeOf(Len));
    Stream.write(PChar(Data.TestStr)^, Len);
    end;
    et pour charger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.vstLoadNode(Sender: TBaseVirtualTree; Node:
    PVirtualNode;
    Stream: TStream);
    var
    Data: PTreeData;
    Len: integer;
    begin
    Data := vst.GetNodeData(Node);
    Stream.read(Len, SizeOf(Len));
    SetLength(Data.TestStr, Len);
    Stream.read(PChar(Data.TestStr)^, Len);
    end;
    J'arrive a peu pres a traduire en C++ mais je bloque sur Stream

    Je vois pas l'equivalent de la ligne en c++

  4. #4
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Stream est un TStream, objet qui existe aussi sous BCB du moins jusqu'à la version 6

    si ça peut t'aider :
    Citation Envoyé par Aide BCB6
    TStream est la classe de base des objets flux qui permettent de lire ou d'écrire sur divers types de support de données, comme les fichiers disque ou la mémoire vive.

    Unité

    Classes

    Description

    Utilisez des objets flux spécialisés pour lire, écrire ou copier des informations stockées dans un support donné. Chaque descendant de TStream implémente des méthodes pour transférer des informations vers et depuis un support particulier comme un fichier disque ou de la mémoire dynamique. Outre des méthodes permettant la lecture, l'écriture, la copie d'octets depuis et vers le flux, les objets flux permettent aux applications d'accéder à une position arbitraire dans le flux. Les propriétés de TStream donnent des informations sur le flux, comme sa taille ou la position en cours dans le flux.

    TStream introduit également des méthodes travaillant en conjonction avec les composants et les écrivains pour manipuler avec des flux les composants des fiches simples ou dérivées. Ces méthodes sont appelées automatiquement par les routines globales qui démarrent la manipulation de composants dans les flux. Elles peuvent également être appelées directement afin de démarrer le processus du flux. Néanmoins, n'oubliez pas que la manipulation des composants par les flux nécessite deux autres objets:

    Un objet composant transmis comme paramètre aux méthodes du flux.
    Un objet écrivain, automatiquement créé par le flux, qui est associé au flux.

    Tstream ne doit pas être instanciée ; elle s'appuie sur des méthodes virtuelles pures qui doivent être surchargées dans des classes dérivées. Les objets flux descendants, comme les flux mémoire ou les flux fichier utilisés pour la manipulation des composants, sont créés automatiquement par l'appel des fonctions globales ReadComponentRes et WriteComponentRes. Pour manipuler avec des flux d'autres types d'information, il faut choisir une classe dérivée en fonction du type de données et du type de stockage voulus. C'est-à-dire :

    TFileStream (pour l'utilisation de fichiers)
    TStringStream (pour la manipulation de chaînes en mémoire)
    TMemoryStream (pour l'utilisation d'un tampon mémoire)
    TBlobStream (pour l'utilisation de champs BLOB)
    TWinSocketStream (pour la lecture et l'écriture sur une connexion socket)
    TOleStream (pour l'utilisation d'une interface COM en lecture et écriture)

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut the crow
    Un lien malheureusement en anglais qui je pense va t'aider

  6. #6
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 740
    Points : 3 249
    Points
    3 249
    Par défaut
    Merci pour vos réponses, bon j'avance. J'ai essayer de traduire sa en C++ et sa donne ceci:

    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
    void __fastcall TMainForm::VTreeSaveNode(TBaseVirtualTree *Sender,
          PVirtualNode Node, TStream *Stream)
    {
            int Len;
            ptrTestRec PtrTestName;
     
            PtrTestName = (TestRec *) VTree->GetNodeData(Node);
            Len = PtrTestName->NodeTitle.Length();
            Stream->Write(&Len, sizeof(Len));
            Stream->Write(&PtrTestName->NodeTitle, Len);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TMainForm::VTreeLoadNode(TBaseVirtualTree *Sender,
          PVirtualNode Node, TStream *Stream)
    {
            int Len;
            ptrTestRec PtrTestName;
     
            PtrTestName = (TestRec *) VTree->GetNodeData(Node);
            Stream->Read(&Len, sizeof(Len));
            Stream->Read(&PtrTestName->NodeTitle, Len);
    }
    //---------------------------------------------------------------------------
    Il créer bien le fichier, cependant au chargement c'est tres aléatoire:

    - Une fois j'ai la totalités des sections
    - Une fois j'ai une petite partie et le reste en ASCII
    - Une fois j'ai juste la structure sans les sections
    - Et le plus souvent, j'ai une erreur de memoire qui apparait.


  7. #7
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 740
    Points : 3 249
    Points
    3 249
    Par défaut
    Personne a une idée ?

  8. #8
    Responsable Magazine

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Points : 22 087
    Points
    22 087
    Par défaut
    Pour moi la traduction est correcte, juste un truc, pourquoi le PTreeData est devenu un TestRec* et qu'est ce qu'un TestRec, car je n'ai ni l'un ni l'autre de référencé dans BCB (TestRec je me doute que c'est un type que tu as redéfinit mais le PTreeData???)

  9. #9
    Membre expert
    Avatar de Faith's Fall
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 740
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 740
    Points : 3 249
    Points
    3 249
    Par défaut
    La structure est celle ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct {
       TVirtualNode *Node;                    // Node Address.
       AnsiString NodeTitle;                  // Label for the node.
    } TestRec, *ptrTestRec;
    Je l'avait récuperer sur un autre post ici pour afficher les sections et sur ce point sa marche.


Discussions similaires

  1. Réponses: 8
    Dernier message: 23/04/2015, 14h30
  2. Problème d'écriture avec les Composants UIB
    Par zoheir13 dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/01/2008, 13h32
  3. Problème de syntaxe avec le composant TCppWebBrowser
    Par Ptite Développeuse dans le forum C++Builder
    Réponses: 10
    Dernier message: 19/04/2006, 15h48
  4. Problème d'affichage avec le composant JTable
    Par vidocq dans le forum Composants
    Réponses: 2
    Dernier message: 03/04/2006, 11h22
  5. probléme d'enregistrement avec les chexkbox.
    Par pmboutteau dans le forum ASP
    Réponses: 16
    Dernier message: 18/10/2005, 15h05

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