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. #21
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Code juste un peu dépoussiéré ; variables inutiles virées... :

    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
    procedure TForm1.btnPrintClick(Sender: TObject);
    var
      LeftSaisie, TopSaisie, RightSaisie, BottomSaisie,
      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;
     
          { Get printer data }
          XOffs := GetDeviceCaps(Handle, PHYSICALOFFSETX); { minimum Left offset }
          YOffs := GetDeviceCaps(Handle, PHYSICALOFFSETY); { minimum Top offset }
          XRes  := GetDeviceCaps(Handle, LOGPIXELSX); { points per inch in X }
          YRes  := GetDeviceCaps(Handle, LOGPIXELSY); { points per inch in Y }
     
          { Change Your values to printer Units }
          LeftSaisie   := Round(LeftSaisie*XRes/25.4)-XOffs; { of course You can't set margins less than min offset !!! }
          TopSaisie    := Round(TopSaisie*YRes/25.4)-YOffs; { of course You can't set margins less than min offset !!! }
          RightSaisie  := 2490-Round(RightSaisie*XRes/25.4)-XOffs; { changing to width, not offset !!!}
          BottomSaisie := 3510-Round(BottomSaisie*YRes/25.4)-YOffs; { changing to height, not offset !!!}
     
          { print RichEdit }
          RichEdit1.PageRect := Rect(LeftSaisie, TopSaisie, RightSaisie, BottomSaisie);
          RichEdit1.Print('');
        end;
    end;
    Mais ça correspond à quoi au juste cette donnée de 2490 ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     RightSaisie  := 2490-Round(..)
    @ pluche

  2. #22
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 127
    Points
    15 127
    Par défaut
    Mais ça correspond à quoi au juste cette donnée de 2490 ?
    AMHA, ça correspond à LargeurPage [ := XPixels2MM(GetDeviceCaps(Handle, PHYSICALWIDTH)); ] ou qqchse de similaire qu'il a codé en dur (nul !).
    Et idem pour la hauteur.

    T'embête plus avec ma bidouille à la noix
    Dommage, je commençais à m'y retrouver...

    Mirek, pas ton copain alors
    C'est qui, ça ?

    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.
    Toujours d'actualité, ça ? J'ai pas regardé ton nouveau code, désolé, mais pense au ShowMessage,

    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Yep jp,

    Vi vi, là je viens d'abuser du ShowMessage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
         ...
         { print RichEdit }
          RichEdit1.PageRect := Rect(LeftSaisie, TopSaisie, RightSaisie, BottomSaisie);
          ///RichEdit1.Print('');
          ShowMessage('Gauche = '+ IntToStr(LeftSaisie) + '. Haut = '+ IntToStr(TopSaisie) +
          '. Droite = ' + IntToStr(RightSaisie)+ '. Bas = ' + IntToStr(BottomSaisie));
        ...
    En effet, je pige mieux pour me répondre à moi-même au sujet des "2490".

    Mirek, qui est-ce ? c'est justement le webmaster du site que tu ne fréquentes plus dont tu parlais plus haut
    (http://www.experts-exchange.com/)

    Je disais :
    T'embête plus avec ma bidouille à la noix
    Si tu aimes, alors mange-en tant que tu veux

    Je me cite aussi :
    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.
    Tu me conseilles le ShowMessage, oui mais là à première vue, là je ne trouve pas ma piste.

    Mais je vais revoir ça calmement.

    Les autres participants sont bien entendu, également conviés à répondre, tout conseil est le bienvenu !

    @ pluche

  4. #24
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 127
    Points
    15 127
    Par défaut
    Yep !
    je ne pige pas trop pour quelle raison la marge de droite reste bloquée vers les 105 millimètres
    Tu ne serais pas aussi embêté par la marge du bas, par hasard ?
    Bon, moi j'avais fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          //RightSaisie  := PageSetupDialog1.MinMarginRight;
          //BottomSaisie := PageSetupDialog1.MinMarginBottom;
          RightSaisie  := PageSetupDialog1.MarginRight;
          BottomSaisie := PageSetupDialog1.MarginBottom;
    Mais je dis ça comm' ça, j'ai rien testé aujourd'hui.

    Tchô,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Yep !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     //RightSaisie  := PageSetupDialog1.MinMarginRight;
          //BottomSaisie := PageSetupDialog1.MinMarginBottom;
          RightSaisie  := PageSetupDialog1.MarginRight;
          BottomSaisie := PageSetupDialog1.MarginBottom;
    Je suis plutôt tête en l'air

    En effet... j'avais attendu au "point" la suite de la liste des différents choix, mais j'ai mal cliqué

    Mais manque de bol, malgré cette rectif sans "MinMargin..." ça print mais sur une plage de 1 centimètre de large. Pour un petit texte, cela représente plusieurs pages


    @ pluche

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Je redonne le code en question, j'ai remis le nom de mes variables, afin que tout cela soit plus "causant" :

    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
    procedure TForm1.btnPrintClick(Sender: TObject);
    var
      LeftSaisie, TopSaisie, RightSaisie, BottomSaisie,
      XPixelsParPouce, YPixelsParPouce,
      LeftSpace, TopSpace : 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.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;
     
          // Obtenir les MARGES NON imprimables
          LeftSpace    := GetDeviceCaps(Handle, PHYSICALOFFSETX);
          TopSpace     := GetDeviceCaps(Handle, PHYSICALOFFSETY);
     
          // Nombre de pixels par pouce pour l'imrimante
          XPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
          YPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
     
          LeftSaisie   := Round(LeftSaisie*XPixelsParPouce/25.4)-LeftSpace;
          TopSaisie    := Round(TopSaisie*YPixelsParPouce/25.4)-TopSpace;
          RightSaisie  := 2490-Round(RightSaisie*XPixelsParPouce/25.4)-LeftSpace;
          BottomSaisie := 3510-Round(BottomSaisie*YPixelsParPouce/25.4)-TopSpace;
     
          // Impression RichEdit 
          RichEdit1.PageRect := Rect(LeftSaisie, TopSaisie, RightSaisie, BottomSaisie);
     
          RichEdit1.Print('');
     
          ShowMessage('LE RÉSULTAT DU RECT(...) EST :'
          +#13+#10
          +#13+#10+ 'En haut     = ' + IntToStr(TopSaisie)
          +#13+#10+ 'A gauche = ' + IntToStr(LeftSaisie)
          +#13+#10+ 'A droite     = ' + IntToStr(RightSaisie)
          +#13+#10+ 'Au bas      = ' + IntToStr(BottomSaisie)
          +#13+#10
          +#13+#10+ '===================================='
          +#13+#10+ 'LES MARGES NON IMPRIMABLES SONT :'
          +#13+#10
          +#13+#10+ 'Marge du haut        = ' + IntToStr(TopSpace)
          +#13+#10+ 'Marge de gauche = ' + IntToStr(LeftSpace)
          );
        end;
    end;
    Je précise que la marge de droite est toujours bloquée
    Pas encore osé regarder la marge bottom...

    @ pluche

  7. #27
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 127
    Points
    15 127
    Par défaut
    Bon, j'ai saisi 50 à gauche, 100 à droite, 40 en haut, 80 en bas.

    Avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LE RÉSULTAT DU RECT(...) EST :
    En haut  = 845
    A gauche = 1113
    A droite = 60
    Au bas   = 1520
    Avec le mien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LE RÉSULTAT DU RECT(...) EST :
    En haut   = 844
    A gauche  = 1113
    A droite  = 2506
    Au bas    = 5002
    À mon avis, tu t'embrouilles sur la largeur du document, à passer au Rect : la « fin » horizontale du Rect doit être égale à la largeur de la page moins la marge gauche et moins la marge droite. Non ?

    Je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LargeurDoc := LargeurPage - LeftSaisie - RightSaisie;
    R.Right  := XmmToPixels(LeftSaisie + LargeurDoc);
    Et toi tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RightSaisie  := 2490-Round(RightSaisie*XPixelsParPouce/25.4)-LeftSpace;
    1- C'est trop compliqué, on ne sait pas qui fait quoi,
    2- Y a toujours ce 2490...


    En gros, ce « LeftSaisie » est un décalage sur la page et correspond au point 0 du Rect, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    0           début_doc           fin_doc     fin_page
    |           |                   |           |
    |leftsaisie | -- largeur doc -- |rightsaisie|
    |           |                   |           |
     
    pour le TRect:
                R.Left              R.Right
                |                   |
                |                   |
    Bon courage !
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Lumière...
    Yop !

    Hé hé, jp, sur un point précis, tu avais encore raison :
    [...] ou qqchse de similaire qu'il a codé en dur (nul !).
    Et idem pour la hauteur.[...]
    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
    procedure TForm1.btnPrintClick(Sender: TObject);
    var
      LeftSaisie, TopSaisie, RightSaisie, BottomSaisie,
      XPixelsParPouce, YPixelsParPouce,
      LeftSpace, TopSpace : 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.MarginRight;
          BottomSaisie := PageSetupDialog1.MarginBottom;
     
          // Adaptation sortie des Edits de saisie du PageSetupDialog...
          LeftSaisie   := LeftSaisie   DIV 100;  // Convertir en millimètres
          TopSaisie    := TopSaisie    DIV 100;
          RightSaisie  := RightSaisie  DIV 100;
          BottomSaisie := BottomSaisie DIV 100;
     
          // Obtenir les MARGES NON imprimables
          LeftSpace    := GetDeviceCaps(Handle, PHYSICALOFFSETX);
          TopSpace     := GetDeviceCaps(Handle, PHYSICALOFFSETY);
     
          // Nombre de pixels par pouce pour l'imrimante
          XPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
          YPixelsParPouce := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
     
          LeftSaisie   := Round(LeftSaisie*XPixelsParPouce/25.4)-LeftSpace;
          TopSaisie    := Round(TopSaisie*YPixelsParPouce/25.4)-TopSpace;
     
          //RightSaisie  := 2490-Round(RightSaisie*XPixelsParPouce/25.4)-LeftSpace;
    RightSaisie  := PageWidth - Round(RightSaisie*XPixelsParPouce/25.4)-LeftSpace;
     
          //BottomSaisie := 3510-Round(BottomSaisie*YPixelsParPouce/25.4)-TopSpace;
    BottomSaisie := PageHeight - Round(BottomSaisie*YPixelsParPouce/25.4)-TopSpace;
     
          // Impression RichEdit 
          RichEdit1.PageRect := Rect(LeftSaisie, TopSaisie, RightSaisie, BottomSaisie);
     
          RichEdit1.Print('');
     
          ShowMessage('LES RÉSULTATS DU RECT(...) SONT :'
          +#13+#10
          +#13+#10+ 'En haut     = ' + IntToStr(TopSaisie)
          +#13+#10+ 'A gauche = ' + IntToStr(LeftSaisie)
          +#13+#10+ 'A droite     = ' + IntToStr(RightSaisie)
          +#13+#10+ 'Au bas      = ' + IntToStr(BottomSaisie)
          +#13+#10
          +#13+#10+ '====================================='
          +#13+#10+ 'LES MARGES NON IMPRIMABLES SONT :'
          +#13+#10
          +#13+#10+ 'Marge du haut        = ' + IntToStr(TopSpace)
          +#13+#10+ 'Marge de gauche = ' + IntToStr(LeftSpace)
          );
        end;
    end;
    Qui peut me dire si c'est ok et donc que ce code est fonctionnel également chez lui, afin que je tague "Résolu" ?

    @ pluche

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Oupsss jp, nous avons envoyé un message en même temps, je regarde le tiens avec attention...

    Tu disais :

    Avec le mien :

    LE RÉSULTAT DU RECT(...) EST :
    En haut = 844
    A gauche = 1113
    A droite = 2506
    Au bas = 5002
    Oui

    Avec mon dernier cela donne :

    LE RÉSULTAT DU RECT(...) EST :
    En haut = 874
    A gauche = 1110
    A droite = 2386
    Au bas = 4913


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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Si un membre de la rédac passe par là, peut-être est-ce que ce code serait utile en FAQ, en réponse au bug du TPageSetupDialog ?

    Aller, pour la beauté du geste, j'ai épuré un peu le code et (je pense) amélioré la précision de la marge droite et basse en ajoutant l'espace non imprimable ce qui devrait compenser l'erreur de l'utilisation du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RightSaisie  := PageWidth - Round(RightSaisie*XPixelsParPouce/25.4) + LeftSpace;
          BottomSaisie := PageHeight - Round(BottomSaisie*YPixelsParPouce/25.4) + TopSpace;

    Voici le code final (?) :
    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
    procedure TForm1.btnPrintClick(Sender: TObject);
    var
      LeftSaisie, TopSaisie, RightSaisie, BottomSaisie,
      XPixelsParPouce, YPixelsParPouce,
      LeftSpace, TopSpace : 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.MarginRight;
          BottomSaisie := PageSetupDialog1.MarginBottom;
     
          // Adaptation sortie des Edits de saisie du PageSetupDialog...
          LeftSaisie   := LeftSaisie   DIV 100;  // Convertir en millimètres
          TopSaisie    := TopSaisie    DIV 100;
          RightSaisie  := RightSaisie  DIV 100;
          BottomSaisie := BottomSaisie DIV 100;
     
          // Obtenir les MARGES NON imprimables
          LeftSpace    := GetDeviceCaps(Handle, PHYSICALOFFSETX);
          TopSpace     := GetDeviceCaps(Handle, PHYSICALOFFSETY);
     
          // Nombre de pixels par pouce pour l'imrimante
          XPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSX);
          YPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSY);
     
          LeftSaisie   := Round(LeftSaisie*XPixelsParPouce/25.4)-LeftSpace;
          TopSaisie    := Round(TopSaisie*YPixelsParPouce/25.4)-TopSpace;
          RightSaisie  := PageWidth - Round(RightSaisie*XPixelsParPouce/25.4) + LeftSpace;
          BottomSaisie := PageHeight - Round(BottomSaisie*YPixelsParPouce/25.4) + TopSpace;
     
          // Impression RichEdit 
          RichEdit1.PageRect := Rect(LeftSaisie, TopSaisie, RightSaisie, BottomSaisie);
     
          RichEdit1.Print('');
     
          ShowMessage('LES RÉSULTATS DU RECT(...) SONT :'
          +#13+#10
          +#13+#10+ 'En haut     = ' + IntToStr(TopSaisie)
          +#13+#10+ 'A gauche = ' + IntToStr(LeftSaisie)
          +#13+#10+ 'A droite     = ' + IntToStr(RightSaisie)
          +#13+#10+ 'Au bas      = ' + IntToStr(BottomSaisie)
          +#13+#10
          +#13+#10+ '====================================='
          +#13+#10+ 'LES MARGES NON IMPRIMABLES SONT :'
          +#13+#10
          +#13+#10+ 'Marge du haut        = ' + IntToStr(TopSpace)
          +#13+#10+ 'Marge de gauche = ' + IntToStr(LeftSpace)
          );
        end;
    end;
    Encore merci à toi jp, tu m'as bien encouragé et aidé, sans toi sur un post bien en amont, j'avais envie de laisser tomber.

    @ pluche

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    J'ose encore me citer :
    Si un membre de la rédac passe par là, peut-être est-ce que ce code serait utile en FAQ, en réponse au bug du TPageSetupDialog ?
    J'ajouterais même que ce thread pourrait aller dans le forum des compos, non ?

    Au début de ce thread, je ne me doutais pas que mon problème soit orienté bug de ce compo...


  12. #32
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 127
    Points
    15 127
    Par défaut
    Yep !

    Je viens d'essayer, effectivement ça a l'air correct !
    Avec un setting de marges à la noix (valeurs déjà citées), en haut mes résultats, en bas les tiens, on est dans un mouchoir de poche !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ---------------------------
    LE RÉSULTAT DU RECT(...) EST :
    En haut   = 490
    A gauche  = 522
    A droite  = 4278
    Au bas    = 6301
    ---------------------------
     
    ---------------------------
    LES RÉSULTATS DU RECT(...) SONT :
    En haut    = 491
    A gauche   = 523
    A droite   = 4276
    Au bas     = 6320
    Maintenant, de là à parler de bug de compo, euh... je crois plutôt que c'est une méconnaissance de l'utilisation du truc, , la preuve, on y est arrivés !

    Maintenant, derrière, faut gérer le nombre de pages et tout ça...

    Je t'avoue que j'ai autre chose sur le gaz.

    À bientôt,
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #33
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 127
    Points
    15 127
    Par défaut
    Yep !

    J'ai repensé à tout ça, y a un truc qui me chiffonne dans ta manière de gérer les marges :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LeftSaisie   := Round(LeftSaisie*XPixelsParPouce/25.4)-LeftSpace;
    ce qui revient à diminuer la valeur demandée par l'utilisateur
    de la valeur de la marge non imprimable... ?
    En prenant un exemple de marge gauche non imprimable de 1 cm,
    si l'utilisateur demande une marge gauche de 3 cm ça va s'imprimer à 2 cm ?
    Ça ne me va pas !

    Pour moi, les marges non imprimables doivent être utilisées en contrôle,
    et c'est ce que j'ai intégré dans le code ci-dessous (bon, y a du GoTo,
    les puristes vont hurler, j'ai pas trouvé plus simple pour réentrer
    dans la proc en cas d'erreur de saisie).
    Et tant qu'à y être, je me suis amusé à rajouter un (genre de) preview !
    Pour l'utiliser, mettre un panel (PanelPage) avec BevelOuter à none,
    Color à clWhite, Width à 168 et Height à 238 ;
    c'est à peu près proportionnel à une page A4.
    Dans ce panel, en mettre un autre (PanelDoc) avec BevelOuter à none
    et Color à ce qu'on veut, il va matérialiser la zone d'impression et voilà !

    Bon dimanche,
    --
    jp
    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    procedure TForm1.btnPrintClick(Sender: TObject);
    begin
      PrintRichEdit(RichEdit1);
    end;
     
    procedure TForm1.PrintRichEdit(re: TRichEdit);
    var
      MinLeft, MinTop, MinRight, MinBottom: single;
      XPixelsParPouce, YPixelsParPouce,
      HauteurPage, LargeurPage, HauteurDoc, LargeurDoc,
      MargeGauche, MargeDroite, MargeHaute, MargeBasse: Integer;
      R: TRect;
      label StartingProc;
     
      function XPixelsSingle2mm(pix: Single): Single;// en centièmes de mm
      begin
        Result := pix * 2540 / XPixelsParPouce;
      end;
      function YPixelsSingle2mm(pix: Single): Single;// en centièmes de mm
      begin
        Result := pix * 2540 / YPixelsParPouce;
      end;
     
      function XPixels2mm(pix: integer): integer;
      begin
        Result := Round( pix * 25.4 / XPixelsParPouce );
      end;
      function YPixels2mm(pix: integer): integer;
      begin
        Result := Round( pix * 25.4 / YPixelsParPouce );
      end;
     
      function Xmm2Pixels(mm: integer): integer;
      begin
        Result := Round( mm * XPixelsParPouce / 25.4 );
      end;
      function Ymm2Pixels(mm: integer): integer;
      begin
        Result := Round( mm * YPixelsParPouce / 25.4 );
      end;
     
      procedure WarnUser(texte: string; saisie: integer; mini: single);
      begin
        ShowMessage('Attention !' +#13+#10+
                    'La valeur saisie (' + IntToStr(saisie) +
                    ' mm) pour la marge ' + texte +
                    ' est inférieure à la valeur minimum (' + Format('%.2n', [mini / 100]) +
                    ' mm) autorisée pour cette imprimante.' +#13+#10+
                    'Veuillez corriger votre saisie !')
      end;
     
    begin
      with Printer do
      begin
        // Nombre de pixels par pouce pour l'imprimante
        XPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSX);
        YPixelsParPouce := GetDeviceCaps(Handle, LOGPIXELSY);
     
        // Obtenir les zones non imprimables = les marges physiques de l'imprimante
        // Pour contrôler que la saisie est valide
        MinLeft   := GetDeviceCaps(Handle, PHYSICALOFFSETX);
        MinTop    := GetDeviceCaps(Handle, PHYSICALOFFSETY);
        MinRight  := GetDeviceCaps(Handle, PHYSICALWIDTH)  - MinLeft - GetDeviceCaps(Handle, HORZRES);
        MinBottom := GetDeviceCaps(Handle, PHYSICALHEIGHT) - MinTop  - GetDeviceCaps(Handle, VERTRES);
      end;
     
    StartingProc:
      if PageSetupDialog1.Execute then
         with Printer do
         begin
           // Mise sous variables des Edits de saisie du compo
           // et conversion en millimètres
           MargeGauche := PageSetupDialog1.MarginLeft   DIV 100;
           MargeHaute  := PageSetupDialog1.MarginTop    DIV 100;
           MargeDroite := PageSetupDialog1.MarginRight  DIV 100;
           MargeBasse  := PageSetupDialog1.MarginBottom DIV 100;
     
           // Contrôle saisie
           if Xmm2Pixels(MargeGauche) < MinLeft then
           begin
             WarnUser('gauche', MargeGauche, XPixelsSingle2mm(MinLeft));
             goto StartingProc;
           end;
           if Ymm2Pixels(MargeHaute) < MinTop then
           begin
             WarnUser('haute', MargeHaute, YPixelsSingle2mm(MinTop));
             goto StartingProc;
           end;
           if Xmm2Pixels(MargeDroite) < MinRight then
           begin
             WarnUser('droite', MargeDroite, XPixelsSingle2mm(MinRight));
             goto StartingProc;
           end;
           if Ymm2Pixels(MargeBasse) < MinBottom then
           begin
             WarnUser('basse', MargeBasse, YPixelsSingle2mm(MinBottom));
             goto StartingProc;
           end;
     
           // Preview
           PanelDoc.Left   := MargeGauche * 8 div 10;
           PanelDoc.Top    := MargeHaute  * 8 div 10;
           PanelDoc.Width  := PanelPage.Width  - PanelDoc.Left - (MargeDroite * 8 div 10);
           PanelDoc.Height := PanelPage.Height - PanelDoc.Top  - (MargeBasse  * 8 div 10);
     
           // Calculs
           HauteurPage := YPixels2mm(GetDeviceCaps(Handle, PHYSICALHEIGHT));
           LargeurPage := XPixels2mm(GetDeviceCaps(Handle, PHYSICALWIDTH));
           LargeurDoc  := LargeurPage - MargeGauche - MargeDroite;
           HauteurDoc  := HauteurPage - MargeHaute  - MargeBasse;
     
           // Le rectangle d'impression
           R.Left   := Xmm2Pixels(MargeGauche);
           R.Top    := Ymm2Pixels(MargeHaute);
           R.Right  := Xmm2Pixels(MargeGauche + LargeurDoc);
           R.Bottom := Ymm2Pixels(MargeHaute  + HauteurDoc);
     
           RichEdit1.PageRect := R;
     
    // Imprime, donc penser à copier/coller du texte dans RichEdit1, avant de cliquer !
            RichEdit1.Print('');
     
       end;
    end;
    Images attachées Images attachées  
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    jp, Whaoooooooouuuuuuuuu !!! un preview de zone d'impression = the panard

    Je viens de tester ton code et je dois dire que c'est super de chez super, un grand bravo

    Heuuuu... je ne parle pas des goto .
    J'ai pourtant une dernière release à faire sur un programme qui passe aussi sous MS-DOS et j'évite d'y retourner cause de mauvaises habitudes...

    Je croyais que tu avais des sauces très fragiles sur le feu et des trucs dans le four à sortir à la minute près

    En attendant, je pensais avoir ficelé la procédure, tu me donnes des envies de ma gratter derrière l'oreille, en me demandant pourquoi d'un seul coup, je suis frustré à la découverte de l'ajout du preview de ton dernier code.

    Bon dimanche à toi aussi et au forum.

    On se marre bien avec toi jp

    @ pluche

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Yop

    jp, tu disais :
    Maintenant, derrière, faut gérer le nombre de pages et tout ça...
    Mais parlons-nous toujours du PageSetupDialog, si oui je ne vois pas sur ce compo ce genre d'option.

    Tout à l'heure j'ai même eu des frayeurs en regardant le haut de ce compo qui possède un prewiev de marges. J'avais complètement oublié qu'il en possédait un

    Et toi aussi ?

  16. #36
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 127
    Points
    15 127
    Par défaut
    moi : Maintenant, derrière, faut gérer le nombre de pages et tout ça...
    toi : Mais parlons-nous toujours du PageSetupDialog
    Tutafait, tutafait,
    Dans le sens où selon comment tu gères tes marges tu vas avoir plus ou moins de pages à imprimer.
    Ou à l'inverse, si tu veux, il m'arrive d'avoir un document de une page et deux lignes.
    Sur ce coup-là, je vais un peu agrandir les marges, histoire d'économiser une page.

    Je t'accorde qu'on s'éloigne de l'utilisation basique du composant, mais cette pensée m'est venue quand tu as rajouté le RichEdit et que j'y ai collé du texte pour essayer.
    Oki, laissons tomber ce délire.
    Pour conclure, j'ai au final implémenté un proto avec 2 boutons, un PrintRichEdit Disabled par défaut, et un SetMargins qui va le valider si les saisies passent les tests.

    J'avais complètement oublié qu'il en possédait un
    Moi pas, mais l'idée de mon Preview c'était pour vérifier que nos calculs de marges étaient justes,
    et plutôt que de gaspiller du papier et du toner à essayer,
    ben un ch'tit Preview et v'là

    Maintenant, je viens de faire un essai d'impression, et je me rends compte que ça n'est pas parfaitement bon, grrr...
    Marges haute et gauche un peu trop grandes, du coup le TRect est décalé un peu à droite et en bas...
    Mais comme c'est tout petit (environ 5 mm), le Preview ne peut pas le montrer !
    Revois ta copie, jp, revois ta copie, que j'me dis...
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    jp, tu doit être un coupeur de cheveux en quatre
    (Perso, seulement en trois)

    Mais c'est tout à ton honneur, car c'est à l'opposé des codeurs négligeants.

    Perso je me prends le bourrichon avec un truc tout bête = je cherche à intercepter lorsque l'on "clic" sur le bouton OK de ce compo.

    D'après F1... :
    [...]
    Si Options comprend psoMargins, MarginTop est la valeur initiale de marge supérieure présentée à l'utilisateur. Si l'utilisateur clique sur le bouton OK (renvoie de true par Execute), MarginTop prend la valeur de marge supérieure qu'il spécifie.
    [...]
    Alors j'ai placé sur le OnClose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.PageSetupDialog1Close(Sender: TObject);
    begin
      if PageSetupDialog1.Execute then
      begin
    ...
    Imagine la boucle sans fin te moque pôô !

    Bref, si quelqu'un sait comment intercepter le "clic" sur ce bouton OK, je suis prenneur !
    (Edit : depuis, j'ai trouvé que j'étais sur une mauvaise piste et que cela était un faux problème ; oublions ce bouton)

    @ pluche

    PS : Nous nous prenons en coeur le bourrichon pour des choses différentes ; mais pour ce même compo d'apparence lisse...

  18. #38
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 127
    Points
    15 127
    Par défaut
    Cent fois sur le métier (et 3 pages plus tard...), c'était ça le bug du compo dont tu parlais ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           // Le rectangle d'impression
           PrintRect.Left   := Xmm2Pixels(MargeGauche) - Round(MinLeft);
           PrintRect.Top    := Ymm2Pixels(MargeHaute)  - Round(MinTop);
           PrintRect.Right  := Xmm2Pixels(MargeGauche + LargeurDoc) - Round(MinRight);
           PrintRect.Bottom := Ymm2Pixels(MargeHaute  + HauteurDoc) - Round(MinBottom);
    Comme si le compo rajoutait les zones non imprimables aux marges demandées par l'utilisateur...
    Ne me demandez pas pourquoi, mais c'est comm' ça !
    J'ai mesuré avec une règle précise, c'est tout bon.

    Bon app',
    --
    jp
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut


    Cent fois sur le métier (et 3 pages plus tard...), c'était ça le bug du compo dont tu parlais ?
    Oupsss, pas qu'un seul bug le coquin

    Mais tu défriches et c'est tant mieux

    @ pluche et ne rêve pas trop de la chasse aux bugs

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Utilisation directe de la couche IP
    Par Mindiell dans le forum Développement
    Réponses: 15
    Dernier message: 23/02/2009, 10h29
  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, 02h32
  3. Réponses: 1
    Dernier message: 29/05/2008, 11h23
  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, 17h45
  5. Réponses: 7
    Dernier message: 14/10/2005, 20h00

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