unit uPDFVorschau;
interface
uses
AcroPDFLib_TLB,
Forms,
Classes,
Controls,
ExtCtrls;
type
TfmPDFVorschau =
class(TForm)
pnPDF: TPanel;
procedure FormResize(Sender: TObject);
procedure FormKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
procedure FormCreate(Sender: TObject);
protected
procedure CreateParams(
var Params: TCreateParams) ;
override;
private
{ Private-Deklarationen }
fAcroPDF : TAcroPDF;
fPDFFile :
String;
fUseSumatraPDF : Boolean;
public
{ Public-Deklarationen }
procedure LoadPDF(APdfFile :
String);
procedure LoadArcoPDF;
procedure LoadSumatraPdF;
property PDFFile :
String read fPDFFile;
property UseSumatraPDF : Boolean
read fUseSumatraPDF
write fUseSumatraPDF
default false;
end;
var
fmPDFVorschau: TfmPDFVorschau;
implementation
{$R *.dfm}
uses
Windows,
SysUtils,
ShellAPI;
const
csCaption = '
PDF-Vorschau - %s';
// Eigenen Button in die Taskbar machen, damit man per STRG+TAB zwischen den
// Fenstern wechseln kann. Der eingebettet Acrobat nimmt sich leider das Recht
// heraus alle Tastaturkürzel zu ignorieren, wenn sie vom Programm sind und
// sich selbst so in den Focus zu setzen, dass man nicht per Mausklick ...
// problemlos mit dem Programm arbeiten kann.
procedure TfmPDFVorschau.CreateParams(
var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle
or WS_EX_APPWINDOW;
Params.WndParent := 0;
end;
procedure TfmPDFVorschau.FormCreate(Sender: TObject);
begin
// Das muss ggfls. angepasst werden.
fUseSumatraPDF := FileExists('
.\Lib\SumatraPDF.exe');
end;
procedure TfmPDFVorschau.FormResize(Sender: TObject);
begin
if not fUseSumatraPDF
then begin
if Assigned(fAcroPDF)
then begin
if fAcroPDF.Visible
then begin
fAcroPDF.LoadFile(fPDFFile);
fAcroPDF.Update;
end;
end;
end else
if Assigned(pnPDF)
then begin
pnPDF.Align := alTop;
Application.ProcessMessages;
pnPDF.Align := alClient;
end;
end;
procedure TfmPDFVorschau.LoadPDF(APDFFile :
String);
begin
fPDFFile := APDFFile;
Caption := Format(csCaption,[ChangeFileExt(ExtractFileName(fPDFFile),'
')]);
case fUseSumatraPDF
of
true : LoadSumatraPDF;
false : LoadArcoPDF;
end;
end;
procedure TfmPDFVorschau.LoadArcoPDF;
begin
Screen.Cursor := crHourGlass;
if Assigned(pnPDF)
then pnPDF.Visible := False;
if not Assigned(fAcroPDF)
then begin
fAcroPDF := TAcroPDF.Create(Self);
fAcroPDF.Parent := Self;
fAcroPDF.Left := 0;
fAcroPDF.Top := 0;
fAcroPDF.Width := Width;
fAcroPDF.Height := Height;
fAcroPDF.TabStop := False;
fAcroPDF.Align := alClient;
fAcroPDF.ParentShowHint := False;
fAcroPDF.ShowHint := True;
fAcroPDF.TabOrder := 0;
fAcroPDF.Visible := True;
end;
fAcroPDF.src := fPDFFile;
fAcroPDF.LoadFile(fPDFFile);
Screen.Cursor := crDefault;
Show;
end;
procedure TfmPDFVorschau.LoadSumatraPDF;
var
sParam :
String;
begin
Screen.Cursor := crHourGlass;
if Assigned(fAcroPDF)
then fAcroPDF.Visible := False;
// Caption := Format(csCaption,[fPDFFile]);
// -reuse-instance funktioniert nur, wenn immer die gleiche Datei geladen wird,
// andernfalls entsteht für jede PDF-Datei eine neue Instanz von SumatraPDF.
// Die Instanzen von SumatraPDF werden beendet, wenn man das Programm beendet.
// Bei diesem Vorgehen entsteht aber nur eine Instanz von SumatraPDF.
pnPDF.Free;
Sleep(1000);
// Warten, bis sich SumatraPDF beendet hat.
pnPDF := TPanel.Create(Self);
pnPDF.Parent := Self;
pnPDF.Left := 0;
pnPDF.Top := 0;
pnPDF.Width := Width;
pnPDF.Height := Height;
pnPDF.BevelOuter := bvNone;
pnPDF.TabOrder := 1;
pnPDF.Align := alClient;
pnPDF.Visible := True;
sParam := Format('
-lang de -reuse-instance -plugin %d "%s"',[pnPDF.Handle,fPDFFile]);
ShellExecute(Self.Handle,'
open',PAnsiChar('
SumatraPDF.exe'),PAnsiChar(sParam),'
',sw_normal);
Screen.Cursor := crDefault;
Show;
end;
procedure TfmPDFVorschau.FormKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
case key
of 27 : Close;
end;
end;
end.