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

FastReport Discussion :

TfrxuserDataset, GetValue, Value et image


Sujet :

FastReport

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 22
    Points : 14
    Points
    14
    Par défaut TfrxuserDataset, GetValue, Value et image
    bonjour,

    Avec l'aide de SergioMaster ou plutôt grace à son aide, j'ai pu dynamiquement créer un report, sans base de données, afin de restituer le contenu de zones d'une interface delphi.

    Un nouveau souci se pose, comment insérer des images et non leur lien dans le Value de GetValue du frxUserDataSet, le type Variant n'acceptant pas le Graphic nécessaire pour remplir le tfrxPictureview dans mon MasterData.

    A me relire, on dirait un dialecte lu sous la torture uniquement.

    En gros, comment envoyer, à la volée, une ou plusieurs images inconnues à l'avance, dans un Report et le tout sans base de données.
    (ca n'est pas tellement plus clair)

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Pour commencer l'année en beauté ? En tout cas si à 8h00 je ne le sais toujours pas c'est un challenge intéressant que je vais relever

    Si c'est une version pro de Fastreport (c'est à dire avec Script) voici une première solution :
    - Passer le nom (chemin complet de l'image dans une variable du frxdatasetuser if SameText(VarName,'Col3') then Value:='C:\Users\serge\OneDrive\images\hermioneloire.jpg';- Dans le code script de FastReport
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     procedure Picture1OnBeforePrint(Sender: TfrxComponent);
    begin
      TfrxPictureView(Sender).picture.LoadFromFile(<frxUserDataSet1."Col3">);
    end;
    Nom : Capture.PNG
Affichages : 1487
Taille : 151,3 Ko

    Dans une version FastReport Embarcadero,
    tout d'abord, il faut une variabale privée frxImage : TfrxPictureView;un code pour récupérer l'adresse. J'ai choisi le OnBeforePrint du fastReport, je ne suis pas sûr que cela soit le meilleur endroit
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm122.frxReport1BeforePrint(Sender: TfrxReportComponent);
    begin
    frxImage:=FrxReport1.FindObject('picture1') as TfrxPictureView;
    end;

    et, dans le code GetValue
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm122.frxUserDataSet1GetValue(const VarName: string;
      var Value: Variant);
    var S : TFileStream;
    begin
    if SameText(VarName,'Col1') then Value:=StringGrid1.Cells[0,l];
    if SameText(VarName,'Col2') then Value:=StringGrid1.Cells[1,l];
    if SameText(VarName,'Col3') then
       begin
    //     Value:='C:\Users\serge\OneDrive\images\hermioneloire.jpg';
         if assigned(frxImage) then frxImage.Picture.LoadFromFile('C:\Users\serge\OneDrive\images\hermioneloire.jpg');
       end;
    end;

    Et voilà pour les étrennes
    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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 22
    Points : 14
    Points
    14
    Par défaut bonne année
    Salut Sergio et meilleurs voeux à toi et tous les tiens. Attention on va devenir intimes et ca risque de jaser
    Je travaille en embarcadero 10.3 rio et mon fastreport est gratuit parce que c'est dans mes prix.
    En fait je voudrais éviter les chemins en dur. Certaines des images à reporter proviennent de flux ou du clipboard et n'ont donc pas de chemin disque dur.
    Pour l'instant je résous le pb comme ceci pour une seule image. Je n'ai pas encore tester le "plusieurs" images par le dataset.

    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if SameText(VarName,'Signature')    Then begin  //tfrxImageView dans le frxReport avec une connexion au dataset meme si ca ne semble pas etre suffisant en soit
          myImg := imgSignature.Picture; //champ dans l'app delphi
          tFrxPictureView(frxRpt.FindObject('pSignature')).Picture := myImg; //je laisse le système faire le transfert
          Value := 'Signature'; //je ne sais pas pourquoi mais il faut un champ tfrxMemoView dans le frxreport qui soit connecté au dataset
       end;

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par tatane.tatane Voir le message
    Salut Sergio et meilleurs voeux à toi et tous les tiens.
    De même


    Attention on va devenir intimes et ca risque de jaser
    la fréquentation sur ce forum est faible, sans être administrateur ni responsable de ce forum j'en suis certainement le maitre à penser

    Je travaille en embarcadero 10.3 rio et mon fastreport est gratuit parce que c'est dans mes prix.
    l'information me manquait c'est pour cela que j'avais indiqué la solution Script FastReport et celle plus "directe".

    En fait je voudrais éviter les chemins en dur.
    je m'en doutais bien, dans mon code c'était juste le test de faisabilité, bien évidement le chemin en dur pouvait être une variable

    Certaines des images à reporter proviennent de flux ou du clipboard et n'ont donc pas de chemin disque dur.
    J'avais tenté une utilisation de Stream direct mais sans résultat probant d'où la non "publication" de l'essai. Ma tentative consistait à transformer le Stream en Variant, mais en rgardant les sources de fastreport ce type de variant n'est pas prévu, a priori, après lecture diagonale, uniquement texte et numériques et boolean sont prévus.
    TfrxFieldType = (fftNumeric, fftString, fftBoolean);néanmoins frxUserDataset est un descendant direct de frxDataSet, de là à imaginer un helper (ou, vieille méthode un hacking) il n'y a qu'un pas que je ne franchirai pas. (je viens de voir que frxUserdataset n'était pas prévu pour toutes les plateformes)
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [ComponentPlatformsAttribute(pidWin32 or pidWin64 or pidOSX32)]
      TfrxUserDataSet = class(TfrxDataset)

    Une pré tentative très courte, car je cherchais avant tout une solution, fut d'utiliser un LoadFromStream TfrxPictureView(Sender).picture.LoadFromSteam(astream) mais, j'avais eu une erreur de format (en fait à ma souvenance, j'avais écrit TfrxPictureView(Sender).LoadFromSteam(s) ce qui ne pouvais que conduire au désastre
    en fait, en revenant dessus aujourd'hui, ceci
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var S : TMemoryStream;
    begin
    //if SameText(VarName,'Col1') then Value:=StringGrid1.Cells[0,l];
    //if SameText(VarName,'Col2') then Value:=StringGrid1.Cells[1,l];
    if SameText(VarName,'Col3') then
       begin
         S:=TMemoryStream.Create;
         try
           S.LoadFromFile('C:\Users\serge\OneDrive\images\hermioneloire.jpg');
           if assigned(frxImage) then frxImage.Picture.LoadFromStream(S);
         finally
           S.Free;
         end;
       end;
    Fonctionne tout aussi bien, bon, bien évidemment pour mes tests je n'utilise qu'une image (photo prise l'année dernière par une amie), le chargement est à "amélioré" en fonction de l'application.
    D'ailleurs, je me demande comment je pourrais utiliser le clipboard , intéressant, un truc que je n'ai jamais exploré ni évidemment utilisé dans mes applications !

    Pour l'instant je résous le pb comme ceci pour une seule image. Je n'ai pas encore tester le "plusieurs" images par le dataset.
    j'étais bien conscient qu'il ne s'agissait pas d'une seule image mais de n images.

    Niveau code, je ne suis pas partisan de récupérer à chaque fois l'adresse du frxPictureView d'où mon parti pris de le récupérer en début d'impression et encore suis-je légèrement dubitatif sur l'évènement utilisé pour l'obtenir.

    Voilà donc ma petite variation sur le sujet
    Code delphi : 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
    procedure TForm122.Button1Click(Sender: TObject);
    begin
    // Récupération de l'objet image
    frxImage:=FrxReport1.FindObject('picture1') as TfrxPictureView;
    // nouvelle version EOF
    frxUserDataSet1.RangeEnd := reCount;
    frxUserDataSet1.RangeEndCount := 6;
     
    frxReport1.PrepareReport();
    frxReport1.ShowPreparedReport;
    end;
    ...
    // Données
    procedure TForm122.frxUserDataSet1GetValue(const VarName: string;
      var Value: Variant);
    var S : TMemoryStream;
    begin
    if SameText(VarName,'Col1') then Value:=StringGrid1.Cells[0,l];
    if SameText(VarName,'Col2') then Value:=StringGrid1.Cells[1,l];
    if SameText(VarName,'Col3') then
       begin
         S:=TMemoryStream.Create;
         try
           case l mod 3 of  // une image sur 3
             0 : S.LoadFromFile('C:\Users\serge\OneDrive\images\hermioneloire.jpg');
             1 : S.LoadFromFile('C:\Users\serge\OneDrive\images\anniv25.png');  // format différent 
             2 : S.LoadFromFile('C:\Users\serge\OneDrive\images\paquets.jpg');  
           end;
     
           if assigned(frxImage) then frxImage.Picture.LoadFromStream(S);
         finally
           S.Free;
         end;
       end;
    end;

    Nom : Capture.PNG
Affichages : 1444
Taille : 157,5 Ko

    //je ne sais pas pourquoi mais il faut un champ tfrxMemoView dans le frxreport qui soit connecté au dataset
    étrange, j'ai réussi à faire sans, toutefois s'il s'agit de l'état avec uniquement les images (donc un seul champ dans le frxUserDataset) c'est peut-être nécessaire


    [Edit] le EOF
    une autre manière de faire que je consigne ici :

    Pour éviter de coder un OnCheckEOF on peut utiliser ces deux propriétés
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     frxUserDataSet1.RangeEnd := reCount;  // par défaut reLast
     frxUserDataSet1.RangeEndCount := n ;   // par défaut 0,  où n est le nombre de lignes voulu
    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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 22
    Points : 14
    Points
    14
    Par défaut voilà où j'en suis
    Salut,
    J'ai pas mal avancé et pour le coup ca fonctionne.
    le frxReport est composé entre autres, d'un masterdata relié au frxuserdataset udScelle et d'un DetailData relié au frxUserDataSet udImgScelle. tu auras compris que pour une entete (cartouche) il peut y avoir de 0 à n images. Ca fonctionne et ca carbure bien. C'est surement optimisable et sécurisable dans le code (test sur des affectations de variables etc...)

    Code delphi : 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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    Type
        frxRpt : tFrxReport;
        frxUdLexique: TfrxUserDataSet;
        frxUdTete: TfrxUserDataSet;
        frxUdScelle: TfrxUserDataSet;
        frxUdImgScelle: TfrxUserDataSet;
        pcMain: TPageControl;
        chkLexique: TCheckBox;
        chkSerment: TCheckBox;
        chkIndex: TCheckBox;
        tvScelle: TJvThumbView;
     
     
     
    implementation
     
    {$R *.dfm}
     
    uses
     
    var
       ilImgScelle, ilScelle : integer;
       ArScelle : Array of integer; //les onglets scellés sont créés dynamiquement et pas forcément les uns à la suite des autres. Donc une variable tableau pour en connaitre le nombre et leur position
     
     
    procedure TfrmMain.acReportExecute(Sender: TObject);
    begin
          //charge la première partie du rapport
          frxRpt.LoadFromFile(sPathReports + 'RptTete.fr3',False);
          //prépare la page entete
          frxRpt.PrepareReport(True);
          frxRpt.LoadFromFile(sPathReports + 'RptIndex.fr3',False);
          frxRpt.PrepareReport(false);
          frxRpt.LoadFromFile(sPathReports + 'RptLexique.fr3',False);
          frxRpt.PrepareReport(false);
          frxRpt.LoadFromFile(sPathReports + 'RptMethodo.fr3',False);
          frxRpt.PrepareReport(false);
     
          frxRpt.LoadFromFile(sPathReports + 'RptScelle.fr3',false);
          frxRpt.PrepareReport(False);
     
          frxRpt.LoadFromFile(sPathReports + 'RptConclusion.fr3',False);
          frxRpt.PrepareReport(false);
          frxRpt.LoadFromFile(sPathReports + 'RptCloture.fr3',False);
          frxRpt.PrepareReport(false);
     
          frxRpt.ShowPreparedReport;
    end;
     
     
    //bornage du nombre d'itérations d'images dans l'onglet scellé en cours. Ces onglets sont créés dynamiqement
    procedure TfrmMain.frxUdImgScelleCheckEOF(Sender: TObject; var Eof: Boolean);
    begin
       Eof:= ilImgScelle>(pcMain.Pages[arScelle[ilScelle]].FindChildControl('tvScelle') as tJvThumbView).GetCount -1;
    end;
     
    //initialisation de la variable images scelles
    procedure TfrmMain.frxUdImgScelleFirst(Sender: TObject);
    begin
       ilImgScelle := 0;
    end;
     
    //récupération de l'image de tvscelle courant pour envoyer l'image dans le report
    procedure TfrmMain.frxUdImgScelleGetValue(const VarName: string; var Value: Variant);
    begin
       if SameText(VarName,'ImgScelle') then begin
          (FrxRpt.FindObject('pImgScelle') as tFrxPictureView).Picture :=
             (pcMain.Pages[arScelle[ilScelle]].FindChildControl('tvScelle') as tJvThumbView).ThumbList.Thumbnail[ilImgScelle].Photo.Picture;
          (pcMain.Pages[arScelle[ilScelle]].FindChildControl('tvScelle') as tJvThumbView).Selected := ilImgScelle;
          Value := (pcMain.Pages[arScelle[ilScelle]].FindChildControl('tvScelle') as tJvThumbView).SelectedFile;
       end;
    end;
     
    //incrément de la variable des images de scellé
    procedure TfrmMain.frxUdImgScelleNext(Sender: TObject);
    begin
       inc(ilImgScelle);
    end;
     
    //calcul du nombre total de scelles
    procedure TfrmMain.frxUdScelleCheckEOF(Sender: TObject; var Eof: Boolean);
    var
       i, j : integer;
     
    begin
       //initialisation de la variable de comptage
       J := 0;
       //boucle sur tous les onglets pour voir s'il y a des scelles et les compter
       for i := 0 to pcMain.PageCount - 1 do
          if Copy(pcMain.Pages[i].Name,0,6)= 'Scelle' then inc(j);
     
       //dimensionner la variable tableau
       SetLength(ArScelle,J);
     
       //le comptage va de la variable courante à J le nombre total de scellé
       Eof:= ilScelle> j-1;
     
       J:=0;
       //reboucle dessus pour alimenter la variable tableau
       for i := 0 to pcMain.PageCount - 1 do
          if Copy(pcMain.Pages[i].Name,0,6)= 'Scelle' then begin
             arScelle[J] := i;
             inc(J);
          end;
    end;
     
    //initialisation de la variable entete de scellé (cartouche)
    procedure TfrmMain.frxUdScelleFirst(Sender: TObject);
    begin
       ilScelle :=0;
    end;
     
    //récupération des données maitre pour le scellé courant
    procedure TfrmMain.frxUdScelleGetValue(const VarName: string; var Value: Variant);
    var
       i : integer;
    begin
       if SameText(VarName,'Nom')           then Value := (pcMain.Pages[arScelle[ilScelle]].FindChildControl('txtNumScelle') as tlabeledEdit).Text;
       if SameText(VarName,'Description')  then Value := (pcMain.Pages[arScelle[ilScelle]].FindChildControl('txtDescScelle') as tlabeledEdit).Text;
       ...
       if SameText(VarName,'Observations') then Value := (pcMain.Pages[arScelle[ilScelle]].FindChildControl('txtObsScelle') as tlabeledEdit).Text;
    end;
     
    //incrément pour le scelle suivant
    procedure TfrmMain.frxUdScelleNext(Sender: TObject);
    begin
       inc(ilScelle);
    end;

    Merci pour toute l'aide apportée

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 22
    Points : 14
    Points
    14
    Par défaut Nouveau souci
    Petit souci (encore)
    j'ai dans ma page delphi un tJvRichEdit dans lequel j'ai du texte enrichi et des images. Je voudrais passer tout le contenu dans un tfrxRichView via un tFrxUserDataSet et donc par le value.
    Le texte passe bien mais pas la mise en page ni les images. As tu une idée là dessus ?

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je partirai du même principe que pour une image : un passage via un flux (stream), tu ne peux pas passer un texte (une images contiendrait certainement des /00 (= fin de texte) donc il faut envoyer des octets.
    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

  8. #8
    Membre habitué
    Homme Profil pro
    Dev informatique retraité
    Inscrit en
    Août 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev informatique retraité
    Secteur : Santé

    Informations forums :
    Inscription : Août 2005
    Messages : 221
    Points : 171
    Points
    171
    Par défaut
    Bonsoir,

    Dans mon cas où je place en haut de la facture un logo, j'utilise cela: la propriété FileLink

    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Var LogoImage: TfrxPictureView;
     
    LogoImage := frxReportImprime.FindObject('LogoImage') as TfrxPictureView;
        LogoImage.Visible := True;
        LogoImage.FileLink :='logofact.jpg';

    mais bien sûr c'est sur une seule image et celle ci est stockée dans mon répertoire de travail !

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 22
    Points : 14
    Points
    14
    Par défaut pb tfrxRichView
    bonjour à tous,
    Cela fait plusieurs jours que je tente de passer le contenu d'un richedit dans un fast report.
    J'ai en fait un ou plusieurs RichEdit avec un contenu mis en page (gras, italique, souligné, images, bullet etc...)
    Au moment du report avec un frxUserDataSet, j'envoie dans le value, le contenu de mon richedit. Evidemment je perd la mise en page, les images etc..
    j'ai tenté par le clipboard qui m'a planté une belle erreur
    J'ai tenté par tu stream

    Code delphi : 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
    myStream : tMemoryStream;
     
    begin
    myStream := tMemoryStream.create;
     
    try
     
    myStream := monRichEdit.Lines.saveToStream(myStream);
    monFrxEdit.Richedit.LoadFromStream(myStream);
     
    finally
     
    myStream.free;
     
     
    end;
     
    end;

    un truc du style.
    Ca me plante une erreur dès que le code tente d'acceder au monFrxEdit.
    J'ai également essayé avec un writebuffer mais je n'obtiens rien de plus qu'avec un simple value:=....text;

    Un peu voir beaucoup d'aide serait la bien venue

    merci d'avance.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    comme je l'indiquais je passerais le RichEdit de la même manière qu'une image.

    Cependant j'ai lu ces contraintes et surtout celles-ci
    - Assurez-vous qu'il n'y avait pas d'espace blanc avant le {qui ouvre le RTF, c'était un problème d'importation
    - Convertissez la chaîne en ANSI 8 bits (pas la chaîne Unicode habituelle)
    - J'ai dû basculer le drapeau de retour à la ligne pour que le texte s'enroule après le chargement
    dans un post sur le forum FastReport

    Le challenge serait donc de passer le contenu du RichEdit au format ANSI 8.
    Au passage, je note une erreur dans le code présenté
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    myStream := monRichEdit.Lines.saveToStream(myStream);
    Code Pascal : 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
    procedure TForm122.frxUserDataSet1GetValue(const VarName: string;
      var Value: Variant);
    var S : TMemoryStream;
    begin
    if SameText(VarName,'monrichedit') then
       begin
         try
           S:=TMemoryStream.Create;  
           // conversion en ANSI 8 
           monRichEdit.Lines.saveToStream(S,TEncoding.ANSI);
           if assigned(frxRichEdit) then 
             begin   
                frxRichEdit.RichEdit.Lines.LoadFromStream(S);
                 // dernière recommandation ??? pas de wordwrap dans ma version
                 // frxRichEdit.wordwrap:=False;
                 // frxRichEdit.wordwrap:=True;
             end;
         finally
           S.Free;
         end;
       end;
    end;

    Cela dit, c'est écrit sans test (il me faudrait déjà un RTF quelconque contenant texte, mise en forme et images) et sans contrôle de syntaxe. Ce n'est donc qu'un broillon de solution à tester et valider (ou non)
    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

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 22
    Points : 14
    Points
    14
    Par défaut erreur mémoire
    voilà le message erreur qui me vient avec le memorystream

    Nom : Capture d’écran 2021-01-13 070852.png
Affichages : 1420
Taille : 7,6 Ko

  12. #12
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 22
    Points : 14
    Points
    14
    Par défaut Oups
    je me suis corrigé pour l'erreur mémoire mais le résultat reste un champ vide. rien ne s'écrit dans mon report. Je ne sais pas trop quel test faire pour voir où le souci réside

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 22
    Points : 14
    Points
    14
    Par défaut
    j'ai vérifié plusieurs étape.
    Le stream est bien rempli, puisque je le sauvegarde dans un fichier et j'y retrouve bien mon contenu.
    Le souci semble résider dans l'écriture de la zone frxrichview. Je fais un savetofile du stream et un savetofile du frx, le résultat est que le premier est bien rempli mais le second est vide


    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
     
    var
       s : tMemoryStream;
     
    begin
       if SameText(VarName,'TexteAnalyse') then begin
          //Value := '';
          try
             s := tMemoryStream.Create;
             (pcMain.Pages[arScelle[ilScelle]+1].FindChildControl('txtAnalyse') as tJVRichedit).Lines.SaveToStream(s);
             if assigned (frxRpt.FindObject('frxTxtAnalyse') as TfrxRichView) then begin
                (frxRpt.FindObject('frxTxtAnalyse') as TfrxRichView).RichEdit.Lines.LoadFromStream(s, tEncoding.ANSI);
                (frxRpt.FindObject('frxTxtAnalyse') as TfrxRichView).RichEdit.Lines.SaveToFile(sPathTmp + '\test2.rtf');
                s.SaveToFile(sPathTmp + '\test.rtf');
             end;
          finally
             s.Free;
          end;
       end;
     
    end;

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je me suis bricolé un RTF en utilisant LibreOffice.

    Nom : Capture.PNG
Affichages : 1392
Taille : 361,2 Ko

    Constatations :
    -Peu habitué à tjvrichEdit je ne visionne aucune image dans la fenêtre
    Nom : Capture_1.PNG
Affichages : 1419
Taille : 8,9 Ko

    -deuxième souci effectivement le passage par stream ne donne rien, le passage du texte aRichView.RichEdit.Lines.text:=jvrichEdit.lines.text non plus (le fait que le fichier soit important en taille à cause du jpeg fait certainement déborder la mémoire)

    Du coup je me suis posé quelques questions :
    - pouvais-je obtenir un bon résultat en chargeant le fichier ; réponse mitigée : le jpeg n'est pas pris en compte
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    aRichView.RichEdit.Lines.LoadFromFile('d:\serge\documents\test.rtf');
    Nom : Capture_2.PNG
Affichages : 1404
Taille : 12,4 Ko

    La solution "évidente" serait donc de passer le contenu du jvrichedit dans un fichier temporaire plutôt que dans un stream ?
    J'ai donc, supprimé le JPEG pour faire un nouvel essai, du coup le passage via stream ne bloque plus
    Code Pascal : 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
     
    procedure TForm122.Button2Click(Sender: TObject);
    begin
    aRichView:=FrxReport1.FindObject('rich1') as TfrxRichView;
    // nouvelle version EOF
    frxUserDataSet1.RangeEnd := reCount;
    frxUserDataSet1.RangeEndCount := 1;
    frxReport1.PrepareReport();
    frxReport1.ShowPreparedReport;
    end;
     
    procedure TForm122.frxUserDataSet1GetValue(const VarName: string;
      var Value: Variant);
    var S : TMemoryStream;
        St: string;
    begin
    if SameText(VarName,'RichText') then
     begin
       Value:='';
       S:=TMemoryStream.Create;
       try
       if Assigned(aRichView) then
        begin
         JvRichEdit1.Lines.SaveToStream(S);
        aRichView.PlainText:=True;
         S.Position:=0;
         aRichView.RichEdit.Lines.LoadFromStream(S);   //LoadFromFile('d:\serge\documents\testsansjpeg.rtf');
         aRichView.PlainText:=False;
        end;
       finally
         S.Free;
       end;
     end;
    end;
    mais le résultat Nom : Capture_3.PNG
Affichages : 1408
Taille : 7,2 Ko : pas d'images

    (Attention dans le frxreport, le frxRichmemo ne doit être à aucune donnée, impliquant la nécessité d'un frxmemoview (lui lié) --> le "A" bleu plus ou moins devant 'mise en forme' qui se met dans l'état me servant de vérification)

    - Je suis presque convaincu que le problème vient de mon fichier RTF que JVRichEdit ne sais pas interprété correctement, si je lis les questions sur le thème "comment insérer une image dans mon jvrichedit"

    NB : Pour ce qui est du jpeg, il me semble me souvenir d'une discussion sur le forum FastReport concernant la gestion de Stream de taille trop importante
    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

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut Addendum
    Si je mets la propriété plaintext du jvRichEdit à true, le passage des données via le stream (fichier sans JPEG) fonctionne.
    Le hic : je ne sais pas comment récupérer un plaintext à partir d'un JVRichedit affiché "normalement"

    Du coup, j'ai tenté le TRichEdit, tout simple même constat, je me demande pourquoi utiliser le JVRichedit.

    Puis, étant plus FMX que VCL, j'ai pensé aux composants TMS. En utilisant un TAdvRichEditor et un TAdvRicheditorRTFIO associé, j'ai, sans problème (si ce n'est la lenteur) affiché à l'écran mon fichier avec image jpeg
    Ayant déjà eu à faire avec l'équivalent en FMX (TTMSFMXRichEditor), je sais qu'il est possible d'accéder directement au PlainText (son contenu pas comme la propriété booléenne d'un jvRichedit ou d'un richedit) je ne doute pas qu'il soit possible alors de faire en sorte d'obtenir le bon résultat dans Fastreport

    Je ne veux pas pousser à la consommation (je n'ai aucune commission et suis assez critique dès qu'il s'agit d'utiliser ces composants avec les LiveBindings) mais un essai de TMS VCL Richeditor ou mieux Tmsfncuipack ne coute rien
    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

  16. #16
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2005
    Messages : 22
    Points : 14
    Points
    14
    Par défaut suite et fin
    bonjour à tous,

    J'ai fini par transformer via le canvas, toutes les images insérées dans le tJvRichEdit, en bitmap. Ca a résolu tous les soucis. Le document rtf qui en découle est léger et passe dans le tRichview via le tMemoryStream sans encombre.

    Merci à tous pour votre aide.

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

Discussions similaires

  1. ASE : insert values into image, unitext and varbinary
    Par dnboa dans le forum Adaptive Server Enterprise
    Réponses: 0
    Dernier message: 16/07/2013, 11h33
  2. comment mettre une image dans une liste avec les values ?
    Par Ekimasu dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 15/05/2007, 17h51
  3. Attribut value de input type=image sous IE
    Par Oluha dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 19/02/2007, 17h10
  4. recupérer value de buton image
    Par dipajero dans le forum Langage
    Réponses: 3
    Dernier message: 23/03/2006, 22h30
  5. <img src="<xsl:value-of select="image"
    Par ToxiZz dans le forum XSL/XSLT/XPATH
    Réponses: 22
    Dernier message: 09/01/2006, 17h17

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