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; |
Partager