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 :

Array of TMemoryStream


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut Array of TMemoryStream
    bonjour à tous,
    voici mon problème : je souhaite pour la 1ère fois utiliser les TMemoryStream afin de stocker mes pages de FastReport, puis de reconstruire un rapport complet en appelant les pages sauvées dans mes Memorystream, ne connaissant pas leurs nombres j'ai pensé les sauver dans Array of TMemoryStream.
    lorsque je reconstruis mon état, j'obtiens seulement la dernière page crée...au nombre de la variable LNbreStream bien sûr.
    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
     
    var
        LListeStream: array of TMemoryStream;
        LSTream : TMemoryStream;
        LNbreStream: integer;
    begin
     
       for i:= 0 to ... do // préparation des états et mise en Stream
       begin
           LNbreStream:= 0;
           inc(LNbreStream);
           SetLength(LListeStream, LNbreStream+1);
           LListeStream[LNbreStream] := TMemoryStream.Create;  
           Report_FVT.PrepareReport(true);
           Report_FVT.SaveToStream(TStream(LListeStream[LNbreStream]));
       end
       ...
       ...
       // utilisation du tableau array of TMemoryStream
       for l := 1 to LNbreStream do
       begin
           LSTream:= TMemoryStream.Create;
           LSTream:= LListeStream[l];
           LSTream.Position:= 0;
           Report_FVT.LoadFromStream(LSTream);
           ...
       end;
       Report_FVT.ShowPreparedReport;
    end;
    je ne trouve pas mon erreur, d'ailleurs est-ce un bon principe ?

    merci de votre aide

  2. #2
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    tu reinitialise a chaque fois LNbreStream dans ta boucle, il faut le faire avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
     
       LNbreStream:= 0; //init avant la boucle
       for i:= 0 to ... do // préparation des états et mise en Stream
       begin
    Tu peux aussi t'en passer (preferable car en plus tu n'utilise pas la case d'indice 0):
    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
     
    var
        LListeStream: array of TMemoryStream;
        LSTream : TMemoryStream;
    begin
       SetLength(LListeStream, 0);
       for i:= 0 to ... do // préparation des états et mise en Stream
       begin
           SetLength(LListeStream, Length(LListeStream)+1);
           LListeStream[High(LListeStream)] := TMemoryStream.Create;  
           Report_FVT.PrepareReport(true);
           Report_FVT.SaveToStream(LListeStream[High(LListeStream)]);
       end
       ...
       ...
       // utilisation du tableau array of TMemoryStream
       for l := 0 to High(LListeStream) do
       begin
           LSTream:= TMemoryStream.Create;
           LSTream:= LListeStream[l];
           LSTream.Position:= 0;
           Report_FVT.LoadFromStream(LSTream);
           ...
       end;
       Report_FVT.ShowPreparedReport;
    end;

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Merci de ta réponse.
    en fait dans la prépa de mon code ici j'ai fait une erreur, effectivement mon code est bien celui-là comme toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
    *
       LNbreStream:= 0; //init avant la boucle
       for i:= 0 to ... do // préparation des états et mise en Stream
       begin
    ensuite j'ai suivi tes conseils pour la 2 ème partie mais cela ne fonctionne pas... je cherche et fais des essais pas concluants pour l'instant

  4. #4
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Effectivement, je n'avais pas bien lu la partie concernant le report, mais tu charge n fois le contenu du même report, normal que tu n'ai que le dernier.
    Je ne sais pas comment tu peux faire, je ne connais pas FastReport, et je pense que tu n'es pas obligé de sstocker le contenu dans des streams, tu dois certainement pouvoir manipuler simplement ton Report_FVT.
    PS : le LSTream:= TMemoryStream.Create; ligne 19 ne sert a rien.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Il est assez logique que Report.LoadFromStream charge le document complet non ?

    Il faudrait voir s'il y a des fonctions SaveToStream/LoadFromStream sur un objet "page".

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Salut à vous,
    ce que je veux faire exactement est la création de plusieurs reports; je dois créer plusieurs types de pages via plusieurs objets Frxreport car mes états sont complexes. certaines pages sont créées dans Fastreport et d'autres en dynamique seulement avec du code. je dois ensuite concaténer ces pages. donc je pensais pertinent de sauver chaque état dans un objet TMemoryStream. ensuite je vais rechercher les états (mes pages) depuis le tableau de MemoryStream.
    lorsque qu'un état est créé je le sauve :
    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
     
    var
        LListeStream: array of TMemoryStream;
        LSTream : TMemoryStream;
        LNbreStream: integer;
    begin
    *
       for i:= 0 to x do // préparation des états et mise en Stream
       begin
           ... // traitement des données
           Report_FVT.PrepareReport(true); // préparation de l'état
           LNbreStream:= 0;
           inc(LNbreStream);
           SetLength(LListeStream, LNbreStream+1);
           LListeStream[LNbreStream] := TMemoryStream.Create;  // création du TMemoryStream dans le tableau
     
           Report_FVT.SaveToStream(TStream(LListeStream[LNbreStream]));// sauve l'état dans ce TMemoryStream 
           ... // suite
       end
    lorsque j'ai terminé le traitement de toutes mes pages je souhaite retrouver celles-ci depuis le Array of tMemory via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       for l := 1 to LNbreStream do // balayage du tableau of TMemoryStream 
       begin
           LSTream:= TMemoryStream.Create;
           LSTream:= LListeStream[l];
           LSTream.Position:= 0;
           Report_FVT.LoadFromStream(LSTream);
           ...
       end;
       Report_FVT.ShowPreparedReport; // affiche l'état complet

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Salut à vous,
    je peux dire que mon problème est résolu. mon tableau de TMemoryStream semblait fonctionner mais pas moyen de retrouver mes états depuis cet array.
    j'ai modifié 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
    23
    24
    25
    26
     
    *
    var
        LListeStream: array of TMemoryStream;
        LSTreamFVT, LStreamTAB : TMemoryStream;
        LNbreStream: integer;
    begin
       for i:= 0 to x do // préparation des états et mise en Stream
       begin
           ... // traitement des données
           Report_FVT.PrepareReport(true); // préparation de l'état FVT
    *      Report_FVT.SaveToStream(LStreamFVT); // sauve l'état dans TMemoryStream 
     
           LStreamFVT.Position:= 0;
           frxReportcompil.LoadFromStream(LStreamFVT);
           frxReportcompil.PrepareReport(false);
     
           Report_TAB.PrepareReport(true); // préparation de l'état TAB
    *      Report_TAB.SaveToStream(LStreamTAB); // sauve l'état dans TMemoryStream 
     
           LStreamTAB.Position:= 0;
           frxReportcompil.LoadFromStream(LStreamTAB);
           frxReportcompil.PrepareReport(false);
           ... // suite
          frxReportcompil.ShowPreparedReport;
       end
    cette alternative fonctionne, mais je vais quand même poser la question à FastReport et la mettrais sur ce forum

  8. #8
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 386
    Points : 2 999
    Points
    2 999
    Par défaut
    https://www.fast-report.com/en/forum...showtopic=7582

    Je n'ai pas tout lu par manque de temps mais Il n'y a pas de possibilité de faire un report à partir de plusieurs ??

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Papy214 Voir le message
    Il n'y a pas de possibilité de faire un report à partir de plusieurs ??
    Bien sûr que oui ! par contre je n'ai pas le temps de détaillé ma réponse, si c'est nécessaire je le ferais plus tard
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    Effectivement cela est possible je le fais dans mon dernier post.
    j'aurai tout de même espéré comprendre pourquoi mon premier post ne fonctionne pas (array of TMemoryStream), d'ailleurs si je l'ai posté dans ce forum c'est parce que je pensais à une erreur de ma part dans ce principe de TStream. maintenant je pense que c'est un problème de gestion de FastReport...

    si quelqu'un a des idées...

  11. #11
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Georges P Voir le message
    j'aurai tout de même espéré comprendre pourquoi mon premier post ne fonctionne pas (array of TMemoryStream), d'ailleurs si je l'ai posté dans ce forum c'est parce que je pensais à une erreur de ma part dans ce principe de TStream. maintenant je pense que c'est un problème de gestion de FastReport...
    Mais ton premier post comporte plein d'erreurs, tant dans la gestion de tes streams, que dans le report (comme je te l'ai en partie montré dans mon 1er post) :
    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
     
    var
        LListeStream: array of TMemoryStream;
        LSTream : TMemoryStream;
        LNbreStream: integer;
    begin
     
       for i:= 0 to ... do // préparation des états et mise en Stream
       begin
           LNbreStream:= 0;
           inc(LNbreStream);
           SetLength(LListeStream, LNbreStream+1);
           LListeStream[LNbreStream] := TMemoryStream.Create;  
           ShowMessageFmt('Remplissage de la case %d pour i=%d', [LNbreStream, i]); //ici, tu remplis toujours la case n°1, quel que soit le i.
           Report_FVT.PrepareReport(true); //tu ne fais pas de modif de ton report entre les differents tours de boucle, donc je pense que tu prepares toujours le meme report
           Report_FVT.SaveToStream(TStream(LListeStream[LNbreStream]));
       end
       ...
       ...
       // utilisation du tableau array of TMemoryStream
       for l := 1 to LNbreStream do //LNbreStream vaut toujours 1
       begin
           LSTream:= TMemoryStream.Create;
           LSTream:= LListeStream[l];
           LSTream.Position:= 0;
           Report_FVT.LoadFromStream(LSTream); //tu remplaces à chaque fois ton report par celui de ton stream
           ...
       end;
       Report_FVT.ShowPreparedReport; //tu n'affiches que le dernier report chargé
    end;

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 228
    Points : 93
    Points
    93
    Par défaut
    je n'ai pas posté tout mon code dans cette exemple, mais j'ai toutefois effectivement fait une erreur de copier/coller voici ce nouveau code (à notre que les .../commentaires sont du code non présent ici - trop long sinon)
    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
     
    var
        LListeStream: array of TMemoryStream;
        LSTream : TMemoryStream;
        LNbreStream: integer;
    begin
       LNbreStream:= 0;
       for i:= 0 to x do // préparation des états et mise en Stream
       begin
           ... // traitement des données préparation des tables à chaque passage de i
           Report_FVT.PrepareReport(true); // préparation de l'état 
     
           inc(LNbreStream);
           SetLength(LListeStream, LNbreStream+1);
           LListeStream[LNbreStream] := TMemoryStream.Create;  // création du TMemoryStream dans le tableau
    *
           Report_FVT.SaveToStream(TStream(LListeStream[LNbreStream]));// sauve l'état dans ce TMemoryStream suivant "LNbreStream"
           ... // suite
           // Préparation d'un autre état
           inc(LNbreStream);
           SetLength(LListeStream, LNbreStream+1);
           LListeStream[LNbreStream] := TMemoryStream.Create;
           Report_TAB.PrepareReport(true); 
           Report_TAB.SaveToStream(TStream(LListeStream[LNbreStream])); 
     
       end
    lorsque j'ai terminé le traitement de toutes mes pages je souhaite retrouver celles-ci depuis le Array of tMemory via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       for l := 1 to LNbreStream do
       begin
           LSTream:= TMemoryStream.Create;
           LSTream:= LListeStream[l];
           LSTream.Position:= 0;
           Report_Main.LoadFromStream(LSTream);
           ...
       end;
       Report_Main.ShowPreparedReport;
    quelqu'un aurait des infos sur Report_FVT.PreviewPages ? comment l'utiliser ?

    merci

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

Discussions similaires

  1. [XSL][ARRAY]
    Par miloud dans le forum XMLRAD
    Réponses: 4
    Dernier message: 02/10/2003, 15h46
  2. Erreur "size array"
    Par boobob dans le forum C
    Réponses: 3
    Dernier message: 06/08/2003, 10h18
  3. TStringList en array of string
    Par JediKerian dans le forum Langage
    Réponses: 2
    Dernier message: 20/03/2003, 15h37
  4. Réponses: 2
    Dernier message: 23/02/2003, 00h49
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

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