Imprimer un Listview [Résolu]

Signaler
Messages postés
5
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
3 juillet 2004
-
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
-
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

6 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
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
Messages postés
5
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
3 juillet 2004

Super merci bcp
mais est-il possible d'imprimer en colonne comme dans la listeview?je sais je suis dur!
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
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-)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
: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
Messages postés
1725
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
11 avril 2021
8
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