This article shows how to alter the properties of the preview window AFTER it is
created and displayed.
Sample code -
Controlling a preview using a timer.
====================================
This code snippet shows how the preview form may be controlled
using a timer to to fire API calls that can re-size, or minimise and
maximise a showing preview.
The zoom state and other properties may also be set
The app has 2 forms, Mainform and RepForm
which has a quickrep called QuickRep1.
The code is rather bare - but the principles are illustrated.
The most amazing thing is that this -
repform.QuickRep1.QRPrinter.Client.Parent.Handle
is the handle of the preview window.
{-----------------------------------------------------
This button on the main form kicks-off the preview
and sets the timer on mainform.
Set the interval of the timer to 50000 in design mode.
-----------------------------------------------------}
procedure TMainform.SpeedButton1Click(Sender: TObject);
begin
timer1.enabled := false;
repform.Table1.open;
// this can be as small as you like - provided the
// tick routine checks that the preview is showing
timer1.Interval := 3000; // millisecs
timer1.enabled := true;
repform.QuickRep1.Preview;
repform.Table1.close;
end;
{---------------------------------------------------
Reposition and/or resize the window. See WinAPI help
for the possibilities of the SetWindowPlacement call.
----------------------------------------------------}
procedure Tmainform.Timer1Timer(Sender: TObject);
var
pStru : WINDOWPLACEMENT;
begin
// here we should check if the preview is showing
// and exit if not. A delay of 1 or 2 seconds is
// enough usually to allow this.
// This test might fail - but it hasn't yet
if not assigned(repform.QuickRep1.QRPrinter) then exit;
timer1.enabled := false; // we've finished with the timer.
// Doing it the easy way. Resetting the WindowState may not be
// necessary.
TForm( repform.QuickRep1.QRPrinter.Client.parent).WindowState := wsNormal;
repform.QuickRep1.QRPrinter.Client.parent.width := 800;
repform.QuickRep1.QRPrinter.Client.parent.height := 600;
repform.QuickRep1.QRPrinter.Client.parent.top := 50;
repform.QuickRep1.QRPrinter.Client.parent.left := 50;
exit;
// How to do it with API calls. This way is smoother.
// set the Window position structure
pstru.length := sizeof( WINDOWPLACEMENT);// mandatory
pstru.showCmd := SW_RESTORE; // could be SW_SHOWMAXIMIZED etc.
pstru.flags := WPF_SETMINPOSITION;
// set the rect in screen pixels for a move/resize
pstru.rcNormalPosition := rect( 100, 100, 850, 700 );
SetWindowPlacement( repform.QuickRep1.QRPrinter.Client.parent.Handle, @pstru );
end;
Setting the toolbar buttons
---------------------------
Use a longer time delay to do this - because the buttons
are reset in the QR code when the report is done.
// add some vars in the proc above
var
prevFrm : TForm;
tBar, tBut, tPrev : TComponent;
..
..
// this code goes into the proc above
// find the buttons and set them
prevfrm := TForm( repform.QuickRep1.QRPrinter.Client.parent);
for j := 0 to prevfrm.controlcount-1 do
begin
tBar := prevfrm.controls[ j ];
if tBar is TToolbar then
begin
// Vanish the toolbar !!
// TToolbar(tBar).visible := false;
// break; // if vanishing
for k := 0 to TToolbar(tBar).controlcount-1 do
begin
tBut := TToolbar(tBar).controls[ k ];
if tBut is TToolbutton then // could test the name here
TToolbutton(tBut).enabled := false;
end;
end;
end;
Setting the preview component properties.
----------------------------------------
// insert into the procedure above
// set preview component
tPrev := repform.QuickRep1.QRPrinter.Client;
TQRPreview(tPrev).ZoomToWidth;
TQRPreview(tPrev).Zoom := 80;
TQRPreview(tPrev).color := clRed;
|