Print Preview
Falk0ner, вс, 06/07/2008 - 15:34.
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;
MarginEdit: 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;
MarginEdit.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. := Round( GetMargin( MarginEdit.Text, false ) * 1000);
outputarea.Right := Round(( pagewidth -
GetMargin( RightMarginEdit.Text, true )) * 1000);
outputarea.Bottom := Round(( pageheight -
GetMargin( BottomMarginEdit.Text, false ))
* 1000);
end; { InitPrintSettings }
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;
MarginEdit: 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;
MarginEdit.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. := Round( GetMargin( MarginEdit.Text, false ) * 1000);
outputarea.Right := Round(( pagewidth -
GetMargin( RightMarginEdit.Text, true )) * 1000);
outputarea.Bottom := Round(( pageheight -
GetMargin( BottomMarginEdit.Text, false ))
* 1000);
end; { InitPrintSettings }
Отправить комментарий