Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PDF aus Delphi heraus öffnen (https://www.delphipraxis.net/59655-pdf-aus-delphi-heraus-oeffnen.html)

Matze 26. Dez 2005 16:38


PDF aus Delphi heraus öffnen
 
Hallo :hi:

Ich versuche über

Delphi-Quellcode:
ShellExecute(Application.Handle, 'open', PChar('"' + FileDir + 'helpfile.pdf' + '"'),
  nil, nil, SW_NORMAL);
eine PDF Datei zu öffnen. GetLastError meldet mir nun:

Zitat:

Der angegebenen Datei ist keine Anwendung zugeordnet
Vom Explorer heraus kann ich die PDF per Doppelklick ganz normal im Adobe Reader öffnen. Wie kommt so eine Meldung zustande? Weder Google, noch die DP liefert mir eine Lösung, das scheint ein nicht allzu häufig auftretender Fehler zu sein. :?

Christian Seehase 26. Dez 2005 16:53

Re: PDF aus Delphi heraus öffnen
 
Moin Matze,

laut Dokumentation von ShellExecute, spielt GetLastError hier keine Rolle.
Schau Dir doch noch mal die möglichen Rückgabewerte von ShellExecute an.

BTW:
Was liefert Dir denn

Assoc .pdf

zurück, wenn Du es in einer Konsole ausführst?

Matze 26. Dez 2005 16:59

Re: PDF aus Delphi heraus öffnen
 
Hallo Chris

Zitat:

Zitat von Christian Seehase
Was liefert Dir denn

Assoc .pdf

zurück, wenn Du es in einer Konsole ausführst?

.pdf=pdf_auto_file

Auch unser Hai macht es so wie ich, nur mit SW_SHOW (klick), doch geht das bei mir auch nicht. Es passiert bei mir rein gar nichts.

Neutral General 26. Dez 2005 17:07

Re: PDF aus Delphi heraus öffnen
 
Also bei mir liefert assoc .pdf z.B

Delphi-Quellcode:
 .pdf=AcroExch.Document
das scheint mir so nach "Acrobat Reader Dokument" auszusehen..
Ansonsten geh mal im Explorer auf Extras-> Ordneroptionen->Dateitypen und such dir pdf aus und ordne pdf den Acrobat Reader zu.
Dann müsste es gehen denke ich.

Luckie 26. Dez 2005 17:11

Re: PDF aus Delphi heraus öffnen
 
Da es aus dem Explorer, laut Matze, mit einem Doppelklick geht, ist dem Dateityp pdf auch der Reader als Anwendung zu geordnet.

Matze 26. Dez 2005 17:11

Re: PDF aus Delphi heraus öffnen
 
Zitat:

Zitat von Neutral General
das scheint mir so nach "Acrobat Reader Dokument" auszusehen..
Ansonsten geh mal im Explorer auf Extras-> Ordneroptionen->Dateitypen und such dir pdf aus und ordne pdf den Acrobat Reader zu.
Dann müsste es gehen denke ich.

Die PDF muss aber mit den Adobe Reader verknüpft sein, sonst könnte ich sie aus dem Explorer heraus nicht öffnen. In den Ordneroptionen ist der Adobe Reader 7.0 zugewiesen. Außerdem kann ich dem Anwender auch nicht zumuten, in den Ordneroptionen rumfummeln zu müssen. ;)

mschaefer 26. Dez 2005 18:36

Re: PDF aus Delphi heraus öffnen
 
Moin moin, zusammen

also normalerweise würde ich das auch so angehen wie Matze geschildert hat, aber das Problem kann bei Acrobat liegen.
Probier mal erst den Acrobat zu starten und dann das PDF:

Delphi-Quellcode:
 ShellExecute(0, 'Open', PChar('C:\Program Files\Adobe\Acrobat 7.0\Reader\AcroRd32.exe'), PChar(''), PChar(''), SW_Hide);
 ShellExecute(0, 'Open', PChar('C:\...\prices.pdf'), PChar(''), PChar(''), SW_Normal);
Über die Schöheit / Grausamkeit dieser Lösung brauchen wir aber nicht zu diskutieren.
Wie man aber auf eine bestimmte Seite navigiert da habe ich immer noch keine Ahnung...


Grüße // Martin



PS: Du kanst natürlich PDF auch im TWebBrowser öffnen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  webbrowser1.Navigate('c:\..\MyPDFFile.pdf');
end;

Matze 26. Dez 2005 21:06

Re: PDF aus Delphi heraus öffnen
 
Hallo Martin,

deine erste Lösung startet zwar den Adobe Reader, jedoch im Hintergrund, d.h. ohne GUI :shock: Doch möchte ich diesen Weg nicht gehen, da nicht jeder den Adobe Reader zum anzeigen von PDF-Dateien nutzt. Und TWebBrowser integrieren muss auch nicht sein, nur um eine PDF öffnen zu können.

Ich bin echt ratlos und kann mir das absolut nicht erklären. :-|


Nachtrag: Achso SW_HIDE, klar sehe ich den nicht. Aber es würde auch nicht gehen.

mschaefer 26. Dez 2005 21:18

Re: PDF aus Delphi heraus öffnen
 
Matze ich habe Dein Problem irgendwo schonmal gesehen und da war die einhellige Meinung, dass es an Acrobat liegt.
Mir würde da leider nur was kommerzielles Einfallen...

Grüße // Martin

Matze 26. Dez 2005 21:28

Re: PDF aus Delphi heraus öffnen
 
Zitat:

Zitat von mschaefer
Mir würde da leider nur was kommerzielles Einfallen...

Danke, doch das kommt für mich nicht in Frage, da ich das für ein Freeware-Programm benötige und es daher nicht einsehe, groß geld dafür auszugeben.

Gibt es denn absolut keine andere Möglichkeit? Vom Explorer kann ich diese Datei ja auch öffnen und da passiert bestimmt auch nichts anderes, als dass dem Reader über den Parameter der Pfad zur Datei übermittelt wird.

PierreB 26. Dez 2005 21:39

Re: PDF aus Delphi heraus öffnen
 
Vielleicht nicht das was du suchst, wäre doch aber auch ne Möglichkeit: Guck dich nach guten Freeware-PDF-Komponenten um und lasse dein PDF dann direkt in deinem Programm anzeigen. Not macht erfinderisch. ;)

Matze 26. Dez 2005 21:55

Re: PDF aus Delphi heraus öffnen
 
Hallo, nein ich möchte die PDF so öffnen, wie es der Anwender gewöhnt ist.

Luckie 26. Dez 2005 22:08

Re: PDF aus Delphi heraus öffnen
 
Und was gibt nun ShellExecute zurück?

Matze 26. Dez 2005 22:16

Re: PDF aus Delphi heraus öffnen
 
Zitat:

Zitat von Luckie
Und was gibt nun ShellExecute zurück?

Es gibt mir den Wert 31 zurück.

Nur sagt mir das nicht viel.
SysErrorMessage meldet mir zum Wert 31: Ein an das System angeschlossenes Gerät funktioniert nicht. Das muss wohl eine andere Funktion sein, mit der ich mit den Fehler in Textform anzeigen lassen kann. :oops:

Luckie 26. Dez 2005 22:24

Re: PDF aus Delphi heraus öffnen
 
Das hat Christian doch schon geschrieben, dass das mit Shellexecute nicht geht:
Zitat:

Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.
Code:
0 The operating system is out of memory or resources.
ERROR_FILE_NOT_FOUND The specified file was not found.
ERROR_PATH_NOT_FOUND The specified path was not found.
ERROR_BAD_FORMAT The .exe file is invalid (non-Microsoft Win32 .exe or error in .exe image).
SE_ERR_ACCESSDENIED The operating system denied access to the specified file.
SE_ERR_ASSOCINCOMPLETE The file name association is incomplete or invalid.
SE_ERR_DDEBUSY The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed.
SE_ERR_DDEFAIL The DDE transaction failed.
SE_ERR_DDETIMEOUT The DDE transaction could not be completed because the request timed out.
SE_ERR_DLLNOTFOUND The specified dynamic-link library (DLL) was not found.
SE_ERR_FNF The specified file was not found.
SE_ERR_NOASSOC There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable.
SE_ERR_OOM There was not enough memory to complete the operation.
SE_ERR_PNF The specified path was not found.
SE_ERR_SHARE A sharing violation occurred.
Code:
/* regular WinExec() codes */
#define SE_ERR_FNF             2       // file not found
#define SE_ERR_PNF             3       // path not found
#define SE_ERR_ACCESSDENIED    5       // access denied
#define SE_ERR_OOM             8       // out of memory
#define SE_ERR_DLLNOTFOUND             32

#endif /* WINVER >= 0x0400 */

/* error values for ShellExecute() beyond the regular WinExec() codes */
#define SE_ERR_SHARE                   26
#define SE_ERR_ASSOCINCOMPLETE         27
#define SE_ERR_DDETIMEOUT              28
#define SE_ERR_DDEFAIL                 29
#define SE_ERR_DDEBUSY                 30
#define SE_ERR_NOASSOC                 31

Matze 26. Dez 2005 22:28

Re: PDF aus Delphi heraus öffnen
 
Äh und wieso wolltest du dann wissen, was es zurückgibt?

Luckie 26. Dez 2005 22:47

Re: PDF aus Delphi heraus öffnen
 
Deswegen:
Zitat:

only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below

Matze 26. Dez 2005 22:50

Re: PDF aus Delphi heraus öffnen
 
Code:
#define SE_ERR_NOASSOC                 31
Aber das haben wir ja zu Beginn schon herausgefunden.

Zitat:

Der angegebenen Datei ist keine Anwendung zugeordnet
Das dürfte damit ja gemeint sein.

mschaefer 26. Dez 2005 23:18

Re: PDF aus Delphi heraus öffnen
 
Ahm, könnte es etwas mit den "" zutun haben? Was passiert, wenn Du die Hai-Routine bei Dir in den Quellcode einsetzt?
Grüße // Martin

Matze 26. Dez 2005 23:24

Re: PDF aus Delphi heraus öffnen
 
Zitat:

Zitat von mschaefer
Ahm, könnte es etwas mit den "" zutun haben? Was passiert, wenn Du die Hai-Routine bei Dir in den Quellcode einsetzt?

Die Hai Methode macht genau das, was mein Code auch macht - nichts. Die "" habe ich darum, da ShellExecute bei mir mal Probleme machte, wenn Leerzeichen in der Pfadangabe sind.

Luckie 26. Dez 2005 23:26

Re: PDF aus Delphi heraus öffnen
 
Dann fällt mir nur noch eins ein: Das mit PDFs verknüpfte Programm aus der Regsitry ermitteln und das ganze mit Createprocess machen.

Matze 26. Dez 2005 23:38

Re: PDF aus Delphi heraus öffnen
 
Zitat:

Zitat von Luckie
Dann fällt mir nur noch eins ein: Das mit PDFs verknüpfte Programm aus der Regsitry ermitteln und das ganze mit Createprocess machen.

Danke, das wollte ich grad probieren und musste schockierend feststellen, dass PDF-dateien anscheinend doch nicht mit einem Programm verknüpft sind, obwohl sie es ja eigentlich sind *ganz verwirrt bin*:

Dieser Code listet alle Dateiendungen und deren verknüpften Programme alphabetisch auf, doch was muss ich da feststellen:

Code:
Extension: ".pcx", Typename: "pcxfile", Displayname:"PCX-Bild"
  Server: "C:\Programme\Gemeinsame Dateien\Microsoft Shared\PhotoEd\PHOTOED.EXE" "%1"
Extension: ".pdp", Typename: "Photoshop.PDFFile", Displayname:""
  Server: d:\programme\Photoshop 6.0\Photoshp.exe "%1"
Extension: ".pdt", Typename: "pdtfile", Displayname:"InkWriter-Vorlage"
  Server: "D:\Programme\Microsoft Office\Office\WINWORD.EXE" /n "%1"
Extension: ".pfm", Typename: "pfmfile", Displayname:"Type 1-Schriftartendatei"
  Server: %SystemRoot%\System32\fontview.exe %1
Pdf fehlt. :shock:

turboPASCAL 26. Dez 2005 23:41

Re: PDF aus Delphi heraus öffnen
 
Jo, so könnte man es machen. Frage, wass passiert denn wenn du im "Ausführen"-Dialog (Win.-Taste+R) die
Datei angibst, starten dann alle korrekct5?

// Edit: hat sich ja dann wohl erledigt ;)

Matze 26. Dez 2005 23:45

Re: PDF aus Delphi heraus öffnen
 
Jupp, dann wird sie korrekt geöffnet (auch wenn ich die Anführungszeichen miteinbezihe).

PS: Erledigt? kA, Geht auf jedenfall. ;)

turboPASCAL 27. Dez 2005 00:02

Re: PDF aus Delphi heraus öffnen
 
:gruebel: Das kann mit dem Acrobat Server zusammen hängen (Adobe Reader-Schnellstart im "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Cur rentVersion\Run"). Im Normalfall ist aber das .pdf-Format in der Registry für den Acrobatreader eingetragen "HKEY_CLASSES_ROOT\.pdf".

Matze 27. Dez 2005 00:10

Re: PDF aus Delphi heraus öffnen
 
Hm und wenn man keinen Reader von Adobe nutzt? Ich brauche irgendwie eine allgemeine Lösung, doch wenn jeder seine File Extensions speichert, wo er Lust hat, ist das ja hoffnungslos.

turboPASCAL 27. Dez 2005 00:24

Re: PDF aus Delphi heraus öffnen
 
Du möchtest eine Hilfedatei machen oder ? Ich mache das am einfachsten so, indem ich eine RTF-Datei als recource einbinde und dan in einem Richedit anzeigen lasse. Nachteil ist halt die formatierung von Grafiken.

Es gibt auch gute Hilfecompiler und Editoren zum erstellen von .hlp, .chm usw.

So zum Bleistift....

Matze 27. Dez 2005 00:27

Re: PDF aus Delphi heraus öffnen
 
Moin, danke, doch chm ist veraltet und hlp ist auch nicht mein Fall, darum möchte ich bei PDF bleiben. :stupid:

turboPASCAL 27. Dez 2005 00:45

Re: PDF aus Delphi heraus öffnen
 
Zitat:

Zitat von Matze
... doch chm ist veraltet

:gruebel: Hä ? ;)

Guck in der Reg. nach ob der Reader installiert ist, wenn je starte ihn mit Shellexecute und als Parameter übergibst du ihm die PDF-Datei. :dance:

Matze 27. Dez 2005 08:33

Re: PDF aus Delphi heraus öffnen
 
Zitat:

Zitat von turboPASCAL
Zitat:

Zitat von Matze
... doch chm ist veraltet

:gruebel: Hä ? ;)

Ich dachte der Nachfolger ist das, was die aktuelle Delphi-Hilfe ist (Microsoft Document Explorer), kann mich aber auch irren. Nur die Erstellung von chm-Dateien ist auch mit diesem Microsoft HTML Help Workshop nicht so einfach, wie das Erstellen einer PDF.
Das Problem ist auch, dass ich eine PDF aus dem Internet 1:1 integrieren möchte, daher muss das mit PDFs klappen.

Zitat:

Zitat von turboPASCAL
Guck in der Reg. nach ob der Reader installiert ist, wenn je starte ihn mit Shellexecute und als Parameter übergibst du ihm die PDF-Datei. :dance:

  • Was, wenn jemand keinen Adobe Reader zum Betrachten von PDFs nutzt?
  • Wieso sollte ShellExecute dann gehen? Ich habe den Reader ebenfalls installiert und ShellExecute nützt nichts. Zuerst den Reader starten, dann ein zweiter Aufruf von ShellExecute hat auch nichts gebracht und das wäre mir auch zu unbrauchbar, diese Lösung. :(

Mich wundert halt, dass ich über den Explorer PDFs ganz normal starten kann, wo ja auch nur ein Parameter übergeben wird.

mschaefer 27. Dez 2005 10:25

Re: PDF aus Delphi heraus öffnen
 
Wahrscheinlich gibt es mehrere Möglichkeiten pdf-Files zuzuordnen. Bringt aber nichts auf dem Shellexecute zu bestehen. Dann bleibt das ActiveX. Bei VB gab es auch die Möglichkeit die ActiveX im Programmverzeichnis zu halten. Dann brauchte man d nichts zu installieren. Dann hättest Du alle Komponenten selbst zur Verfügung.

Grüße // Martin

Matze 27. Dez 2005 10:30

Re: PDF aus Delphi heraus öffnen
 
Oje danke, also ActiveX hatte ich auch nicht vor einzubinden vor allem nur wegen einer Verknüpfung zu einer Datei. :(

Flocke 27. Dez 2005 11:12

Re: PDF aus Delphi heraus öffnen
 
Wie sieht's denn in deiner Registry unter "HKEY_CLASSES_ROOT\pdf_auto_file\shell\Open" aus?

Matze 27. Dez 2005 11:30

Re: PDF aus Delphi heraus öffnen
 
:hi: Flocke

Es hat sich soeben gelöst, nach ewigem Suchen bin ich auf folgende Prozedur gestoßen.
Gefunden habe ich sie sogar bei uns, nur bis man da mal die richtigen Suchbegriffe findet (executefile war's).

Delphi-Quellcode:
uses
  ShellAPI;

   [...]

procedure ExecuteProgramm(const PFileName: string);
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
  ExecuteFile: string;
begin
  ExecuteFile:=PFileName;
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);

  with SEInfo do
  begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := PChar(ExecuteFile);
    nShow := SW_SHOWNORMAL;
  end;

  if ShellExecuteEx(@SEInfo) then
  begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or
      Application.Terminated;
  end else
  begin
    Application.MessageBox('Fehler beim Starten des Programms',
      'Programm Starten', mb_OK+mb_IconError);
  end;
end;
Und mit dieser geht's. :hello:
Danke für eure Hilfe. :)

mschaefer 27. Dez 2005 12:29

Re: PDF aus Delphi heraus öffnen
 
KLASSE ! Gut gemacht Matze!

Die Idee das als Dokumentation und eventuell Hilfeersatz zu nehmen ist ehedem prima. Na vielleicht kann man dem Windows-Handle auch noch die Tastendrücke zum gewünschten Suchbegriff oder zur Zielseite mitgeben. Und dann noch bei uns in der DP gefunden !

Find ich gut :P und viele Grüße // Martin

eF-eS 6. Jan 2006 19:27

Re: PDF aus Delphi heraus öffnen
 
Zitat:

Zitat von mschaefer
PS: Du kanst natürlich PDF auch im TWebBrowser öffnen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  webbrowser1.Navigate('c:\..\MyPDFFile.pdf');
end;

Die Lösung ist geil ... hatte gerade dasselbe Problem.

Prima!

Danke

eF-eS 6. Jan 2006 20:17

Re: PDF aus Delphi heraus öffnen
 
Zitat:

Zitat von eF-eS
Zitat:

Zitat von mschaefer
PS: Du kanst natürlich PDF auch im TWebBrowser öffnen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  webbrowser1.Navigate('c:\..\MyPDFFile.pdf');
end;

Die Lösung ist geil ... hatte gerade dasselbe Problem.

Prima!

Danke

Sorry, aber jetzt werde ich offtopic ... ich kann dieses Posting allerdings nicht verschieben ...

Ich habe mein Prog in irgendeinem Verzeichnis liegen c:\...\Prog die pdfs, die ich anzeigen möchte, liegen in einem Verzeichnis darunter, also c:\...\Prog\doku Bei der oben vorgestellten Lösung wird doch eine absolute Adresse verlangt. Wie kann ich erreichen, dass die pdf-Dateien in egal-welchem-Verzeichnis gefunden werden, also meinetwegen sowohl auf e:\meineProg\Prog\Doku als auch auf "d:\prog\Doku"?

Ich habe in Erinnerung, dass es irgendwelche Parameter gibt. ApplicationPath oder so. Aber: wie heißen die genau, und wie setze ich sie ein?

Matze 6. Jan 2006 20:46

Re: PDF aus Delphi heraus öffnen
 
Das übergeordnete Verzeichnis kannst du so ermitteln:

Delphi-Quellcode:
Pfad := ExtractFilePath(ExcludeTrailingPathDelimiter(Pfad));
Ob das die sauberste Lösung ist, kann ich dir nicht sagen.

Den Pfad zu deiner Anwendung erhälst du so:

Delphi-Quellcode:
ExtractFilePath(ParamStr(0))
Aber zukünftig bitte die Suche benutzen oder einen neuen Thread erstellen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 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