Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi über DDE eine PDF Datei im Acrobat Reader schließen (https://www.delphipraxis.net/85825-ueber-dde-eine-pdf-datei-im-acrobat-reader-schliessen.html)

CodeWaveA1 5. Feb 2007 12:47


ü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

EConvertError 5. Feb 2007 14:37

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

marabu 5. Feb 2007 14:40

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:
var
  befehl: String;
  fn: TFileName;
begin
  // ...
  fn := 'AntragDVRDV.pdf';
  befehl := Format('[DocClose(''%s'')]', [fn]);
  DDEClientConv1.ExecuteMacro(PChar(befehl), True);
// ...
Freundliche Grüße vom marabu

CodeWaveA1 5. Feb 2007 15:47

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

himitsu 5. Feb 2007 16:08

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?

CodeWaveA1 6. Feb 2007 10:47

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

EConvertError 6. Feb 2007 17:03

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:
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;
Vielleicht hilft es ja was...

Ich versuchs derweil noch hinzubekommen.

mfg,
Andreas

Peter Sawatzki 16. Feb 2007 23:17

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:

Zitat von EConvertError
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


Peter Sawatzki 16. Feb 2007 23:20

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?

Peter Sawatzki 17. Feb 2007 11:43

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:

Zitat von Peter Sawatzki
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?



Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz