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

Delphi Discussion :

Impression sous delphi


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 6
    Points : 7
    Points
    7
    Par défaut Impression sous delphi
    Bonjour,

    Je viens de découvrir le module d'impression avec delphi. Ca fonctionne pas mal, mais maintenant je souhaiterai imprimer le contenu de mon mémo sur deux colonnes puisque celui ci est trop long. Et dans le cas présent, j'imprime pour le moment sur deux pages. Ce qui n'est pas très économique !!

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TTous_Parametres.Imprimer1Click(Sender: TObject);
    var
        PrintText:System.Text;
        Line:integer;
    begin
        PrinterSetupDialog.Execute;
        Printer.Title:='Tous les paramètres';
        AssignPrn(PrintText);
        Rewrite(PrintText);
        Printer.Canvas.Font:=Memo.Font;
        for line:=0 to memo.Lines.Count-1 do
        Writeln(PrintText,Memo.Lines[line]);
        closefile(PrintText);
    end;

  2. #2
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Ici, tu utilises ton imprimante comme s'il s'agissait d'un fichier texte (en sommes, tu utilises le mode "console" de l'imprimante, analogie faite avec les applications consoles ou applications fenétrées de Delphi).

    Avec cette façon de faire, c'est à toi de faire en sorte de manipuler savamment le writeln et les caractères en sorties.

    Après, tu peux voir l'imprimante sous un aspect différent, il faudrais que tu tire partie du fait que tu puisses utiliser la surface graphique de l'imprimante (son Canvas).

    A partir du moment où tu sais utiliser un TCanvas, et il va falloir que tu passes par cet apprentissage (forum, tutoriels, aide Delphi, etc), l'utilisation de l'imprimante sera très facile et sortir ton texte sur 2 colonnes te semblera beaucoup plus facile

    Pour ce faire, tu dois utiliser l'unité printers :
    et utiliser "l'objet" printer (de type TPrinter) pour effectuer tes impressions.

    voici un exemple tiré de l'aide Delphi :
    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
    22
    procedure TForm1.Button1Click(Sender: TObject);
    var
      r: TRect;
      i: Integer;
    begin
       //utilisation des Largeurs et Hauteur des feuilles de papier (en nbre de pixel),
       //pour définir une zone particulière (un rectangle)
       r := Rect(200,200,(Printer.Pagewidth - 200),(Printer.PageHeight - 200)); 
       Printer.BeginDoc; //Debut de page
       //Canvas représente la surface de dessin (la feuille de papier)
       //Brush, le pinceau que l'on va utiliser pour dessiner dessus
       Printer.Canvas.Brush.Style := bsClear; 
       //impression d'un mémo
       for i := 0 to Memo1.Lines.Count do
          Printer.Canvas.TextOut(200,200 + (i *
                       Printer.Canvas.TextHeight(Memo1.Lines.Strings[i])),
                       Memo1.Lines.Strings[i]);  //impression d'une ligne
       Printer.Canvas.Brush.Color := clBlack;
       Printer.Canvas.FrameRect(r); //Dessin d'un rectangle
       Printer.EndDoc; //Fin du dessin, éjection de la feuille de papier
        end;
    end;
    Canvas possède une méthode TextRect ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextRect(Rect:TRect;X,Y:Integer;constText:string);
    ...qui te permet d'imprimer un texte dans une zone particulière d'un rectangle.

    Pour ton affaire,
    Je te suggère donc de mettre ton imprimante en mode paysage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printer.Orientation:=poLandscape;
    puis de diviser ta feuille en deux zones rectangulaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    var RectGauche, RectDroite:TRect;
    begin
      printer.Orientation:=poLandscape;
      RectGauche:=Rect(0,0,printer.PageWidth div 2,printer.PageHeight);
      RectDroite:=Rect(printer.PageWidth div 2,0,printer.PageWidth,printer.PageHeight);
      printer.BeginDoc;
         //Le code d'impression ira ici
      Printer.EndDoc;
    end;

    Apartir de là, voici une application complête (un memo et un bouton dans une fiche), lorsque l'on clique sur le bouton, le mémo est imprimé sur deux colonnes :
    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
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
    uses printers,ComCtrls, RichEdit,Types;
    {$R *.dfm}
     
    function PrintRTFToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;
                          ARichEdit : TRichEdit; var ARect : TRect;RenderIt:boolean) : Longint;
    var  Range    : TFormatRange;
    begin
        //Précaution
        SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, 0);
     
        if not RenderIt then
        begin
          SetRect(ARect,0,0,ARichEdit.Width,ARichEdit.Height);
        end;
     
        FillChar(Range, SizeOf(TFormatRange), 0);
        Range.hdc        := ACanvas.handle;
        Range.hdcTarget  := ACanvas.Handle;
        Range.rc.left    := ARect.Left * 1440 div ACanvas.font.PixelsPerInch;
        Range.rc.top     := Arect.Top * 1440 div ACanvas.font.PixelsPerInch;
        Range.rc.right   := ARect.Right * 1440 div ACanvas.font.PixelsPerInch;
        Range.rc.Bottom  := ARect.Bottom * 1440 div ACanvas.font.PixelsPerInch;
        Range.chrg.cpMax := ToChar;
        Range.chrg.cpMin := FromChar;
        if RenderIt
        then Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 1, Longint(@Range))
        else begin
               Range.chrg.cpMax := ARichedit.GetTextLen;
               Result := SendMessage(ARichedit.Handle, EM_FORMATRANGE, 0, Longint(@Range));
               ARect:=Range.rc;
               ARect.Bottom  := Range.rc.Bottom * Screen.PixelsPerInch div 1440;
             end;
       SendMessage(ARichEdit.handle, EM_FORMATRANGE, 0,0);
    end;
     
    function PrintTextToCanvas(ACanvas : TCanvas; FromChar, ToChar : integer;
                          Text : TStrings; var ARect : TRect;RenderIt:boolean) : Longint;
    var ARichEdit:TRichEdit;
        AHandle:HWND;
        RelRect:TRect;
    begin
     
      ARichEdit:=TRichEdit.Create(nil);
      try
      finally
        ARichEdit.Visible := False;
        ARichEdit.Parent := Application.MainForm;
     
        ARichEdit.Width:=round((ARect.Right-ARect.Left)*ARichEdit.Font.PixelsPerInch/ACanvas.Font.PixelsPerInch);
        ARichEdit.Height:=round((ARect.Bottom-ARect.Top)*ARichEdit.Font.PixelsPerInch/ACanvas.Font.PixelsPerInch);
        ARichEdit.Lines:=Text;
        result:=PrintRTFToCanvas(ACanvas,FromChar,ToChar,ARichEdit,ARect,RenderIt);
        ARichEdit.Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var RectGauche, RectDroite,CurrentRect:TRect;
        i,x,y:integer;
        FaireGauche:boolean;
        FromChar, ToChar : integer;
        marge:integer;
    begin
      printer.Orientation:=poLandscape;
      marge:=round(printer.PageWidth/50);
      RectGauche:=Rect(marge,marge,(printer.PageWidth div 2)-marge,(printer.PageHeight)-marge);
      RectDroite:=Rect((printer.PageWidth div 2)+marge,marge,printer.PageWidth-marge,printer.PageHeight-marge);
     
      FaireGauche:=true;
      printer.BeginDoc;
      printer.Canvas.Brush.Style:=bsClear;
      Printer.Canvas.Brush.Color := clBlack;
     
      i:=0;
      FromChar:=0;
      while FromChar<Length(memo1.Lines.Text) do
      begin
        if FaireGauche then CurrentRect:=RectGauche else CurrentRect:=RectDroite;
        Tochar:=-1;
        ToChar:=PrintTextToCanvas(printer.Canvas,FromChar,ToChar,memo1.Lines,CurrentRect,True);
        Printer.Canvas.FrameRect(CurrentRect);
        FromChar:=ToChar;
        if odd(i) then printer.NewPage;
        FaireGauche:=not FaireGauche;
        inc(i);
      end;
      printer.EndDoc;
    end;
     
    end.

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

Discussions similaires

  1. Concepteur RAVE sous DELPHI 7 : aperçu avant impression
    Par tarbala dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/06/2020, 00h37
  2. Problème d'impression avec QuickReport sous Delphi
    Par abdenour-nab dans le forum Bases de données
    Réponses: 2
    Dernier message: 31/12/2008, 10h28
  3. Impression d'une image bitmap sous Delphi
    Par ninaleo dans le forum Langage
    Réponses: 5
    Dernier message: 30/11/2008, 12h41
  4. Impression d'etat Crystal Reports sous Delphi
    Par benjer dans le forum Delphi
    Réponses: 6
    Dernier message: 24/04/2007, 18h16
  5. Impression sous delphi
    Par vodasan dans le forum Delphi
    Réponses: 4
    Dernier message: 29/11/2006, 12h16

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