AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi über DDE eine PDF Datei im Acrobat Reader schließen
Thema durchsuchen
Ansicht
Themen-Optionen

über DDE eine PDF Datei im Acrobat Reader schließen

Ein Thema von CodeWaveA1 · begonnen am 5. Feb 2007 · letzter Beitrag vom 18. Feb 2007
Antwort Antwort
Seite 1 von 2  1 2      
CodeWaveA1

Registriert seit: 2. Jan 2007
5 Beiträge
 
#1

über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 5. Feb 2007, 12:47
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?


mfg.
Marcus
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#2

Re: über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 5. Feb 2007, 14:37
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
Andreas N.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 5. Feb 2007, 14:40
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
  Mit Zitat antworten Zitat
CodeWaveA1

Registriert seit: 2. Jan 2007
5 Beiträge
 
#4

Re: über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 5. Feb 2007, 15:47
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.171 Beiträge
 
Delphi 12 Athens
 
#5

Re: über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 5. Feb 2007, 16:08
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
CodeWaveA1

Registriert seit: 2. Jan 2007
5 Beiträge
 
#6

Re: über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 6. Feb 2007, 10:47
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
  Mit Zitat antworten Zitat
EConvertError

Registriert seit: 29. Sep 2003
Ort: Österreich
230 Beiträge
 
#7

Re: über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 6. Feb 2007, 17:03
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.pdfthen
      // 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
Andreas N.
  Mit Zitat antworten Zitat
Peter Sawatzki

Registriert seit: 3. Sep 2006
3 Beiträge
 
#8

Re: über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 16. Feb 2007, 23:17
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 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
  Mit Zitat antworten Zitat
Peter Sawatzki

Registriert seit: 3. Sep 2006
3 Beiträge
 
#9

Re: über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 16. Feb 2007, 23:20
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?
  Mit Zitat antworten Zitat
Peter Sawatzki

Registriert seit: 3. Sep 2006
3 Beiträge
 
#10

Re: über DDE eine PDF Datei im Acrobat Reader schließen

  Alt 17. Feb 2007, 11:43
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 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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr.
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