Imprimer un Listview [Résolu]

JermieSG1 5 Messages postés jeudi 1 juillet 2004Date d'inscription 3 juillet 2004 Dernière intervention - 3 juil. 2004 à 07:35 - Dernière réponse : japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention
- 3 juil. 2004 à 21:18
hello ,

j'ai cherché sur différents sites y compris en anglais mais ce que j'ai trouvé ne fonctionne pas chez moi.
Voici ce que j'ai fait:

procedure TLivreJournal.Imprimer1Click(Sender: TObject);
var i: integer;
Text: string;
begin
Printer.BeginDoc;
for i := 0 to Pred(Liste.Items.Count) do
begin
Text := Liste.Items.Item[i].Caption
+Liste.Items.Item[i].SubItems.Text
+Liste.Items.Item[i].SubItems.Text
+Liste.Items.Item[i].SubItems.Text
+Liste.Items.Item[i].SubItems.Text;
Printer.Canvas.TextOut(20, (i * 20) + 20, Text);
end;
Printer.EndDoc;
end;

Je pensais qu'en faisant ce code, ça m'aurait imprimer chaque ligne mais non.

:-(

Merci à tous
Afficher la suite 

6 réponses

Répondre au sujet
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 3 juil. 2004 à 14:48
+3
Utile
Si je comprends bien, tu veux opérer une transposition, c'est à dire imprimer les lignes du TListView en les disposant en colonnes sur l'imprimante ?
Eh bien voici la réponse :
procedure TForm1.btnPrintByColumnClick(Sender: TObject);
var
  Row, Col, XOffset, YOffset, ZOffset: integer;
  Text: string;
begin
  //Décalages pour l'impression
  //XOffset : du bord gauche de la feuille
  XOffset := 50;
  //YOffset : entre chaque ligne
  YOffset := 50;
  
  Printer.BeginDoc;
  with ListView1 do
  begin
    //Parcours de la première colonne du TListView
    for Row := 0 to Items.Count - 1 do
      Text := Text + ' | ' + Items[row].Caption;
    Printer.Canvas.TextOut(XOffset, YOffset, Text);
    //Réinitialiser la variable Text
    Text := EmptyStr;
    //Décaler le point de départ de l'impression
    //verticale pour les lignes qui suivent en ajoutant
    //la hauteur de la première ligne imprimée
    ZOffset := YOffset * 2 + Canvas.TextHeight('gG');
    //Parcours des cellules de droite du TListView
    //en se basant sur le nombre de colonnes de la
    //première ligne
    for Col := 0 to Items[0].SubItems.Count - 1 do
    begin
      //Pour chaque ligne du TListView
      for Row := 0 to Items.Count - 1 do
        Text := Text + ' | ' + Items[Row].SubItems.Strings[Col];

      Printer.Canvas.TextOut(XOffset, ZOffset + YOffset * Col, Text);
      Text := EmptyStr;
    end;
  end;
  Printer.EndDoc;
end;


Le code est un peu plus complexe qu'il n'y paraissait au premier abord :
- il faut gérer le saut de ligne entre l'impression de la première colonne et celles des autres colonnes du TListView.

A+ ;)
May Delphi be with you
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Delphiprog
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 3 juil. 2004 à 09:09
0
Utile
A quelques détails près, ton code devrait fonctionner car "Liste.Items.Item[i].SubItems.Text" renverra toujours la même chaine !
De plus, avec ton code remodelé, j'obtiens des résultats bizarres à l'impression, chaque colonne étant séparée par de petits carrés sur le papier :
procedure TForm1.btnPrintListViewClick(Sender: TObject);
var
  i: integer;
  Text: string;
begin
  Printer.BeginDoc;
  with ListView1 do
    for i := 0 to Pred(Items.Count) do
    begin
      Text := Items[i].Caption + Items[i].SubItems.Text;
      Printer.Canvas.TextOut(50, i * 50 + 50, Text);
    end;
  Printer.EndDoc;
end;


Pour obtenir un contrôle plus fin de l'impression, j'ai donc utilisé une deuxième boucle imbriquée et réalisé ma mise en page perso, nettement plus belle :) :
procedure TForm1.btnPrintListViewClick(Sender: TObject);
var
  i, j: integer;
  Text: string;
begin
  Printer.BeginDoc;
  with ListView1 do
    for i := 0 to Pred(Items.Count) do
    begin
      Text := Items[i].Caption;
      for j := 0 to Pred(Items[i].SubItems.Count) do
        Text := Text + ' | ' + Items[i].SubItems.Strings[j];

      Printer.Canvas.TextOut(50, i * 50 + 50, Text);
    end;
  Printer.EndDoc;
end;


May Delphi be with you
Commenter la réponse de cs_Delphiprog
JermieSG1 5 Messages postés jeudi 1 juillet 2004Date d'inscription 3 juillet 2004 Dernière intervention - 3 juil. 2004 à 10:10
0
Utile
Super merci bcp
mais est-il possible d'imprimer en colonne comme dans la listeview?je sais je suis dur!
Commenter la réponse de JermieSG1
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 3 juil. 2004 à 15:14
0
Utile
Diantre, Delphiprog !

Toujours au top de la forme... >:)

La plupart de tes réponses dans ce forum sont à elles seules un didacticiel complet et mériteraient d'être postées dans la rubrique des codes source afin que le plus grand nombre s'y réfère plus aisément.

C'est autre chose que du bête copier-coller déjà vu 100 fois ici ou ailleurs, c'est sûr.

Et ça apporte beaucoup aux débutants que nous sommes (28,27% aux dernières nouvelles).

Merci. 8-)
Commenter la réponse de japee
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 3 juil. 2004 à 19:42
0
Utile
:blush) Merci Japee , puisse le plus grand nombre t'entendre !
Vois-tu, je n'ai pas l'habitude de jouer de la brosse à reluire mais il me semble que tu ne fais plus partie des débutants.
Et comme tu fais partie des rares personnes sur ce forum à lire l'ensemble des réponses apportées, tu progresses d'autant plus vite.
Il y en a tant qui viennent, posent leur question et ne viennent même pas lire les réponses tant ils sont occupés à inonder les forums avec leurs questions vagues, convaincus qu'ils sont qu'on connait tout de leur problème.

Un didacticiel sur le sujet serait de peu d'intérêt tant la question posée était précise. Je félicite, au passage, JermieSG1 pour avoir posé une question de façon très claire.
Ce qui fait qu'il a obtenu une réponse rapidement à son problème. Si tous pouvaient agir de la même manière que lui, ce serait bien.

Bonnes vacances à tous les deux.

May Delphi be with you
Commenter la réponse de cs_Delphiprog
japee 1792 Messages postés vendredi 27 décembre 2002Date d'inscription 12 novembre 2016 Dernière intervention - 3 juil. 2004 à 21:18
0
Utile
Oui, la fréquentation régulière du forum est un gage certain de progression sur le long chemin qui nous emmènera jusqu'à la maîtrise absolue de Delphi. :big)
Par ailleurs, le fait d'essayer de répondre à une question bien posée, dans la mesure de ses capacités, est extrêmement stimulant et enrichissant.
Et dans l'autre sens, c'est-y pas rassurant, quand on a épuisé toutes ses capacités de réflexion, et toutes les ressources de Google, de savoir que quelqu'un, quelque part, ici par exemple, aura peut-pêtre la solution à ce qui nous tourmente...
Longue vie à ce forum ! :approve)

Et bonnes vacances, Delphiprog ! 8-)

Bonne vacances à ceux qui..., également.
Et n'oubliez pas d'amener avec vous un gros pavé traitant de notre outil de programmation favori, afin de ne pas bronzer idiot, lol.
Ce forum deviendra ainsi le plus "expert" de tout le web. Même les russes, les allemands et les chinois viendront y pomper des sources (... pardon pour le délire). :-p
Commenter la réponse de japee

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.