![]() |
über DDE eine PDF Datei im Acrobat Reader schließen
Hi Leute,
wie kann man mittels DDE prüfen, ob eine bestimmte PDF-Datei im Acrobat Reader geöffnet ist, um sie dann ggf. im zweiten Schritt über DDE im Acrobat Reader zu schließen? Nachfolgenden Code habe ich als Basis für verschiedene Variationen verwendet, aber eine funktionierende Lösung ist dabei leider nicht herausgekommen :( :
Delphi-Quellcode:
DDEClientConv1 := TDDEClientConv.Create(nil);
DDEClientItem1 := TDDEClientItem.Create(nil); //DDEClientConv1.ConnectMode := DDEManual; DDEClientConv1.SetLink('AcroRd32', ''); try StrPCopy(befehl, '[DocClose(AntragDVRDV.pdf)]'); if DDEClientConv1.OpenLink then begin DDEClientItem1.DdeConv := DDEClientConv1; //DDEClientItem1.DDEItem:= 'AntragDVRDV.pdf'; DDEClientConv1.ExecuteMacro(befehl, true); //DDEClientConv1.PokeData(DDEClientItem1.DDEItem, befehl); end; finally DDEClientConv1.CloseLink; DDEClientConv1.Free; DDEClientItem1.Free; end; Vielleicht kann mir mal jemand auf die Sprünge helfen, oder sehe ich den Wald vor lauter Bäumen nicht? :gruebel: mfg. Marcus |
Re: über DDE eine PDF Datei im Acrobat Reader schließen
Guten Tag!
Ohne jetzt eine konkrete Antwort für dich parat zu haben: Warum muss es unbedingt DDE sein? Ich würde, um den Acrobat Reader anzusprechen, mir von Delphi automatisch eine Unit, die COM/ActiveX verwendet, erstellen lassen. So viel ich weiß, ist DDE veraltet und COM(+)/ActiveX/OLE der richtige Weg (Anm.: in der Win32-Welt). Der Acrobat Reader verfügt über eine ziemlich bequeme Schnittstelle für solche Dinge... mfg, Andreas |
Re: über DDE eine PDF Datei im Acrobat Reader schließen
Herzlich willkommen in der Delphi-PRAXiS, Marcus.
Ohne es ausprobiert zu haben: Muss es nicht eher so sein:
Delphi-Quellcode:
Freundliche Grüße vom marabu
var
befehl: String; fn: TFileName; begin // ... fn := 'AntragDVRDV.pdf'; befehl := Format('[DocClose(''%s'')]', [fn]); DDEClientConv1.ExecuteMacro(PChar(befehl), True); // ... |
Re: über DDE eine PDF Datei im Acrobat Reader schließen
Hallo Andreas, hallo marabu,
erstmal Danke für die superschnelle Antwort! @Andreas DDE muss nicht unbedingt sein, Hauptsache die gewünschte Funktionalität ist machbar. Hatte von Delphi aus auch schon mal die ActiveX Schnittstelle importiert, kam damit aber auch nicht so recht klar. Da ich mit der Steuerung des Acrobat Readers aus einem Delphi-Programm heraus noch keinerlei Erfahrungen gesammelt habe, war DDE mein erster Ansatz. Kannst du mir evtl. einen Code-Schnippsel posten, der die gewünschte Funktion realisiert? @marabu Habe den Code-Schnipsel mal ausprobiert - der Acrobat Reader (7.0.9) weigert sich immer noch hartnäckig, das geöffnete, gleichnamige PDF zu schließen.
Delphi-Quellcode:
var
DDEClientConv1 : TDDEClientConv; befehl : array[0..256] of char; fn: TFileName; ... try fn := 'AntragDVRDV.pdf'; //befehl := Format('[DocClose(''%s'')]', [fn]); StrPCopy(befehl, Format('[DocClose(''%s'')]', [fn])); DDEClientConv1 := TDDEClientConv.Create(nil); DDEClientConv1.ExecuteMacro(befehl, True); finally DDEClientConv1.CloseLink; DDEClientConv1.Free; end; Sieht eigentlich so aus, als müßte es funktionieren, aber irgendetwas passt noch nicht. Hat jemand eine zündende Idee? mfg. Marcus |
Re: über DDE eine PDF Datei im Acrobat Reader schließen
Eventuell wird ja auch mehr, als nur der Dateiname benötigt...
wie wäre es mal mit zusätzlicher Angabe des Pfades? Und sicher, daß es über den dateinamen geht, denn was wäre, wenn die selbe atei mehrmals geöffnet ist? |
Re: über DDE eine PDF Datei im Acrobat Reader schließen
Hallo himitsu,
danke für den Tip, aber den kompletten Pfad der PDF-Datei mit anzugeben habe ich auch schon probiert - leider auch ohne Erfolg. Hat evtl. jemand einen funktionierenden Code-Schnippsel? mfg. Marcus |
Re: über DDE eine PDF Datei im Acrobat Reader schließen
Tja, ich arbeite dran.
Der Haken bisher ist, dass ich eine EOleSysError-Exception mit der Meldung 'Klasse nicht registriert' bekomme. Ich nutze den Adobe Reader 8. Und ich arbeite über OLE, wenns für dich in Ordnung ist. Denn mit DDE kenn ich mich nicht aus... Aber vielleicht hilft dir mein Code ja schon weiter:
Delphi-Quellcode:
Vielleicht hilft es ja was...
uses
Acrobat_TLB; // von Delphi generiert ... var AcroApp: TAcroApp; I, OpenedDocs: Integer; begin AcroApp := TAcroApp.Create(self); AcroApp.ConnectKind := ckRunningInstance; // Wenn kein Adobe Reader offen ist, hat sich die Sache erledigt AcroApp.Connect; // Hier kommt blöderweise meine Exception OpenedDocs := AcroApp.GetNumAVDocs; // Das gibt einem (hoffentlich) die Anzahl der Dokumente for I := 0 to OpenedDocs -1 do begin // Hier nur mehr ein wenig Pseudo-Code... if TAcroAVDoc(AcroApp.GetAVDoc(I)).GetTitle = 'DeinDateiName.pdf' then // Mit Close dann schließen... end; // Hier muss man natürlich noch zusammenräumen... end; Ich versuchs derweil noch hinzubekommen. mfg, Andreas |
Re: über DDE eine PDF Datei im Acrobat Reader schließen
Leider versteht der Acrobat Reader NUR DDE! Acuh wenn's "veraltet" ist, mit OLE/COM kannst du nur den Adobe Acrobat Vollversion ansprechen.
Peter Zitat:
|
Re: über DDE eine PDF Datei im Acrobat Reader schließen
DocClose kann nur die mit DocOpen geöffneten Dokumente schliessen, niemals die von einem User geöffneten oder die von FileOpen(Ex) geöffneten Dokumente. Dies ist auch in der Acrobat 8 SDK Doku beschrieben.
Peter ---------------- Habe den Code-Schnipsel mal ausprobiert - der Acrobat Reader (7.0.9) weigert sich immer noch hartnäckig, das geöffnete, gleichnamige PDF zu schließen.
Delphi-Quellcode:
var
DDEClientConv1 : TDDEClientConv; befehl : array[0..256] of char; fn: TFileName; ... try fn := 'AntragDVRDV.pdf'; //befehl := Format('[DocClose(''%s'')]', [fn]); StrPCopy(befehl, Format('[DocClose(''%s'')]', [fn])); DDEClientConv1 := TDDEClientConv.Create(nil); DDEClientConv1.ExecuteMacro(befehl, True); finally DDEClientConv1.CloseLink; DDEClientConv1.Free; end; Sieht eigentlich so aus, als müßte es funktionieren, aber irgendetwas passt noch nicht. Hat jemand eine zündende Idee? |
Re: über DDE eine PDF Datei im Acrobat Reader schließen
Ich glaube, mit einem Trick kannst du doch das Dokument schliessen: öffne mit [DocOpen("%s")] doch das gleichnamige schon geöffnete Dokument und schliesse es wieder mit [DocClose("%s")]. Das hat bei mir funktioniert.
Ein Hinweise noch: du muss " für die Namensabgrenzung nehmen und nicht ' wie du es gemacht hast. Peter Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz