1
0
Files
aarre
applications
bindings
components
Comba_Animation
aboutcomponent
acs
beepfp
callite
chelper
chemtext
cmdline
cmdlinecfg
colorpalette
cryptini
csvdocument
epiktimer
fpexif
fpsound
fpspreadsheet
fractions
freetypepascal
geckoport
gradcontrols
grid_semaphor
industrialstuff
iosdesigner
iphonelazext
jujiboutils
jvcllaz
kcontrols
lazautoupdate
lazbarcodes
lclextensions
longtimer
manualdock
mbColorLib
mplayer
multithreadprocs
nvidia-widgets
onguard
orpheus
playsoundpackage
poweredby
powerpdf
rgbgraphics
richmemo
richview
rtfview
rx
scrolltext
smnetgradient
spktoolbar
svn
systools
tdi
thtmlport
demo_src
GRID.RES
demounit.dfm
demounit.lfm
demounit.lrs
demounit.pas
fdemunit.dfm
fdemunit.lfm
fdemunit.lrs
fdemunit.pas
fontdlg.dfm
fontdlg.lfm
fontdlg.lrs
fontdlg.pas
framedem.dpr
framedem.exe.manifest
framedem.lpi
framedem.res
gopage.dfm
gopage.lfm
gopage.lrs
gopage.pas
htmlabt.dfm
htmlabt.lfm
htmlabt.lrs
htmlabt.pas
htmldemo.dpr
htmldemo.lpi
htmldemo.res
imgform.dfm
imgform.lfm
imgform.lrs
imgform.pas
previewform.dfm
previewform.lfm
previewform.lrs
previewform.pas
printstatusform.dfm
printstatusform.lfm
printstatusform.lrs
printstatusform.pas
submit.dfm
submit.lfm
submit.lrs
submit.pas
package
AGif2.gif
Import1.gif
Order1.gif
TryIt.htm
arizona.jpg
arrows.gif
blkgreen.htm
colors.htm
contents.bmp
crhrn1.wav
demo.css
demo.htm
glass.bmp
gudcolor.htm
leftwin.htm
license.txt
mail5a.gif
minus.gif
music.mid
note.gif
pengbrew.png
plus.gif
properties.htm
pyramids.jpg
readme1.htm
readme2.htm
readme3.htm
sample1.htm
sample2.htm
sample3.htm
smallcheck.gif
space.htm
support.htm
table.bmp
tabltut1.htm
tabltut2.htm
tabltut3.htm
things.htm
ugly.gif
whatsnew.htm
windmill.jpg
wmelon.bmp
tparadoxdataset
tvplanit
xdev_toolkit
zlibar
zmsql
examples
image_sources
lclbindings
wst
lazarus-ccr/components/thtmlport/demo_src/previewform.pas

543 lines
14 KiB
ObjectPascal
Raw Normal View History

{*************************************************************}
{* *}
{* Thanks to Chris Wallace for most of the ideas and *}
{* code associated with Print Preview and the Preview Form *}
{* *}
{*************************************************************}
{$ifDef ver150} {Delphi 7}
{$Define Delphi7_Plus}
{$endif}
{$ifDef ver170} {Delphi 2005}
{$Define Delphi7_Plus}
{$endif}
{$ifDef ver180} {Delphi 2006}
{$Define Delphi7_Plus} {9.4}
{$endif}
unit PreviewForm;
interface
uses
{$IFNDEF LCL} Windows, Messages, {$ELSE} LclIntf, LMessages, LclType, LResources, {$ENDIF}
SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Buttons, MetaFilePrinter, HTMLView, PrintStatusForm;
const
crZoom = 40;
crHandDrag = 41;
ZOOMFACTOR = 1.5;
type
TPreviewForm = class(TForm)
ToolBarPanel: TPanel;
GridBut: TSpeedButton;
ZoomCursorBut: TSpeedButton;
HandCursorBut: TSpeedButton;
OnePageBut: TSpeedButton;
TwoPageBut: TSpeedButton;
PrintBut: TBitBtn;
NextPageBut: TBitBtn;
PrevPageBut: TBitBtn;
CloseBut: TBitBtn;
ZoomBox: TComboBox;
StatBarPanel: TPanel;
CurPageLabel: TPanel;
ZoomLabel: TPanel;
Panel1: TPanel;
HintLabel: TLabel;
MoveButPanel: TPanel;
FirstPageSpeed: TSpeedButton;
PrevPageSpeed: TSpeedButton;
NextPageSpeed: TSpeedButton;
LastPageSpeed: TSpeedButton;
PageNumSpeed: TSpeedButton;
ScrollBox1: TScrollBox;
ContainPanel: TPanel;
PagePanel: TPanel;
PB1: TPaintBox;
PagePanel2: TPanel;
PB2: TPaintBox;
PrintDialog1: TPrintDialog;
FitPageBut: TSpeedButton;
FitWidthBut: TSpeedButton;
Bevel1: TBevel;
Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
Bevel6: TBevel;
UnitsBox: TComboBox;
Bevel7: TBevel;
procedure CloseButClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ScrollBox1Resize(Sender: TObject);
procedure PBPaint(Sender: TObject);
procedure GridButClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure ZoomBoxChange(Sender: TObject);
procedure TwoPageButClick(Sender: TObject);
procedure NextPageButClick(Sender: TObject);
procedure PrevPageButClick(Sender: TObject);
procedure FirstPageSpeedClick(Sender: TObject);
procedure LastPageSpeedClick(Sender: TObject);
procedure ZoomCursorButClick(Sender: TObject);
procedure HandCursorButClick(Sender: TObject);
procedure PB1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PB1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure PB1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PrintButClick(Sender: TObject);
procedure PageNumSpeedClick(Sender: TObject);
procedure OnePageButMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FitPageButClick(Sender: TObject);
procedure FitWidthButClick(Sender: TObject);
procedure UnitsBoxChange(Sender: TObject);
private
Viewer: ThtmlViewer;
protected
FCurPage : integer;
OldHint : TNotifyEvent;
DownX, DownY : integer;
Moving : boolean;
MFPrinter : TMetaFilePrinter;
procedure DrawMetaFile(PB: TPaintBox; mf: TMetaFile);
procedure OnHint(Sender: TObject);
procedure SetCurPage(Val: integer);
procedure CheckEnable;
property CurPage: integer read FCurPage write SetCurPage;
public
Zoom : double;
constructor CreateIt(AOwner: TComponent; AViewer: ThtmlViewer; var Abort: boolean);
destructor Destroy; override;
end;
implementation
uses
Gopage;
{$IFNDEF LCL}
{$R *.DFM}
{$ENDIF}
{$R GRID.RES}
constructor TPreviewForm.CreateIt(AOwner: TComponent; AViewer: ThtmlViewer;
var Abort: boolean);
var
StatusForm: TPrnStatusForm;
begin
inherited Create(AOwner);
ZoomBox.ItemIndex := 0;
UnitsBox.ItemIndex := 0;
Screen.Cursors[crZoom] := LoadCursor(hInstance, 'ZOOM_CURSOR');
Screen.Cursors[crHandDrag] := LoadCursor(hInstance, 'HAND_CURSOR');
ZoomCursorButClick(nil);
Viewer := AViewer;
MFPrinter := TMetaFilePrinter.Create(Self);
StatusForm := TPrnStatusForm.Create(Self);
try
StatusForm.DoPreview(Viewer, MFPrinter, Abort);
finally
StatusForm.Free;
end;
end;
destructor TPreviewForm.Destroy;
begin
inherited;
end;
procedure TPreviewForm.CloseButClick(Sender: TObject);
begin
Close;
end;
procedure TPreviewForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
Application.OnHint := OldHint;
MFPrinter.Free;
end;
procedure TPreviewForm.ScrollBox1Resize(Sender: TObject);
const
BORD = 20;
var
z : double;
tmp : integer;
TotWid : integer;
begin
case ZoomBox.ItemIndex of
0 : FitPageBut.Down := True;
1 : FitWidthBut.Down := True;
else
begin
FitPageBut.Down := False;
FitWidthBut.Down := False;
end;
end;
if ZoomBox.ItemIndex = -1 then
ZoomBox.ItemIndex := 0;
Case ZoomBox.ItemIndex of
0: z := ((ScrollBox1.ClientHeight - BORD) / PixelsPerInch) /
(MFPrinter.PaperHeight / MFPrinter.PixelsPerInchY);
1: z := ((ScrollBox1.ClientWidth - BORD) / PixelsPerInch) /
(MFPrinter.PaperWidth / MFPrinter.PixelsPerInchX);
2: z := Zoom;
3: z := 0.25;
4: z := 0.50;
5: z := 0.75;
6: z := 1.00;
7: z := 1.25;
8: z := 1.50;
9: z := 2.00;
10: z := 3.00;
11: z := 4.00;
else
z := 1;
end;
if ZoomBox.ItemIndex<>0 then OnePageBut.Down := True;
PagePanel.Height := TRUNC(PixelsPerInch * z * MFPrinter.PaperHeight / MFPrinter.PixelsPerInchY);
PagePanel.Width := TRUNC(PixelsPerInch * z * MFPrinter.PaperWidth / MFPrinter.PixelsPerInchX);
PagePanel2.Visible := TwoPageBut.Down;
if TwoPageBut.Down then
begin
PagePanel2.Width := PagePanel.Width;
PagePanel2.Height := PagePanel.Height;
end;
TotWid := PagePanel.Width + BORD;
if TwoPageBut.Down then
TotWid := TotWid + PagePanel2.Width + BORD;
// Resize the Contain Panel
tmp := PagePanel.Height + BORD;
if tmp < ScrollBox1.ClientHeight then
tmp := ScrollBox1.ClientHeight-1;
ContainPanel.Height := tmp;
tmp := TotWid;
if tmp < ScrollBox1.ClientWidth then
tmp := ScrollBox1.ClientWidth-1;
ContainPanel.Width := tmp;
// Center the Page Panel
if PagePanel.Height + BORD < ContainPanel.Height then
PagePanel.Top := ContainPanel.Height div 2 - PagePanel.Height div 2
else
PagePanel.Top := BORD div 2;
PagePanel2.Top := PagePanel.Top;
if TotWid < ContainPanel.Width then
PagePanel.Left := ContainPanel.Width div 2 - (TotWid - BORD) div 2
else
PagePanel.Left := BORD div 2;
PagePanel2.Left := PagePanel.Left + PagePanel.Width + BORD;
{Make sure the scroll bars are hidden if not needed}
if (PagePanel.Width +BORD <= ScrollBox1.Width) and
(PagePanel.Height +BORD <= ScrollBox1.Height) then
begin
ScrollBox1.HorzScrollBar.Visible := False;
ScrollBox1.VertScrollBar.Visible := False;
end
else
begin
ScrollBox1.HorzScrollBar.Visible := True;
ScrollBox1.VertScrollBar.Visible := True;
end;
// Set the Zoom Variable
Zoom := z;
ZoomLabel.Caption := Format('%1.0n', [z * 100]) + '%';
end;
procedure TPreviewForm.DrawMetaFile(PB: TPaintBox; mf: TMetaFile);
begin
PB.Canvas.Draw(0, 0, mf);
end;
procedure TPreviewForm.PBPaint(Sender: TObject);
var
PB : TPaintBox;
x1, y1 : integer;
x, y : integer;
Factor : double;
Draw : boolean;
Page : integer;
begin
PB := Sender as TPaintBox;
if PB = PB1 then
begin
Draw := CurPage < MFPrinter.LastAvailablePage;
Page := CurPage;
end
else
begin
// PB2
Draw := TwoPageBut.Down and (CurPage+1 < MFPrinter.LastAvailablePage);
Page := CurPage + 1;
end;
SetMapMode(PB.Canvas.Handle, MM_ANISOTROPIC);
SetWindowExtEx(PB.Canvas.Handle, MFPrinter.PaperWidth, MFPrinter.PaperHeight, nil);
SetViewportExtEx(PB.Canvas.Handle, PB.Width, PB.Height, nil);
SetWindowOrgEx(PB.Canvas.Handle, -MFPrinter.OffsetX, -MFPrinter.OffsetY, nil);
if Draw then
DrawMetaFile(PB, MFPrinter.MetaFiles[Page]);
if GridBut.Down then
begin
SetWindowOrgEx(PB.Canvas.Handle, 0, 0, nil);
PB.Canvas.Pen.Color := clLtGray;
if UnitsBox.ItemIndex = 0 then
Factor := 1.0
else Factor := 2.54;
for x := 1 to Round(MFPrinter.PaperWidth / MFPrinter.PixelsPerInchX * Factor) do
begin
x1 := Round(MFPrinter.PixelsPerInchX * x / Factor);
PB.Canvas.MoveTo(x1, 0);
PB.Canvas.LineTo(x1, MFPrinter.PaperHeight);
end;
for y := 1 to Round(MFPrinter.PaperHeight / MFPrinter.PixelsPerInchY * Factor) do
begin
y1 := Round(MFPrinter.PixelsPerInchY * y / Factor);
PB.Canvas.MoveTo(0, y1);
PB.Canvas.LineTo(MFPrinter.PaperWidth, y1);
end;
end;
end;
procedure TPreviewForm.GridButClick(Sender: TObject);
begin
PB1.Invalidate;
PB2.Invalidate;
end;
procedure TPreviewForm.OnHint(Sender: TObject);
begin
HintLabel.Caption := Application.Hint;
end;
procedure TPreviewForm.FormShow(Sender: TObject);
begin
CurPage := 0;
OldHint := Application.OnHint;
Application.OnHint := OnHint;
CheckEnable;
{$ifdef delphi7_plus}
PagePanel.ParentBackground := False;
PagePanel2.ParentBackground := False;
{$endif}
ScrollBox1Resize(Nil); {make sure it gets sized}
end;
procedure TPreviewForm.SetCurPage(Val: integer);
var
tmp : integer;
begin
FCurPage := Val;
tmp := 0;
if MFPrinter <> nil then
tmp := MFPrinter.LastAvailablePage;
CurPageLabel.Caption := Format('Page %d of %d', [Val+1, tmp]);
PB1.Invalidate;
PB2.Invalidate;
end;
procedure TPreviewForm.ZoomBoxChange(Sender: TObject);
begin
ScrollBox1Resize(nil);
ScrollBox1Resize(nil);
end;
procedure TPreviewForm.TwoPageButClick(Sender: TObject);
begin
ZoomBox.ItemIndex := 0;
ScrollBox1Resize(nil);
end;
procedure TPreviewForm.NextPageButClick(Sender: TObject);
begin
CurPage := CurPage + 1;
CheckEnable;
end;
procedure TPreviewForm.PrevPageButClick(Sender: TObject);
begin
CurPage := CurPage - 1;
CheckEnable;
end;
procedure TPreviewForm.CheckEnable;
begin
NextPageBut.Enabled := CurPage+1 < MFPrinter.LastAvailablePage;
PrevPageBut.Enabled := CurPage > 0;
NextPageSpeed.Enabled := NextPageBut.Enabled;
PrevPageSpeed.Enabled := PrevPageBut.Enabled;
FirstPageSpeed.Enabled := PrevPageBut.Enabled;
LastPageSPeed.Enabled := NextPageBut.Enabled;
PageNumSpeed.Enabled := MFPrinter.LastAvailablePage > 1;
end;
procedure TPreviewForm.FirstPageSpeedClick(Sender: TObject);
begin
CurPage := 0;
CheckEnable;
end;
procedure TPreviewForm.LastPageSpeedClick(Sender: TObject);
begin
CurPage := MFPrinter.LastAvailablePage-1;
CheckEnable;
end;
procedure TPreviewForm.ZoomCursorButClick(Sender: TObject);
begin
PB1.Cursor := crZoom;
PB2.Cursor := crZoom;
end;
procedure TPreviewForm.HandCursorButClick(Sender: TObject);
begin
PB1.Cursor := crHandDrag;
PB2.Cursor := crHandDrag;
end;
procedure TPreviewForm.PB1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
sx, sy : single;
nx, ny : integer;
begin
if ZoomCursorBut.Down then
begin
sx := X / PagePanel.Width;
sy := Y / PagePanel.Height;
if (ssLeft in Shift) and (Zoom < 20.0) then Zoom := Zoom * ZOOMFACTOR;
if (ssRight in Shift) and (Zoom > 0.1) then Zoom := Zoom / ZOOMFACTOR;
ZoomBox.ItemIndex := 2;
ScrollBox1Resize(nil);
nx := TRUNC(sx * PagePanel.Width);
ny := TRUNC(sy * PagePanel.Height);
ScrollBox1.HorzScrollBar.Position := nx - ScrollBox1.Width div 2;
ScrollBox1.VertScrollBar.Position := ny - ScrollBox1.Height div 2;
end;
if HandCursorBut.Down then
begin
DownX := X;
DownY := Y;
Moving := True;
end;
end;
procedure TPreviewForm.PB1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Moving then
begin
ScrollBox1.HorzScrollBar.Position := ScrollBox1.HorzScrollBar.Position + (DownX - X);
ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position + (DownY - Y);
end;
end;
procedure TPreviewForm.PB1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Moving := False;
end;
procedure TPreviewForm.PrintButClick(Sender: TObject);
var
StatusForm: TPrnStatusForm;
Dummy: boolean;
begin
with PrintDialog1 do
begin
MaxPage := 9999;
ToPage := 1;
Options := [poPageNums];
StatusForm := TPrnStatusForm.Create(Self);
if Execute then
if PrintRange = prAllPages then
StatusForm.DoPrint(Viewer, FromPage, 9999, Dummy)
else
StatusForm.DoPrint(Viewer, FromPage, ToPage, Dummy);
StatusForm.Free;
end;
end;
procedure TPreviewForm.PageNumSpeedClick(Sender: TObject);
var
gp : TGoPageForm;
begin
gp := TGoPageForm.Create(Self);
gp.PageNum.MaxValue := MFPrinter.LastAvailablePage;
gp.PageNum.Value := CurPage + 1;
if gp.ShowModal = mrOK then
begin
CurPage := gp.PageNum.Value - 1;
CheckEnable;
end;
gp.Free;
end;
procedure TPreviewForm.OnePageButMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ZoomBox.ItemIndex := 0;
ScrollBox1Resize(nil);
end;
procedure TPreviewForm.FitPageButClick(Sender: TObject);
begin
ZoomBox.ItemIndex := 0;
ZoomBoxChange(nil);
end;
procedure TPreviewForm.FitWidthButClick(Sender: TObject);
begin
ZoomBox.ItemIndex := 1;
ZoomBoxChange(nil);
end;
procedure TPreviewForm.UnitsBoxChange(Sender: TObject);
begin
if GridBut.down then
begin
PB1.Invalidate;
PB2.Invalidate;
end;
end;
initialization
{$IFDEF LCL}
{$I PreviewForm.lrs} {Include form's resource file}
{$ENDIF}
end.