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
    Membre averti

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    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 exp�riment� Avatar de Mattetfamilly
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    182
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 182
    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
    Expert confirm�

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par d�faut
    Moi personnelement j'ai cod� l'impression tout seul avec l'objet TPrinter.

  4. #4
    Membre averti

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    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
    Expert confirm�

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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
    Membre averti

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    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
    Expert confirm�

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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
    Membre averti

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    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
    Expert confirm�

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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
    Membre averti

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    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
    Expert confirm�

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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
    Membre averti

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    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
    Expert confirm�

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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
    Membre averti

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 31
    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
    Expert confirm�

    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 : 40
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    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