Habs hinbekommen ^^
Folgender Hintergrund:
Von Version 6 zu 7 wurde das Interface der
ActiveX Komponente geändert.
Der Installer terminiert aber das 6er gleich mit, sodass entweder das 6er Control,
oder das 7er Control zur Verfügung steht.
Nach dem CreatePDFViewer (siehe unten) aufgerufen wurden,
kann man über FIsAcrobat6/7installed feststellen, ob ihr PDF6 oder PDF7 nutzen müsst.
(Sicherer ist es jedoch, Assigned(PDFx) zu benutzen!)
Das 6er Interface steht in der Acrobat-Versionen 4,5 und 6 zur Verfügung.
(Getestet - Version 3 und älter konnte ich nicht testen)
Zur einfacherer Benutzung, empfehle ich, häufig genutze Funktionen der PDF-Objekte
in eine Funktion zu kapseln, welche entscheidet welcher Reader da ist (spart Code und Zeit).
Eine solche Funktion hab ich unten als Beispiel mit dabei.
Tipp:
OLEExceptions können über try..except abgefangen werden.
Dadurch scheint manchmal die Fehlermeldung genauer zu werden.
Delphi-Quellcode:
try
...
except
on E:
Exception do begin
ShowMessage(E.
Message);
//kann man mit MessageDlg schöner machen
end;
end;
---
(Alle Code-Kommentare sind auf english, da ich einfach Copy&Paste aus meinem Firmen-Projekt gemacht habe [mit kleinen Änderungen])
Vorbereitung:
Acrobat 6 und 7 OCX
ActiveX Komponente als .pas exportieren
(alle Versionen deinstallieren -> v6 installieren -> OCX exportieren
-> v7 installieren -> OCX exportieren)
Falls ihr zu faul dazu seid, nehmt die im Anhang (erstellt mit Delphi 5)
Jetzt im Projekt beide .pas-Dateien aufnehmen und usen.
Folgender Code funktioniert bei mir bisher ohne Probleme:
Delphi-Quellcode:
var
PDF7: TAcroPDF;
//v7
PDF6: TPDF;
// v4-6 (getestet)
FIsAcrobat7installed, FIsAcrobat6Installed: boolean;
...
// Folgender Code prüft welche Version installiert ist,
// und erzeugt dann das entspr. Objekt
procedure CreatePDFViewer;
var Reg: TRegistry;
AcroBasekey, Acro7TypeLibID, Acro6TypeLibID:
string;
tmpStr:
string;
begin
// If the "AcroBasekey" under HKEY_CLASSES_ROOT\CLSID\ exists,
// Acrobat 4,5,6 or 7 is theoretical installed.
// The Value of the "TypeLib" Key dertermines the exact ActiveX version
// installed (= different for version 4-6 and 7).
AcroBasekey := '
{CA8A9780-280D-11CF-A24D-444553540000}';
Acro6TypeLibID := '
{CA8A9783-280D-11CF-A24D-444553540000}';
// v4 - v6
Acro7TypeLibID := '
{05BFD3F1-6319-4F30-B752-C7A22889BCC4}';
// v7
// Check for installed acrobat reader
Reg := TRegistry.Create(KEY_READ);
// We only need read-only access
try
Reg.RootKey := HKEY_CLASSES_ROOT;
if Reg.OpenKeyReadOnly('
CLSID\'+AcroBasekey+'
\TypeLib\')
then begin
// Get "standard" value of key
tmpStr := Reg.ReadString('
');
// Equal TypeLib GUIDs
FIsAcrobat6Installed := tmpStr = Acro6TypeLibID;
// Ver. 7 is installed
FIsAcrobat7Installed := tmpStr = Acro7TypeLibID;
// Ver. 6 is installed
// Acrobat 6/7 not found...
if (
not FIsAcrobat7Installed)
and (
not FIsAcrobat6Installed)
then begin
// < HIER FEHLERMELDUNG ZEIGEN, DASS KEIN KOMPATIBLER ACROBAT DA IST > (v4-7 getestet)
end;
Reg.CloseKey;
end else begin
// decent acrobat not installed...
// < HIER FEHLERMELDUNG ZEIGEN, DASS *KEIN* ACROBAT DA IST > (v4-7 getestet)
end;
finally
Reg.Free;
end;
// Create Acrobat Reader 7 PDF-Viewer component
if FIsAcrobat7Installed
then begin
PDF7 := TAcroPDF.Create(Self);
PDF7.Parent := Self;
PDF7.Align := alClient;
// Hide Acrobat Toolbar (can be undone with button in the left-bottom corner)
PDF7.setShowToolbar(false);
end;
// Create Acrobat Reader 6 PDF-Viewer component
if FIsAcrobat6Installed
then begin
PDF6 := TPDF.Create(Self);
PDF6.Parent := Self;
PDF6.Align := alClient;
// Hide Toolbar-function available, but doesn't work in v6 or lower
// PDF6.setShowToolbar(false);
end;
end;
Vergesst nicht, die Objekte im Form.Destroy freizugeben:
Delphi-Quellcode:
// free PDF-Viewer components
if Assigned(PDF6) then
DeleteClass(PDF6);
if Assigned(PDF7) then
DeleteClass(PDF7);
Hier noch eine gebräuchliche Funktion, welche gleich selber entscheidet, welcher Reader verfügbar ist.
Delphi-Quellcode:
function PDF_LoadFile(
const fileName: WideString): boolean;
begin
result := true;
if Assigned(PDF7)
then begin
try
// TAcroPDF (Reader v7) returns 0 if successfully loaded... (and an exception if not)
Result :=
not PDF7.LoadFile(FileName);
except
on E:
Exception do begin
MessageDlg(Format('
Error while loading file: %s',
[E.
Message]),mtError,[mbOK],0);
end;
end;
end else if Assigned(PDF6)
then begin
try
Result := PDF6.LoadFile(FileName);
except
on E:
Exception do begin
MessageDlg(Format('
Error while loading file: %s',
[E.
Message]),mtError,[mbOK],0);
end;
end;
end else begin
MessageDlg('
No pdf viewer initialized',mtError,[mbOK],0);
Result := false;
end;
end;
Danke für's lesen!
Jetzt viel Spaß damit ^^
(Über etwagige Verbesserungen würde ich mich sehr freuen)