Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Print Preview

01.01.2007
unit printpreview;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    PreviewPaintbox: TPaintBox;
    Label1: TLabel;
    Label2: TLabel;
    LeftMarginEdit: TEdit;
    TopMarginEdit: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    RightMarginEdit: TEdit;
    Label5: TLabel;
    BottomMarginEdit: TEdit;
    ApplyMarginsButton: TButton;
    OrientationRGroup: TRadioGroup;
    Label6: TLabel;
    ZoomEdit: TEdit;
    ZoomUpDown: TUpDown;
    procedure LeftMarginEditKeyPress(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure PreviewPaintboxPaint(Sender: TObject);
    procedure ApplyMarginsButtonClick(Sender: TObject);
  private
    { Private declarations }
    PreviewText: String;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses printers;
{$R *.DFM}
procedure TForm1.LeftMarginEditKeyPress(Sender: TObject; var Key: Char);
begin
  If not (Key in ['0'..'9',#9,DecimalSeparator]) Then
    Key := #0;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
  S: String;
  procedure loadpreviewtext;
  var
    sl: TStringlist;
  begin
    sl:= Tstringlist.Create;
    try
      sl.Loadfromfile( Extractfilepath( application.exename )+'printpreview.pas');
      PreviewText := sl.Text;
    finally
      sl.free
    end;
  end;
begin
  // Initialize the margin edits with a margin of 0.75 inch
  S:= FormatFloat('0.00',0.75);
  LeftMarginEdit.Text := S;
  TopMarginEdit.Text := S;
  RightMarginEdit.Text := S;
  BottomMarginEdit.Text := S;
  // Initialize the orientation radio group
  If Printer.Orientation = poPortrait Then
    OrientationRGroup.ItemIndex := 0
  Else
    OrientationRGroup.ItemIndex := 1;
  // load test text for display
  LoadPreviewtext;
end;
procedure TForm1.PreviewPaintboxPaint(Sender: TObject);
var
  pagewidth, pageheight: Double;     // printer page dimension in inch
  printerResX, printerResY: Integer; // printer resolution in dots/inch
  minmarginX, minmarginY: Double;    // nonprintable margin in inch
  outputarea: TRect;                 // print area in 1/1000 inches
  scale: Double; // conversion factor, pixels per 1/1000 inch
  procedure InitPrintSettings;
    function GetMargin( S: String; inX: Boolean ):Double;
    begin
      Result := StrToFloat(S);
      if InX then begin
        if Result < minmarginX then
          Result := minmarginX;
      end
      else begin
        if Result < minmarginY then
          Result := minmarginY;
      end;
    end;
  begin
    printerResX := GetDeviceCaps( printer.handle, LOGPIXELSX );
    printerResY := GetDeviceCaps( printer.handle, LOGPIXELSY );
    pagewidth   := GetDeviceCaps( printer.handle, PHYSICALWIDTH ) / printerResX;
    pageheight  := GetDeviceCaps( printer.handle, PHYSICALHEIGHT) / printerResY;
    minmarginX  := GetDeviceCaps( printer.handle, PHYSICALOFFSETX)/ printerResX;
    minmarginY  := GetDeviceCaps( printer.handle, PHYSICALOFFSETY)/ printerResY;
    outputarea.Left := Round( GetMargin( LeftMarginEdit.Text, true ) * 1000);
    outputarea.Top  := Round( GetMargin( TopMarginEdit.Text, false ) * 1000);
    outputarea.Right := Round(( pagewidth -
                                GetMargin( RightMarginEdit.Text, true )) * 1000);
    outputarea.Bottom := Round(( pageheight -
                                 GetMargin( BottomMarginEdit.Text, false ))
                               * 1000);
  end; { InitPrintSettings }