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 :

Comment imprimer une StringGrid? [FAQ]


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Points : 35
    Points
    35
    Par défaut Comment imprimer une StringGrid?
    Bonjour à tous

    Je travaille sur BDS2006 en C++.

    Après maintes recherches sur le Forum, je repose cette question qui n'a jamais eu de réponses claires affichées sur ce forum...

    Comment peut- on imprimer une StringGrid, sans utiliser Exel (je ne suis pas supposée avoir la licence)...et en gardant les lignes de séparation de colonnes et de lignes
    (donc ne pas transférer le contenu de la grille dans un Memo, par exemple)?
    Cette question a déja été abordée et apparemment des réponses se sont données en messages privés.

    J'ai essayé de joindre les personnes qui ont envoyé ou reçu ces solutions, mais elles ne m'ont pas répondu.

    Merci d'avance pour vos suggestions?

  2. #2
    Membre actif Avatar de Mattetfamilly
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 182
    Points : 201
    Points
    201
    Par défaut
    Personnellement, j'ai déjà été confronté profesionellement à ce problème.

    Je suis en congés et je n'ai pas le code sous la main. (je rentres le 19/06/2006 au boulot)
    Pour le contourner, j'ai utilisé un QuickReport.
    Ensuite à la compilation, j'ai une boucle pour scruté chaque cellule et je crée dynamiquement un TQRLabel pour chacune.
    Ensuite il doit y avoir une propriété Frame qui te permet de mettre un cadre à chaque Label.
    Cela a nécessité quelques essais et ce ne fut pas facile. Parmi les difficultés que j'avais éprouvé:
    Les Width / Left / Top et Height ne sont pas les mêmes entre la TSringGrid et le QuickReport. Cela vient du fait que les coordonnées sont exprimées en coordonnées écran pour la TStringGrid et en coordonnées imprimante pour le quickreport.
    Tu dois trouver ou redeéterminer par des essais le coefficient de conversion entre les deux.

    Le petit plus, cette méthode te donne un accès plus aisée à la mise en page (centrage du tableau par exemple) ainsi que l'utilisation de composants de titre, entête de page, nombre de pages, bas de page...
    Cela est aussi assez simple de rapeller une ou plusieurs colonnes ou encore lignes à chaque page (ligne de titre / colonnes de nom...)

    Si tu cherches toujours le mois prochain, en reprenant le boulot, je t'enverrai le code.

    Mattetfamilly.

  3. #3
    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
    Moi personnelement j'ai codé l'impression tout seul avec l'objet TPrinter.

  4. #4
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par pottiez
    Moi personnelement j'ai codé l'impression tout seul avec l'objet TPrinter.
    le problème est que je ne peux pas juste imprimer la Form qui contient la StringGrid, car cette grille est supposée contenir beaucoup de lignes...
    (qui ne tiennent pas sur une seule Form).
    j'aimerais avoir plusieurs pages d'impression qui donnent le contenu de ma StringGrid, quelqu'il soit.

  5. #5
    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
    Citation Envoyé par emmental
    le problème est que je ne peux pas juste imprimer la Form qui contient la StringGrid, car cette grille est supposée contenir beaucoup de lignes...
    (qui ne tiennent pas sur une seule Form).
    j'aimerais avoir plusieurs pages d'impression qui donnent le contenu de ma StringGrid, quelqu'il soit.
    Avec l'objet TPrinter tu peut imprimer ce que tu veut, de la taille que tu veut, sur le nombre de page que tu veut, il faut juste savoir le faire, ce qui n'est pas une mince affaire.

  6. #6
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    merci Pottiez,
    j'ai trouvé cet exemple dans l'aide sur Tprinter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       TPrinter *Prntr = Printer();
       TRect r = Rect(200,200,Prntr->PageWidth - 200,Prntr->PageHeight- 200);
       Prntr->BeginDoc();
       for( int i = 0; i < Memo1->Lines->Count; i++)
          Prntr->Canvas->TextOut(
             200,200 + (i *  Prntr->Canvas->TextHeight(Memo1->Lines->Strings[i])),
              Memo1->Lines->Strings[i]);
       Prntr->Canvas->Brush->Color = clBlack;
       Prntr->Canvas->FrameRect(r);
       Prntr->EndDoc();
    }
    cela fonctionne très bien avec un TMemo, mais je n'arrive pas à modifier la ligne en rouge, pour l'adapter à un StringGrid.
    vois-tu comment faire?

  7. #7
    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
    Citation Envoyé par emmental
    cela fonctionne très bien avec un TMemo, mais je n'arrive pas à modifier la ligne en rouge, pour l'adapter à un StringGrid.
    vois-tu comment faire?
    Je l'ai deja fait, mais il faut que je retrouve mon code, je te l'envoie des que j'ai trouvé.

  8. #8
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    merci d'avance à pottiez pour le code qu'il va m'envoyer.

    merci à Mattetfamily, je ne manquerai pas de le recontacter
    quand il rentrera de vacances, si nécessaire.

  9. #9
    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
    voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     //Prntr est mon objet TPrinter
      Prntr->Canvas->Font->Color = clRed ;  //Met la police en rouge
      Prntr->Canvas->Refresh() ;  //Rafraichie le canvas pour etre sur que la propriété rouge est bien pris en compte
             Prntr->Canvas->TextRect(cadreDuText/*Objet TRect*/,posTextLarge,posTextHaut,"Mon texte") ;
    //Ecriture du texte (il sera donc en rouge)
     
      Prntr->Canvas->Font->Color = clWindowText ;  //Remise de la police en couleur text windows standard
      Prntr->Canvas->Refresh() ;  //Toujours pour que le changement soit pris en compte
    J'espere que ca t'ira.
    A plus

  10. #10
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    merci pottiez!

    mais mon problème est que sur mon impression, je n'obtiens pas les lignes verticales et horizontales encadrant chaque cellule...

    en effet, la fonction TextOut n'accepte que du texte:
    Prntr->Canvas->TextOut(int, int, AnsiString)

    et je ne sais lui transmettre que le contenu de mes cellules.

  11. #11
    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
    Citation Envoyé par emmental
    merci pottiez!

    mais mon problème est que sur mon impression, je n'obtiens pas les lignes verticales et horizontales encadrant chaque cellule...

    en effet, la fonction TextOut n'accepte que du texte:
    Prntr->Canvas->TextOut(int, int, AnsiString)

    et je ne sais lui transmettre que le contenu de mes cellules.
    La solution est assez simple, en effet, j'utilise la fonction TextRect() pour inseré du text dans un rectangle donnée, qui est definie par un objet TRect, cela permet que lorsque le texte de la cellule est trop grande pour elle, cela ne déborde pas sur la cellule voisine, de plus grace à ce TRect tu peut tracer un cadre de meme dimention grace à la fonction Rectangle() du Canvas.
    Je ne sais pas si j'ai été très clair, demande moi des prescision si il t'en faut.

  12. #12
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    mon cher pottiez, excuse-moi pour la réponse tardive...

    en fait, je ne réussis pas à utiliser la fonction TextRect()...
    je n'arrive pas à trouver les bons paramètres?

    (je ne vois pas ce que :
    cadreDuText/*Objet TRect*/,posTextLarge,posTextHaut

    veut dire exactement...)
    pourrais-tu me donner un exemple concret?

    et aussi, avec cette méthode, faut-il comprendre qu'il faut dessiner un contour pour chaque cellule de la grille?

  13. #13
    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
    Alors dans la fonction TextRect, le premier parametre est un objet TRect qui defini les coordonnées d'un rectangle dans lequel tu veut mettre ton text, si le texte déborde du rectangle en question le surplus ne sera pas imprimé, le second parametre est la coordonnée X ou tu veut faire débuter ton text par rapport au coin supperieur gauche de ton rectangle, le troisieme parametre est la même chose que le deuxieme mais en Y, ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TPrinter impression ;
    TRect rectangle ;
    rectangle.left = 0 ;
    rectangle.top = 0 ;
    rectangle.right = 100 ;
    rectangle.bottom = 100 ;
    impression.Canvas->Rectangle(rectangle) ;
    impression.Canvas->TextRect(rectangle,5,5,"MonText") ;
    ...
    Ici j'ai un rectangle qui sera situé aux coordonné 0,0 du canvas, (par rapport au coin superieur gauche), de hauteur et de longueur 100, un cadre sera tracé sur les contours de ce rectangle grace a la fonction Rectangle(), et enfin j'aurais un texte situé dans le rectangle, au coordonné 5,5.
    Attention, toujours tracé le cadre avant le texte, pour une reson simple, le cadre est rempli d'un couleur definit par le propriété Brush du canvas, definit sur blanc par défault, si tu ecrit le texte avant de faire tes contour, ton texte sera recouvert du blanc interieur lors de la mise du contour.
    A plus

  14. #14
    Nouveau membre du Club

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    Points : 35
    Points
    35
    Par défaut
    merci beaucoup pottiez

    tes explications mériteraient d'être dans la FAQ, car je suis sûre que beaucoup de gens ont eu le même problème que moi.
    merci d'avoir pris le temps de me répondre

  15. #15
    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
    Citation Envoyé par emmental
    merci beaucoup pottiez

    tes explications mériteraient d'être dans la FAQ, car je suis sûre que beaucoup de gens ont eu le même problème que moi.
    merci d'avoir pris le temps de me répondre
    J'en parlerai aux personne concerné. A plus

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

Discussions similaires

  1. [VB.NET]Comment Imprimer une form
    Par bernard06 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/10/2011, 17h43
  2. Comment Imprimer une zone de texte
    Par Chichou87 dans le forum IHM
    Réponses: 1
    Dernier message: 02/02/2007, 23h06
  3. Comment imprimer une JTable
    Par L4BiN dans le forum Composants
    Réponses: 9
    Dernier message: 03/08/2006, 15h09
  4. Comment imprimer une BDD comme le fait Access
    Par Hamza dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/05/2006, 13h15
  5. Comment imprimer une zone de liste?
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 12/01/2006, 13h24

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