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 :

Enregistrement d'une variable dynamique dans un fichier


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 33
    Points : 20
    Points
    20
    Par défaut Enregistrement d'une variable dynamique dans un fichier
    Hello,
    Je suis confronte a un petit (j'espere :-) ) probleme :

    Je suis dans la realisation d'un applic en Delphi et j'utilise une variable nommée Spectacle de type TSpectacle

    Voici mon TSpectacle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Var Spectacle : TSpectacle;
        TSpectacle = record
                       nom : String; //Nom du spectacle
                       details : String; //Details du spectacle (champ libre pour date, etc...)
                       NomCircuit : array[1..cCircuits] of String;
                       ConduiteTops : TStrings;
                       Tops : array of TTop; //Contient tout les tops
                       Memoires : array[1..cMemoires, 1..cDMX] of TModCircuit;
                       Pitch : real; //Coef de ralentissement ou d'acceleration d'une transition
                       Patch : TPatching
                     end;
    J'ai dans ce type des variables dynamiques genre Tops : Array of TTop. C'est de la que j'ai mes problemes

    Comment est.ce que je peux faire pour enregistrer dans un fichier le contenu de ma variable TSpectacle ??

    Avec ma "vieille methode"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure enreg
    var f : File of TSpectacle
    begin
    ...
    End;
    J'ai cette erreur
    Le type 'TSpectacle' necessite une finalisation - non autorise dans type fichier

    Merci d'avance... Je deviens fou et je trouve peu d'info sur le net...



    A plus

    ZD
    Vivre tue !

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    fais une fonction qui va prendre un TSpectacle pour enregistrer ses champs un par un, selon leurs formats, avec des balises, à la manière d'un XML (ou franchement en XML, d'ailleurs !!!)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    ok je vais essayer.

    Toutefois s'il existe une autre solution je suis curieux egalement

    merci
    Vivre tue !

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    autre solution, pas élégante : tu dérives de Tpersistent, tu déclares tes champs en propriétés published, et tu utilises les méthodes Save/LoadToStream/File...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    pas terrible effectivement... vais plutot aller vers le XML...

    A propos de ca, j'ai Delphi6 et j'ai pas le composant XMLDocument dans la palette d'outil Internet...

    Je suis en train de telechercher l'update 2 de d6, ca va arranger les choses ???

    a plus
    Vivre tue !

  6. #6
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par zarbydigital
    pas terrible effectivement... vais plutot aller vers le XML...

    A propos de ca, j'ai Delphi6 et j'ai pas le composant XMLDocument dans la palette d'outil Internet...

    Je suis en train de telechercher l'update 2 de d6, ca va arranger les choses ???

    a plus
    si c'est une version perso, non !

  7. #7
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Si tu fais un TComponent au lieu d'un record, tu peux toujours utiliser le système de persistance de Delphi (utilisé pour les DFM). C'est très puissant.

    Tu trouveras un exemple et ailleurs sur DVP. Si tu explores cette voie (faire persister grâce à RTTI), il te faudra peut-être un peu de temps pour comprendre au début, mais c'est très interessant. Après reste à voir le temps et l'envie que tu as ou pas, ça n'est qu'une suggestion.

    Bon dev'
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par DMO
    Si tu fais un TComponent au lieu d'un record, tu peux toujours utiliser le système de persistance de Delphi (utilisé pour les DFM). C'est très puissant.

    Tu trouveras un exemple et ailleurs sur DVP. Si tu explores cette voie (faire persister grâce à RTTI), il te faudra peut-être un peu de temps pour comprendre au début, mais c'est très interessant. Après reste à voir le temps et l'envie que tu as ou pas, ça n'est qu'une suggestion.

    Bon dev'
    Pour les record peut etre mais dans le cas de mes nom : array of type ???

    Et pis je peux plus trop me permettre de faire de grosse modif sur mon type TSpectacle, l'application est tout de meme tres volumineuse, je dois trouver le moyen d'enregitrer tout ca comme ca...

    Sinon personne n'a d'idee sur mon probleme avec TXMLDucuments inexistant dans ma palette Internet. J'ai installer l'update2 et il n'est toujours pas la... je cherche...
    Vivre tue !

  9. #9
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Quelle édition de delphi6 as tu ? personnal, pro, architecte ?

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par bjl
    Quelle édition de delphi6 as tu ? personnal, pro, architecte ?
    pro (avec licence, enregitrer, payer et tout...)
    Vivre tue !

  11. #11
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Je crois qu'xml avec delphi6, c'est uniquement la version entreprise.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 38
    Points : 43
    Points
    43
    Par défaut
    Deja, il est deconseille de stocker des strings sans noter une quelconque longueur quelque part...
    Soit tu fais un champ longueur pour chaque chaine que tu traite, soit tu fais un champ fixe (de type string[x]), soit tu stocke la chaine + infos chaine (les 8 octets qui sont stockes avant la chaine elle meme) mais dans ce cas la, il te faudra faire la sauvegarde "a la main".

    Ensuite, pour tes tableaux dynamiques, c'est le meme principe qu'une chaine, le nombre d'elements (length), est stocker dans les 4 octets qui precedent le 1er element (celui pointe par ta variable), il suffit donc de recuperer cette valeur et au choix:
    -de stocker dans un champ a part la longueur
    -de stocker toutes les infos du tableau + le contenu du tableau

    Bien sur, tu devrai faire tes sauvegardes et chargements a la main, c'est a dire ne pas passer directement la chaine ou la tableau a sauvegarder mais rajouter les 8 octets d'informations à sauvegarder quelque part.

  13. #13
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Citation Envoyé par zarbydigital
    Pour les record peut etre mais dans le cas de mes nom : array of type ???
    Bien entendu c'est possible, sinon je me serais abstenu de te le proposer...

    Si tu souhaites le faire, tu peux par exemple remplacer ton tableau par une collection qui s'appellerait TTops, et dont les items seraient des TTop. Ainsi plus rien d'autre à faire, tout ce qui est en published se sauvegarde.
    Ou sinon, tu peux garder tes tableaux et faire toi meme la persistance dans le DefineProperty ou DefineBinairyProperty (c'est fait expres).

    Cette solution est donc selon moi valable, et bien plus "orienté objet" dans l'esprit. Mais dans ton cas je comprends bien que tu ne veuilles pas tout changer. C'est bien entendu comme tu veux.

    Bon dev'
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

  14. #14
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    Utiliser le mécanisme de persistence de la VCL.
    (Testé sous Lazarus 0.9.10 Beta)
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    procedure Save(AItem : TSpectacle; ADest : TStream);
      procedure WriteTop(ATop:TTop;AW:TWriter);
      begin
        AW.WriteInteger(ATop.x);
        AW.WriteString(ATop.y);
      end;
    Var
      w : TWriter;
      i : Integer;
    begin
      w := TWriter.Create(ADest,1024);
      Try
        w.WriteString(AItem.Nom);
        w.WriteString(AItem.Detail);
        If Assigned(AItem.Tops) Then
          i := High(AItem.Tops) - Low(AItem.Tops) + 1
        Else
          i := 0;
        w.WriteInteger(i);
        If ( i > 0 ) Then Begin
          For i := Low(AItem.Tops) To High(AItem.Tops) Do
            WriteTop(AItem.Tops[i],w);
        End;
      Finally
        w.Free();
      End;
    end;
     
    procedure Load(Var AItem : TSpectacle; ADest : TStream);
      procedure ReadTop(Var ATop:TTop;AR:TReader);
      begin
        ATop.x := AR.ReadInteger();
        ATop.y := AR.ReadString();
      end;
    Var
      r : TReader;
      i : Integer;
    begin
      r := TReader.Create(ADest,1024);
      Try
        AItem.Nom := r.ReadString();
        AItem.Detail := r.ReadString();
        i := r.ReadInteger();
        SetLength(AItem.Tops,i);
        If ( i > 0 ) Then Begin
          For i := 0 To Pred(i) Do
            ReadTop(AItem.Tops[i],r);
        End;
      Finally
        r.Free();
      End;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      s: TMemoryStream;
      t,t2 : TSpectacle;
    begin
      t.Nom := 'XX';
      t.Detail := 'YY';
      SetLength(T.Tops,2);
      With T.Tops[0] Do Begin
        x := 1;
        y := 'ss'
      End;
      With T.Tops[1] Do Begin
        x := 2;
        y := '5522'
      End;
      s := TMemoryStream.Create();
      Try
        Save(t,s);
        s.Position := 0;
        Load(t2,s);
      Finally
        s.Free();
      End;
      ShowMessageFmt('nom=%s;'#13'Detail=%s',[t2.Nom,t2.Detail]);
      ShowMessageFmt('nbre Tops = %d',[Length(t2.Tops)]);
      ShowMessageFmt('x=%d; y=%s',[t2.Tops[0].x,t2.Tops[0].y]);
      ShowMessageFmt('x=%d; y=%s',[t2.Tops[1].x,t2.Tops[1].y]);
    end;

Discussions similaires

  1. envoyer une variable php dans un fichier SHELL
    Par diabli73 dans le forum Langage
    Réponses: 5
    Dernier message: 11/12/2008, 14h55
  2. [Dates] injecter une variable dynamique dans une requête
    Par omar071286 dans le forum Langage
    Réponses: 3
    Dernier message: 20/04/2008, 09h51
  3. Interpréter une variable contenue dans un fichier texte
    Par frederic_s dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 11/10/2007, 14h06
  4. Afficher une variable dynamique dans la barre des taches de windows
    Par mustang-ffw02 dans le forum Windows Forms
    Réponses: 16
    Dernier message: 27/05/2007, 23h24
  5. [PHP-JS] Récupérer une variable php dans un fichier javascript
    Par zoom61 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/11/2006, 11h00

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