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 :

[PageSetupDialog] Utilisation directe


Sujet :

Delphi

  1. #1
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut [PageSetupDialog] Utilisation directe
    Bonjour,

    Je n'avais encore jamais utilisé le TPageSetupDialog et là ce fut l'occasion.

    Mais je dois systématiquement louper une marche car malgré mes recherches, ça ne prend toujours pas en compte les marges

    Par exemple un bout de code dans lequel deux paramètres saisis dans le PageSetupDialog ne sont aucunement prise en compte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.btnPrintPSDClick(Sender: TObject);
    begin
       PageSetupDialog1.Execute;
       with Printer do
       begin
         BeginDoc;
         Canvas.TextOut(PageSetupDialog1.MarginLeft, PageSetupDialog1.MarginTop, 'Ici mon texte à imprimer...');
         EndDoc;
       end;
    end;
    Je pensais qu'un simple appel à la méthode Exécute du PageSetupDialog suffirait afin de régler tout ça.
    D'ailleurs pas grand chose en documentation sur ce compo, encore bien moins en code.

    Je suis prenneur de tout conseil, merci ;-)

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 169
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 169
    Par défaut
    Salut, le droïde !

    As-tu pensé à mettre psoMargins à True ? Des fois que... (jamais joué avec ça, mais on sait jamais...).
    D'ailleurs pas grand chose en documentation sur ce compo
    Ben, F1 est ton ami, non ?

    À pluche !
    --
    jp

  3. #3
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Bonjour,

    Hi jp, je te remercie de venir tenter de m'aider

    Non, je n'avais pas eu l'idée de jouer aux booléens dans l'Options des propriétés de ce compo, mais après coup, ça ne change rien du tout, sauf que ça empêche de lancer la boîte de dialogue en question.

    Comme toi je n'avais encore joué avec cette boîte, je fonçais dedans les yeux fermés, mais je me retrouve comme un bleu et tout honteux devant cet obstacle d'apparence fastoche

    Par contre j'ai à plusieurs reprises pensé au F1 via la selection de ce mot clé, mais rien en exemple ni qui ne puisse me mettre sur le bon chemin.

    Rien non plus sur des tas de forums et sites spécialisés de tous pays.
    Je me demande si je ne suis pas le seul à avoir eu l'envie d'adjoindre ce compo à cette appli

    Ou bien si ma multifonction ne gère les marges issues de ce compo...

    @ pluche

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 169
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 169
    Par défaut
    Yep !

    Désolé...

    En plus, doit y avoir un bug dans ce truc, car si je change dans l'inspecteur d'objets la propriété Units de pmDefault à pmMillimeters, ben la boîte de dialogue s'affiche plus...
    Pour qu'elle s'affiche avec les millimètres, faut que je lui dise "pmInches", si si !
    (puisque par défaut elle s'affiche avec les inches)

    Tu le crois, toi, des trucs pareils...

    Et en prime, y a rien qui s'imprime, même si mon imprimante se réveille et avale la feuille...
    --
    jp

  5. #5
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    yep2,

    Oufffff jp, tu me rassures un max, je pensais que mon âge à sucrer les fraises était déjà arrivé !

    Curieux en effet ; ce compo et très déboussolant

    Je vais rechercher un topic dans lequel un forumeur indiquait un autre compo équivalent, enfin... en mieux

    @+

  6. #6
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Je viens de tenter d'installer un compo similaires, le PageSetup :

    http://www.torry.net/quicksearchd.ph...etup&Title=Yes
    http://www.programmersheaven.com/dow...0/ZipView.aspx
    http://www.programmersheaven.com/dow...pFileList.aspx

    Heuuuu.... j'ai une erreur de compil' d'install de ce compo, il manque la déclaration d'une variable et vu que ce compo date de Windows 95...

    Je pense rebrousser chemin ou temporiser.

    @+

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 169
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 169
    Par défaut
    En fait, c'est beaucoup plus compliqué qu'on pense, le Droïde !

    J'ai fait la manip suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Canvas.TextOut(100, 200, 'Ici mon texte à imprimer...');
    et le texte s'est imprimé à environ 8 mm du bord gauche et à environ 17 mm du haut de la feuille (mesure faite sur le bas du 'I').
    Ensuite j'ai fait, avec le compo que j'ai réussi à faire fonctionner (2-3 modifs de rien du tout),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if psd.Execute then
      ShowMessage(IntToStr(psd.MarginLeft) + '  ' + IntToStr(psd.MarginLeft));
    je n'ai pas changé les valeurs proposées par défaut (25 mm partout) et j'ai vu s'afficher 2500 2500 (le compo cause en centièmes de mm).
    J'en conclus que si on utilise ces valeurs, ça imprime, mais au-delà de la feuille,

    J'ai enfin fait un dernier test en modifiant les marges, que j'ai passées à 5 mm en haut et à gauche : ShowMessage me dit "500 500", normal, et le texte s'est imprimé à environ 2,5 cm du bord gauche et 2,9 d'en haut (j'ai environ 4 mm de marge supérieure "hardware" sur ma laser).

    Il me semble me souvenir que l'impression est grandement tributaire de choses très compliquées, j'ai retrouvé ça dans un vieux truc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       with Printer do begin
         XScale := GetDeviceCaps(Printer.Handle, LogPixelsX) div Self.PixelsPerInch;
         YScale := GetDeviceCaps(Printer.Handle, LogPixelsY) div Self.PixelsPerInch;
    Je ne te mets pas le reste, c'est terriblement lié au truc en question...

    Valà !
    Bon courage, Google est ton ami !
    --
    jp

  8. #8
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    jp,

    Tu disais :
    J'ai enfin fait un dernier test en modifiant les marges, que j'ai passées à 5 mm en haut et à gauche : ShowMessage me dit "500 500", normal, et le texte s'est imprimé à environ 2,5 cm du bord gauche et 2,9 d'en haut
    Purée, c'est bien vRRai ça !

    Oui en effet, j'avais pensé au ShowMessage pour visualiser le retour des variables Integer de marges, mais je me suis dit : bofff...

    J'ai vu sur le Web un code ayant peut-être un rapport avec la correction de ce compo, je vais retourner voir avec un nouveau regard.
    (J'en reviens et manque de bol, pas pour Delphi, mais pour le VB)

    Tu disais aussi... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XScale := GetDeviceCaps(Printer.Handle, LogPixelsX) div Self.PixelsPerInch;
    Vi vi, je connais bien ça et le tuto d'un membre de ce forum
    http://alphomega.developpez.com/imprimer/?page=page_4

    Mais tu penses à ce que je pense : de bidouiller le source de ce compo ?

    @+ et merci encore de ton aide.

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 169
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 169
    Par défaut
    pas pour Delphi, mais pour le VB
    Fais voir quand même...

    Sinon, les modifs que je lui ai faites :
    1. le renommer en TPageSetupDialog2 pour éviter la grouille ;
    2. changer hInstance := System.HInstance; en hInstance := Sysinit.HInstance; 2 fois ;
    3. interdire la proc "Register" comme ça je suis tranquille et dans FormCreate : psd := TPageSetupDialog2.Create(self);


    Quant à bidouiller dans le compo, ou bidouiller les retours du compo, de toute façon va falloir bidouiller !
    Et donc trouver les infos qui vont bien, à propos de ces histoires de Scale...

    Bon courage !
    --
    jp

    [Edit] Je viens de voir le lien que tu cites, il en cite un autre que je trouve plus simple. À toi de voir... [/edit]

  10. #10
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Vi vi jp , je crois avoir en gros pigé, d'ailleurs je pensais simplement qu'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.btnPrintPSDClick(Sender: TObject);
    begin
      if PageSetupDialog1.Execute then
       with Printer do
       begin
         BeginDoc;
         Canvas.TextOut(PageSetupDialog1.MarginLeft - 20, PageSetupDialog1.MarginTop - 20, RichEdit1.Text);
         EndDoc;
       end;
    end;
    Moins 20 pour combler la différence en question, mais à ce niveau ça ne passe pas, mais par contre cette zone prend d'une certaine façon la valeur des Integers, car si je ne place pas par exemple PageSetupDialog1.MarginTop, hé bien le printage commence tout au bord de la page.

    Je vais approfondir tout ça en effet, mais tu m'as mis sur la bonne voie.

    @+ merci

  11. #11
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Yop !

    A ce niveau, par contre ça passe, mais attention la pureté du 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 TForm1.btnPrintPSDClick(Sender: TObject);
    begin
      if PageSetupDialog1.Execute then
       with Printer do
       begin
         BeginDoc;
     
         PageSetupDialog1.MarginLeft := PageSetupDialog1.MarginLeft - 254*2;
         PageSetupDialog1.MarginTop := PageSetupDialog1.MarginTop - 254*2;
     
         Canvas.TextOut(PageSetupDialog1.MarginLeft, PageSetupDialog1.MarginTop, RichEdit1.Text);
         EndDoc;
       end;
    end;
    Sans parler de la précision, ni du retour d'affichage dans la boîte ; mais c'est une avancée.

    @+

    Encore du code parallèle instructif :
    http://www.delphicorner.f9.co.uk/articles/misc13.htm

  12. #12
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Bonjour

    J'avance à petits pas, voici de l'amélioration, la perfection n'est pas encore au rendez-vous

    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
    procedure TForm1.btnPrintPSDClick(Sender: TObject);
    var
      XPixelsParPouce, YPixelsParPouce, LeftSpace, TopSpace,
    //  NonImprimableHorizPixelsX, NonImprimableVertiPixelsY,
      SaisieLeft, SaisieTop, Millimetres2PixelsX, Millimetres2PixelsY,
      Millims: Integer;
    begin
      if PageSetupDialog1.Execute then
         with Printer do
         begin
           BeginDoc;
     
           // Mise sous variable des Edits de saisie du compo
           SaisieLeft := PageSetupDialog1.MarginLeft;
           SaisieTop  := PageSetupDialog1.MarginTop;
           SaisieLeft := Trunc(SaisieLeft / 2.54); // en millimètres
           SaisieTop  := Trunc(SaisieTop  / 2.54); // idem
     
           // Pour obtenir le nombre de pixels par pouce pour l'imrimante, nous écrirons donc:
           XPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
           YPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
     
           // Pour obtenir les zonnes non imprimables = les marges...
           LeftSpace := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
           TopSpace  := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
    LeftSpace := Trunc(LeftSpace * 25.4);
    TopSpace  := Trunc(TopSpace *  25.4);
     
           // Transformer millimètres en pixels reconnus par notre imprimante:
           Millimetres2PixelsX := Trunc(Millims / (25.4 / XPixelsParPouce));
           Millimetres2PixelsY := Trunc(Millims / (25.4 / YPixelsParPouce));
     
     
           // Pour terminer, disposition précise pour imprimer en millimètres
           Canvas.TextOut(SaisieLeft - LeftSpace,
    	                    SaisieTop  - TopSpace,
    	                    Memo1.Text);
     
    ShowMessage('Saisie Top = '+ IntToStr(SaisieTop));
    ShowMessage('Space Top = '+ IntToStr(TopSpace));
    //ShowMessage('Millimètres Y... = '+ IntToStr(Millimetres2PixelsY));
     
           EndDoc;
         end;
    end;
    Que les puristes évitent de hurler

    La semaine suivante je vais avoir plus de temps à y consacrer, mais là je ne fais que passer.

    @+

  13. #13
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut Petit à petit...
    Bonsoir,

    Et voici une belle avancée :

    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
    function TForm1.Millimetres2PixelsX(Millims: integer): integer;
    begin
      result := Trunc(Millims / (25.4 / XPixelsParPouce));
    end;
     
     
    function TForm1.Millimetres2PixelsY(Millims: integer): integer;
    begin
      result := Trunc(Millims / (25.4 / YPixelsParPouce));
    end;
     
     
    procedure TForm1.btnPrintPSDClick(Sender: TObject);
    var
      LeftSpace, TopSpace, LeftSaisie, TopSaisie: Integer;
    begin
      if PageSetupDialog1.Execute then
         with Printer do
         begin
           BeginDoc;
     
           // Mise sous variables des Edits de saisie du compo
           LeftSaisie := PageSetupDialog1.MarginLeft;
           TopSaisie  := PageSetupDialog1.MarginTop;
     
           // Adaptation sortie des edits de saisie du compo...
           LeftSaisie := LeftSaisie DIV 100; // Convertir en millimètres
           TopSaisie  := TopSaisie  DIV 100; // Convertir en millimètres
     
           // Nombre de pixels par pouce pour l'imrimante
           XPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
           YPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
     
           // Obtenir les zones non imprimables = les marges...
           LeftSpace := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
           TopSpace  := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
     
           // Pour terminer, disposition précise pour imprimer en millimètres :
           Canvas.TextOut(Millimetres2PixelsX(LeftSaisie) - LeftSpace,
    	                    Millimetres2PixelsY(TopSaisie)  - TopSpace,
    	                    'Merci à Jean-Luc Mellet (Alphomega) de son super tuto !');
     
    //ShowMessage('TopSaisie = '+ IntToStr(TopSaisie));
    //ShowMessage('LeftSaisie = '+ IntToStr(LeftSaisie));
    //ShowMessage('Space Top = '+ IntToStr(TopSpace));
    //ShowMessage('Millimètres Y... = '+ IntToStr(Millimetres2PixelsY(TopSaisie)));
     
           EndDoc;
         end;
    end;
    Restera ensuite de compléter les marges de droite et du dessous...

    @+

  14. #14
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut Autre piste...
    Bonjour,

    Dites-moi si je me trompe, mais pas possible d'affecter des marges à droite et au dessous en utilisant la méthode Canvas.TextOut() ?

    Cela est seulement possible sur la marge gauche et le haut de page ; et non les quatre marges périphériques.

    Si seulement le PageHeight et PageWidth n'étaient pas en lecture seule

    Je me penche alors vers la méthode TRect dont je ne la maîtrise pas encore.

    J'ai bidouillé et mixé différentes sources de code, dont celle de Hnimsgern :

    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
         // Conversion X mm en pixels pour impression
    function TForm1.XmmToPixels(mm: integer):integer;
    var
      XPixelsParPouce, XMargeEnPixels: integer;
    begin
      XPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
      XMargeEnPixels  := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
     
      result          := Trunc(mm*XPixelsParPouce/25.4-XMargeEnPixels);
    end;
     
                // Conversion Y mm en pixels pour impression
    function TForm1.YmmToPixels(mm: integer):integer;
    var
      YPixelsParPouce, YMargeEnPixels: integer;
    begin
      YPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
      YMargeEnPixels  := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);
     
      result          := Trunc(mm*YPixelsParPouce/25.4-YMargeEnPixels);
    end;
     
     
    procedure TForm1.btnPrintClick(Sender: TObject);
    var
      PageRect: TRect;
    begin
      PrintRichEdit(RichEdit1, RichEdit1.PageRect);
    end;
     
     
    procedure TForm1.PrintRichEdit(re: TRichEdit; PageRect: TRect);
    var
      ScaleX, ScaleY,
      XPixelsParPouce, YPixelsParPouce, MargeX, MargeY,
      LeftSpace, TopSpace,
      LeftSaisie, TopSaisie, RightSaisie, BottomSaisie: Integer;
    begin
      if PageSetupDialog1.Execute then
         with Printer do
         begin
     
           BeginDoc;
     
           // Mise sous variables des Edits de saisie du compo
           LeftSaisie   := PageSetupDialog1.MarginLeft;
           TopSaisie    := PageSetupDialog1.MarginTop;
           RightSaisie  := PageSetupDialog1.MinMarginRight;
           BottomSaisie := PageSetupDialog1.MinMarginBottom;
     
           // Adaptation sortie des edits de saisie du compo...
           LeftSaisie   := LeftSaisie   DIV 100;  // Convertir en millimètres
           TopSaisie    := TopSaisie    DIV 100;
           RightSaisie  := RightSaisie  DIV 100;
           BottomSaisie := BottomSaisie DIV 100;
     
           // Nombre de pixels par pouce pour l'imrimante
           XPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSX);
           YPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSY);
     
           // Obtenir les zones non imprimables = les marges...
           LeftSpace := GetDeviceCaps(Handle, PHYSICALOFFSETX);
           TopSpace  := GetDeviceCaps(Handle, PHYSICALOFFSETY); 
     
           PageRect.Left   := XmmToPixels(PageRect.Left);
           PageRect.Top    := YmmToPixels(PageRect.Top);
           PageRect.Right  := XmmToPixels(PageRect.Right);
           PageRect.Bottom := YmmToPixels(PageRect.Bottom);
     
           PrintRichEdit(RichEdit1, PageRect);
     
           Printer.EndDoc;
     
         //ShowMessage('Marge X '+ (IntToStr(MargeX)));
       end;
    end;
    Ce code plante un peu et n'imprime rien

    Si vous pouviez m'aider à faire avancer ce code sur cette base, ce serait super.

    J'avais aussi testé ce code :
    http://www.delphipages.com/threads/t...37904&G=137899
    mais ça prend aucunement en compte la saisie en PageSetupDialog. Pourtant nous ne devrions pas en être loin...

    Suis-je sur une bonne piste ?

    Merci d'avance.

  15. #15
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 169
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 169
    Par défaut
    Yep !
    Ce code plante un peu et n'imprime rien
    Un peu normal, mon neveu ! Tu n'as que des valeurs négatives, là : (ShowMessage est ton ami mais tu l'as oublié, )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           PageRect.Left   := XmmToPixels(PageRect.Left);
           PageRect.Top    := YmmToPixels(PageRect.Top);
           PageRect.Right  := XmmToPixels(PageRect.Right);
           PageRect.Bottom := YmmToPixels(PageRect.Bottom);
    Ça ira beaucoup mieux comme ça (pour les deux premières lignes -- j'ai pas encore fait le reste -- c'est au cas où tu repasserais par ici) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //       PageRect.Left   := XmmToPixels(PageRect.Left);
    //       PageRect.Top    := YmmToPixels(PageRect.Top);
           PageRect.Left   := XmmToPixels(LeftSpace);
           PageRect.Top    := YmmToPixels(TopSpace);
    Explikazione : les 4 valeurs de ton PageRect sont à 0 puisque tu n'y a encore rien mis quand tu appelles tes conversions, et dans les conversions, 0 * truc divisé par machin - qqchse = 0 - qqchse = - qqchse !

    @ pluche,
    --
    jp

  16. #16
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 169
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 169
    Par défaut
    Bon, voilà, ça imprime avec les marges correctement positionnées.
    Maintenant, faudrait jouer avec un Memo pour voir si ça fonctionne aussi.
    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
    procedure TForm1.btnPrintClick(Sender: TObject);
    begin
      PrintRichEdit(RichEdit1);
    end;
     
    procedure TForm1.PrintRichEdit(re: TRichEdit);
    var
      XPixelsParPouce, YPixelsParPouce,
      //LeftSpace, TopSpace, RightSpace, BottomSpace, RightEnd, BottomEnd,
      HauteurPage, LargeurPage, HauteurDoc, LargeurDoc,
      LeftSaisie, TopSaisie, RightSaisie, BottomSaisie: Integer;
      R: TRect;
     
      function XPixels2MM(pix: integer): integer;
      begin
        Result := trunc( pix / XPixelsParPouce * 25.4);
      end;
      function YPixels2MM(pix: integer): integer;
      begin
        Result := trunc( pix / YPixelsParPouce * 25.4);
      end;
     
    begin
      if PageSetupDialog1.Execute then
         with Printer do
         begin
           // Mise sous variables des Edits de saisie du compo
           LeftSaisie   := PageSetupDialog1.MarginLeft;
           TopSaisie    := PageSetupDialog1.MarginTop;
    //??       RightSaisie  := PageSetupDialog1.MinMarginRight;
    //??       BottomSaisie := PageSetupDialog1.MinMarginBottom;
           RightSaisie  := PageSetupDialog1.MarginRight;
           BottomSaisie := PageSetupDialog1.MarginBottom;
     
           // Adaptation sortie des edits de saisie du compo...
           LeftSaisie   := LeftSaisie   DIV 100;  // Convertir en millimètres
           TopSaisie    := TopSaisie    DIV 100;
           RightSaisie  := RightSaisie  DIV 100;
           BottomSaisie := BottomSaisie DIV 100;
     
           // Nombre de pixels par pouce pour l'imprimante
           XPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSX);
           YPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSY);
     
           // Obtenir les zones non imprimables = les marges...
           // Inutile, sauf si on veut contrôler que la saisie du user est valide
           //LeftSpace   := GetDeviceCaps(Handle, PHYSICALOFFSETX);
           //TopSpace    := GetDeviceCaps(Handle, PHYSICALOFFSETY);
           //RightSpace  := GetDeviceCaps(Handle, PHYSICALWIDTH) - LeftSpace - GetDeviceCaps(Handle, HORZRES);
           //BottomSpace := GetDeviceCaps(Handle, PHYSICALHEIGHT) - TopSpace - GetDeviceCaps(Handle, VERTRES);
           //RightEnd  := GetDeviceCaps(Handle, PHYSICALWIDTH) - RightSpace;
           //BottomEnd := GetDeviceCaps(Handle, PHYSICALHEIGHT)- BottomSpace;
     
           HauteurPage := YPixels2MM(GetDeviceCaps(Handle, PHYSICALHEIGHT));
           LargeurPage := XPixels2MM(GetDeviceCaps(Handle, PHYSICALWIDTH));
     
           HauteurDoc := HauteurPage - TopSaisie - BottomSaisie;
           LargeurDoc := LargeurPage - LeftSaisie - RightSaisie;
     
           R.Left   := XmmToPixels(LeftSaisie);
           R.Top    := YmmToPixels(TopSaisie);
           R.Right  := XmmToPixels(LeftSaisie + LargeurDoc);
           R.Bottom := YmmToPixels(TopSaisie  + HauteurDoc);
    {ShowMessage('R.Left   ' + (IntToStr(R.Left))  + '  ' +
                'R.Top    ' + (IntToStr(R.Top))   + '  ' +
                'R.Right  ' + (IntToStr(R.Right)) + '  ' +
                'R.Bottom ' + (IntToStr(R.Bottom)));        }
     
            RichEdit1.PageRect := R;
     
    // Imprime, donc penser à copier/coller du texte dans RichEdit1, avant de cliquer !
            RichEdit1.Print('');
       end;
    end;
    Je te laisse tester,
    Tchô,
    --
    jp

  17. #17
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut Que la lumière soit...
    Bonjour,

    jp disait :
    Un peu normal, mon neveu !
    Oui tonton

    Tiens, regarde une peu la procédure ci-dessous et confie-nous ta pensée :

    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
    procedure TForm1.btnPrintClick(Sender: TObject);
    var
      LeftSaisie, TopSaisie, RightSaisie, BottomSaisie,
      Loff, TOff, ROff, BOff, XRes, YRes, XOffs, YOffs : integer;
    begin
      if PageSetupDialog1.Execute then
        with Printer do
        begin
     
          // Mise sous variables des Edits de saisie du compo
          LeftSaisie   := PageSetupDialog1.MarginLeft;
          TopSaisie    := PageSetupDialog1.MarginTop;
          RightSaisie  := PageSetupDialog1.MinMarginRight;
          BottomSaisie := PageSetupDialog1.MinMarginBottom;
     
          // Adaptation sortie des edits de saisie du compo...
          LeftSaisie   := LeftSaisie   DIV 100;  // Convertir en millimètres
          TopSaisie    := TopSaisie    DIV 100;
          RightSaisie  := RightSaisie  DIV 100;
          BottomSaisie := BottomSaisie DIV 100;
     
          LOff := LeftSaisie;
          TOff := TopSaisie;
          ROff := RightSaisie;
          BOff := BottomSaisie;
     
          { Get printer data }
          XOffs := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX ); { minimum Left offset }
          YOffs := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY ); { minimum Top offset }
          XRes := GetDeviceCaps(Printer.Handle, LOGPIXELSX); { points per inch in X }
          YRes := GetDeviceCaps(Printer.Handle, LOGPIXELSY); { points per inch in Y }
     
          { Change Your values to printer Units }
          LOff := Round(LOff*XRes/25.4)-XOffs; { of course You can't set margins less than min offset !!! }
          TOff := Round(TOff*YRes/25.4)-YOffs; { of course You can't set margins less than min offset !!! }
          ROff := 2490-Round(ROff*XRes/25.4)-XOffs; { changing to width, not offset !!!}
          BOff := 3510-Round(BOff*YRes/25.4)-YOffs; { changing to height, not offset !!!}
     
          { print RichEdit }
          RichEdit1.PageRect := Rect( LOff, TOff, ROff, BOff );
          RichEdit1.Print('');
        end;
    end;
    http://www.experts-exchange.com/Prog..._10025529.html
    (Voir réponse vers bas de page)
    Merci aussi à Mirek !

    Bon, je test à fond avant de taguer "Résolu"

    @ pluche

  18. #18
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bon, voilà, ça imprime avec les marges correctement positionnées.
    Maintenant, faudrait jouer avec un Memo pour voir si ça fonctionne aussi.
    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
    procedure TForm1.btnPrintClick(Sender: TObject);
    begin
      PrintRichEdit(RichEdit1);
    end;
     
    procedure TForm1.PrintRichEdit(re: TRichEdit);
    var
      XPixelsParPouce, YPixelsParPouce,
      //LeftSpace, TopSpace, RightSpace, BottomSpace, RightEnd, BottomEnd,
      HauteurPage, LargeurPage, HauteurDoc, LargeurDoc,
      LeftSaisie, TopSaisie, RightSaisie, BottomSaisie: Integer;
      R: TRect;
     
      function XPixels2MM(pix: integer): integer;
      begin
        Result := trunc( pix / XPixelsParPouce * 25.4);
      end;
      function YPixels2MM(pix: integer): integer;
      begin
        Result := trunc( pix / YPixelsParPouce * 25.4);
      end;
     
    begin
      if PageSetupDialog1.Execute then
         with Printer do
         begin
           // Mise sous variables des Edits de saisie du compo
           LeftSaisie   := PageSetupDialog1.MarginLeft;
           TopSaisie    := PageSetupDialog1.MarginTop;
    //??       RightSaisie  := PageSetupDialog1.MinMarginRight;
    //??       BottomSaisie := PageSetupDialog1.MinMarginBottom;
           RightSaisie  := PageSetupDialog1.MarginRight;
           BottomSaisie := PageSetupDialog1.MarginBottom;
     
           // Adaptation sortie des edits de saisie du compo...
           LeftSaisie   := LeftSaisie   DIV 100;  // Convertir en millimètres
           TopSaisie    := TopSaisie    DIV 100;
           RightSaisie  := RightSaisie  DIV 100;
           BottomSaisie := BottomSaisie DIV 100;
     
           // Nombre de pixels par pouce pour l'imprimante
           XPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSX);
           YPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSY);
     
           // Obtenir les zones non imprimables = les marges...
           // Inutile, sauf si on veut contrôler que la saisie du user est valide
           //LeftSpace   := GetDeviceCaps(Handle, PHYSICALOFFSETX);
           //TopSpace    := GetDeviceCaps(Handle, PHYSICALOFFSETY);
           //RightSpace  := GetDeviceCaps(Handle, PHYSICALWIDTH) - LeftSpace - GetDeviceCaps(Handle, HORZRES);
           //BottomSpace := GetDeviceCaps(Handle, PHYSICALHEIGHT) - TopSpace - GetDeviceCaps(Handle, VERTRES);
           //RightEnd  := GetDeviceCaps(Handle, PHYSICALWIDTH) - RightSpace;
           //BottomEnd := GetDeviceCaps(Handle, PHYSICALHEIGHT)- BottomSpace;
     
           HauteurPage := YPixels2MM(GetDeviceCaps(Handle, PHYSICALHEIGHT));
           LargeurPage := XPixels2MM(GetDeviceCaps(Handle, PHYSICALWIDTH));
     
           HauteurDoc := HauteurPage - TopSaisie - BottomSaisie;
           LargeurDoc := LargeurPage - LeftSaisie - RightSaisie;
     
           R.Left   := XmmToPixels(LeftSaisie);
           R.Top    := YmmToPixels(TopSaisie);
           R.Right  := XmmToPixels(LeftSaisie + LargeurDoc);
           R.Bottom := YmmToPixels(TopSaisie  + HauteurDoc);
    {ShowMessage('R.Left   ' + (IntToStr(R.Left))  + '  ' +
                'R.Top    ' + (IntToStr(R.Top))   + '  ' +
                'R.Right  ' + (IntToStr(R.Right)) + '  ' +
                'R.Bottom ' + (IntToStr(R.Bottom)));        }
     
            RichEdit1.PageRect := R;
     
    // Imprime, donc penser à copier/coller du texte dans RichEdit1, avant de cliquer !
            RichEdit1.Print('');
       end;
    end;
    Je te laisse tester,
    Tchô,
    --
    jp

    jp, tu sais quoi ?

    Bin je n'avais pas vu cette dernière réponse !

    En effet, ce nouveau message était disposé au tout début d'une nouvelle page de ce thread, honte à moi

    Whaouu !!! super ta rectif

    je suis gâté alors, je vais avoir le choix, je teste a fond ce code aussi alors.

    Merci @pluche

  19. #19
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 169
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 169
    Par défaut
    Yep !

    Bon, je test à fond avant de taguer "Résolu"
    Calme, calme, y a encore un ch'tit souci :
    j'ai fait un test en copiant/collant un bête texte dans le richedit, et à l'impression, du fait des marges gauche et droite importantes, le texte sur les lignes longues est renvoyé automatiquement à la ligne suivante, pas glop.
    Et faudrait gérer le multi-page, que mon texte devait sûrement en occuper plus d'une et que l'impression s'est gentiment arrêtée après la première, sans message sans rien, comme si c'était normal.

    On est encore loin de Word,

    regarde une peu la procédure ci-dessous et confie-nous ta pensée
    Pas le temps, , pas plus que celui pour tester le lien E-E (en plus que chez eux, bien souvent les réponses sont graphiquement gribouillées et donc illisibles, depuis quelque temps, et donc quand l'ami Google me montre des liens chez eux, ben j'y vais plus... )

    --
    jp

  20. #20
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut Et la lumière fut ; enfin presque...
    Yep yep jp,

    T'embête plus avec ma bidouille à la noix, un truc à rendre fou ou folle suivant les cas

    Mirek, pas ton copain alors

    En tous les cas, aussi grâce à toi j'en apprends tout le temps, merci encore.

    Affaire presque résolue, puisque je ne pige pas trop pour quelle raison la marge de droite reste bloquée vers les 105 millimètres.

    Je recolle le code en question :

    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
    procedure TForm1.btnPrintClick(Sender: TObject);
    var
      LeftSaisie, TopSaisie, RightSaisie, BottomSaisie,
      Loff, TOff, ROff, BOff, XRes, YRes, XOffs, YOffs : integer;
    begin
      if PageSetupDialog1.Execute then
        with Printer do
        begin
     
          // Mise sous variables des Edits de saisie du compo
          LeftSaisie   := PageSetupDialog1.MarginLeft;
          TopSaisie    := PageSetupDialog1.MarginTop;
          RightSaisie  := PageSetupDialog1.MinMarginRight;
          BottomSaisie := PageSetupDialog1.MinMarginBottom;
     
          // Adaptation sortie des edits de saisie du compo...
          LeftSaisie   := LeftSaisie   DIV 100;  // Convertir en millimètres
          TopSaisie    := TopSaisie    DIV 100;
          RightSaisie  := RightSaisie  DIV 100;
          BottomSaisie := BottomSaisie DIV 100;
     
          LOff := LeftSaisie;
          TOff := TopSaisie;
          ROff := RightSaisie;
          BOff := BottomSaisie;
     
          { Get printer data }
          XOffs := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX ); { minimum Left offset }
          YOffs := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY ); { minimum Top offset }
          XRes := GetDeviceCaps(Printer.Handle, LOGPIXELSX); { points per inch in X }
          YRes := GetDeviceCaps(Printer.Handle, LOGPIXELSY); { points per inch in Y }
     
          { Change Your values to printer Units }
          LOff := Round(LOff*XRes/25.4)-XOffs; { of course You can't set margins less than min offset !!! }
          TOff := Round(TOff*YRes/25.4)-YOffs; { of course You can't set margins less than min offset !!! }
          ROff := 2490-Round(ROff*XRes/25.4)-XOffs; { changing to width, not offset !!!}
          BOff := 3510-Round(BOff*YRes/25.4)-YOffs; { changing to height, not offset !!!}
     
          { print RichEdit }
          RichEdit1.PageRect := Rect( LOff, TOff, ROff, BOff );
          RichEdit1.Print('');
        end;
    end;
    @ pluche

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Utilisation directe de la couche IP
    Par Mindiell dans le forum Développement
    Réponses: 15
    Dernier message: 23/02/2009, 11h29
  2. Moteur d'entrées d'utilisateurs utilisant Direct Input (C++)
    Par ShadowOfEden dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 16/08/2008, 03h32
  3. Réponses: 1
    Dernier message: 29/05/2008, 12h23
  4. Utiliser directement les objets NHibernate dans le viewer
    Par HMplusplus dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 22/08/2007, 18h45
  5. Réponses: 7
    Dernier message: 14/10/2005, 21h00

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