Seite 1 von 1

Reader vollständig anzeigen [Erledigt]

Verfasst: Di, 07. Jun 2011 18:08
von Jan
Ich weiß nicht, was ich da falsch mache. Ich möchte gerne eine PDF im Adobe Reader anzeigen. Aber:

Wenn ich die mit CreateObject() aufrufe, dann wird ohne jede Fehlermedlung der Code durchlaufen, aber nichts passiert. oReader:LoadFile() gibt aber .F. zurück.

Wenn ich das mit XbpActiveXControl() mache, dann wird alles ordentlich durchlaufen. Die PDF wird mit LoadFile() auch geöffnet (exakt die gleiche Zeile wie bei CreateObject übrigens! Hier klappt es merkwürdiger Weise). Aber ohne den Reader-Rahmen, Menü, etc. Nur die Werkzeugleiste und die Scrollbars sind da. Ich finde auch keine Methode, wie zumindest die Menüleiste eingeblendet werden kann.

Weiß jemand da Abhilfe?

Jan

Re: Reader vollständig anzeigen

Verfasst: Di, 07. Jun 2011 20:27
von AUGE_OHR
Jan hat geschrieben:Wenn ich die mit CreateObject() aufrufe, dann wird ohne jede Fehlermedlung der Code durchlaufen, aber nichts passiert. oReader:LoadFile() gibt aber .F. zurück.
... und wie willst du bei CreateObject() auf Events "reagieren" ?
Jan hat geschrieben:Wenn ich das mit XbpActiveXControl() mache, dann wird alles ordentlich durchlaufen. Die PDF wird mit LoadFile() auch geöffnet (exakt die gleiche Zeile wie bei CreateObject übrigens! Hier klappt es merkwürdiger Weise). Aber ohne den Reader-Rahmen, Menü, etc. Nur die Werkzeugleiste und die Scrollbars sind da. Ich finde auch keine Methode, wie zumindest die Menüleiste eingeblendet werden kann.
was sagt denn das Demo C:\ALASKA\XPPW32\Source\samples\activex\acrobat\main.prg ?

Re: Reader vollständig anzeigen

Verfasst: Di, 07. Jun 2011 21:01
von Jan
Jimmy,

ich möchte gerne eine PDF im Reader öffnen. Und das soll so aussehen, als hätte ich die PDF aus dem Reader heraus geöffnet. Aber wenn ich das über ActivX mache, dann fehlt der wichtigste Teil, nämlich der Adobe-Rahmen mit dem Menü. Mache ich das über Runshell(), dann klappt das wie gewünscht. Aber leider hat nicht jeder den Reader im gleichen Pfad installiert, und damit ist der Knall vorprogrammiert.

Die Alaska-Demo hilft da in keinster Weise weiter.

Jan

Re: Reader vollständig anzeigen

Verfasst: Di, 07. Jun 2011 21:06
von AUGE_OHR
Jan hat geschrieben:ich möchte gerne eine PDF im Reader öffnen. Und das soll so aussehen, als hätte ich die PDF aus dem Reader heraus geöffnet. Aber wenn ich das über ActivX mache, dann fehlt der wichtigste Teil, nämlich der Adobe-Rahmen mit dem Menü.
dafür gibt es dann den DSOframer.

Re: Reader vollständig anzeigen

Verfasst: Di, 07. Jun 2011 21:19
von Jan
... aber nicht unter Windos 7 64 Bit. Da streikt der leider, im Internet ein viel diskutiertes Problem. Und zum eigenen Leidwesen auch schon selber erfahren.

Jan

Re: Reader vollständig anzeigen

Verfasst: Di, 07. Jun 2011 21:32
von AUGE_OHR
Jan hat geschrieben:... aber nicht unter Windos 7 64 Bit.
ok ... das hast du aber nicht vorher gesagt ;)
dein Wunsch ist aber genau das was wohl die Hersteller NICHT wollen denn dann sieht es ja so aus als wenn das Produkt "von dir" wäre ...

... irgendjemand ( vermutlich Pablo ) sagt mir mal das man "jedes" Programm "von aussen" ansteuern könnte wenn es die "Windows Eventschleife" benutzen würde ...
für Xbase++ muss man dazu eine SubClass anlegen

Code: Alles auswählen

   ::hXbp    := ::GetHWND()
   ot4xb_subclasswindow(::hXbp,Self,0,"xbp_wndproc")
...
INLINE METHOD xbp_wndproc( hWnd,nMsg,wp,lp,ctx)
   DO CASE
      CASE nMsg == WM_*     // hier werden WM_* Events erwartet
aber frage mich nicht wie man das mit dem Adobe Reader zusammen bekommt ...

Re: Reader vollständig anzeigen

Verfasst: Di, 07. Jun 2011 21:33
von Jan
Ich frage mich, warum das nicht klappt. Wenn ich Excel oder Word per ActiveX starte, dann erscheinén die doch auch vollständig. Warum nicht der Adobe Reader?

Jan

Re: Reader vollständig anzeigen

Verfasst: Di, 07. Jun 2011 21:53
von AUGE_OHR
Jan hat geschrieben:Ich frage mich, warum das nicht klappt. Wenn ich Excel oder Word per ActiveX starte, dann erscheinén die doch auch vollständig. Warum nicht der Adobe Reader?
weil er keine Commandbar hat ?

der "Vorteil" von der "Ribbonbar" ist doch das man die ausblenden/verschieben kann wie man will
während ein Menu immer von einem Dialog abhängig ist wie ihn DOSframer "simulieren" kann.

Re: Reader vollständig anzeigen

Verfasst: Mi, 08. Jun 2011 7:28
von Koverhage
Jan,

Du kannst nicht nur davon ausgehen, das jeder Anwender den Reader an gleicher Stelle hat, sondern den
überhaupt einsetzt.
Hubert macht das in HBPRINTPDF (wie ich übrigens auch), prüfen welches Standardprogramm für
pdf Dateien eingetragen ist, dieser wird dann über runshell aufgerufen.
Falls der Anwender keinen installiert hat, kannst Du das ja sogar als Service anbieten.

Re: Reader vollständig anzeigen

Verfasst: Mi, 08. Jun 2011 8:43
von Jan
Jimmy,

es fehlt nicht nur die Menüleiste, es fehlt der komplette Rahmen. Und bei MS-Ofice-Programmen wird das jeweilige Programm vollständig angezeigt. Und es gibt anscheinend auch keine Methode, mit der ich beides aufrufen kann. Toolbar etc. kann man ja ein- oder ausschalten. Aber die Menüleiste nicht :angry1:

Klaus,

in diesem Fall gehe ich davon aus, das der Adobe Reader installiert ist. Das kann ich voraussetzen. Ich kann aber nicht voraussetzen, das der Pfad immer der gleiche ist, und damit funktioniert Runshell nicht mehr, obwohl darüber der Reader genau so gestartet wird, wie ich das brauche.

Grundsätzlich stellt sich mir einfach die Frage, warum der Reader so reagiert. 1) Warum geht das über CreateObject() garnicht, ohne jede Fehlermeldung, und 2) warum nur abgespeckt über XbpActiceXControl()?

Jan

Re: Reader vollständig anzeigen

Verfasst: Mi, 08. Jun 2011 8:49
von Manfred
Jan,

kannst Du nicht über die Registry abfragen, wo der Reader installiert ist und dann damit arbeiten?

Re: Reader vollständig anzeigen

Verfasst: Mi, 08. Jun 2011 9:05
von AUGE_OHR
Jan hat geschrieben:es fehlt nicht nur die Menüleiste, es fehlt der komplette Rahmen. Und bei MS-Ofice-Programmen wird das jeweilige Programm vollständig angezeigt. Und es gibt anscheinend auch keine Methode, mit der ich beides aufrufen kann. Toolbar etc. kann man ja ein- oder ausschalten. Aber die Menüleiste nicht :angry1:
Achtung URL geht auf eine 400 Seiten PDF, also rechte Maustaste und abspeichern.
http://partners.adobe.com/public/develo ... erence.pdf
darin ist dann die
Adobe Acrobat 7.0.5
Acrobat Interapplication Communication Reference
enthalten.

Re: Reader vollständig anzeigen

Verfasst: Mi, 08. Jun 2011 9:17
von brandelh
Jan hat geschrieben:Klaus,
in diesem Fall gehe ich davon aus, das der Adobe Reader installiert ist. Das kann ich voraussetzen.
Ich kann aber nicht voraussetzen, das der Pfad immer der gleiche ist, und damit funktioniert Runshell nicht mehr, obwohl darüber der Reader genau so gestartet wird, wie ich das brauche.
genau das meinte Klaus mit dem Verweis auf mein HBPrintPDF, dort habe ich im Beispiel eine Funktion hinterlegt, die ermittelt welcher PDF Writer zu verwenden ist und die Ergebnisse anzeigt.
Schauen wir mal nach ... ;-)

Eventuell muss man die Pfad und Programmvariablen noch mit " umschließen um Blanks bedienen zu können, dann wäre es:

Code: Alles auswählen

runshell(chr(34)+cPfad+cPDF+chr(34),chr(34)+cAcrobat+chr(34),.t.)
Ich bin mir da aber nicht sicher.

Code: Alles auswählen

#include "ot4xb.ch"      // FindExecutableA() könnte man auch direkt mit dllfunction() aufrufen, denke ich ;-) 
...
set charset to ansi       // müsste bei dir auch anders gehen.
...
cAcrobat := "C:\Programme\Adobe\Reader 9.0\Reader\AcroRd32.exe"  // früher habe ich alle vorgegeben, aber ...
cPDF     := "HelloFromDLL.pdf"
cPfad    := cAppPath()  // ot4xb
...
if file(cPfad+cPDF)  // nur wenn eine PDF erzeugt wurde, aber mit den vollständigen Pfad !
   if ! file(cAcrobat) // wenn der Acrobat da nicht liegt, das standard Programm nutzen.
        cAcrobat := GetStandardProgramm(cPDF, cPfad)
   endif
   runshell(cPfad+cPDF,cAcrobat,.t.)
endif
...
*--------------------------------------------------------------------------
function GetStandardProgramm(cFile, cPath)
   local cExe := ChrR(0,260) // MAX_PATH is 260
   if @shell32:FindExecutableA(cFile, cPath, @cExe) < 32
      cExe := ""
   else
      cExe := TrimZ(cExe)
   end
return cExe

Re: Reader vollständig anzeigen

Verfasst: Mi, 08. Jun 2011 23:22
von Martin Altmann
Moin,
wenn Du davon ausgehen kannst, dass ein Reader installiert ist, kannst Du die pdf einfach starten (runshell). Die wird dann im Standardprogramm, das fuer PDF auf dem PC konfiguriert ist, angezeigt.

Viele Gruesse,
Martin

Re: Reader vollständig anzeigen

Verfasst: Do, 09. Jun 2011 3:19
von Lewi
In Anlehnung dessen, was Martin in Bezug zur Standardanwendung darlegt, wäre eine Aufruf der Windows Api-Funktion "aShellExeCute" der richtige Weg, um z.B. PDF-Dokumente mit der für diese Extention innerhalb von Windows konfigurierten Standardanwendung zu öffnen bzw. zu drucken. Diverse Code-Beispiele sind unter der Suchfunktion dieses Forums zu finden.

Der Vorteil dieser Funktion liegt aus Entwicklersicht darin, dass nicht festgestellt werden muß, welcher PDF-Reader als "Standard" definiert ist bzw. wo er sich befindet. Über die Return-Codes dieser Funktion können auch diverse Fehler ausgewertet werden.

Gruß, Olaf

Re: Reader vollständig anzeigen

Verfasst: Do, 09. Jun 2011 5:45
von AUGE_OHR
Jan hat geschrieben:Die Alaska-Demo hilft da in keinster Weise weiter.
ich habe mit dem Demo noch mal rum-gespielt und gemerkt das es sich ja "nur" um das "Anzeige" ( Browse ) Modul handelt mit der
CLSID {CA8A9780-280D-11CF-A24D-444553540000} oder "AcroPDF.PDF"
AxAcroPDFLib.AxAcroPDF
An object containing a set of methods that provide access to PDF browser controls. This is a creatable interface. This object makes it possible to load a file, move to various pages within the file, and specify various display and print options.
tja "mehr" kann man mit "dem" Object nicht.

wenn ich nun in der Registry die CLSID suche finde ich noch eine ganze Menge "mehr" die "ähnlich" aussehen
Acrobat_OLE_Methods.JPG
Acrobat_OLE_Methods.JPG (150.93 KiB) 17921 mal betrachtet
die Angaben in der Registry habe ich nun in dem angegebenen 400 Seiten PDF gesucht sowie den Begriff "Menu" und diverse Methoden gefunden.

jedoch ist scheinbar keiner der Methoden zum "aufbauen" eines Menus gedacht sondern zum "abfragen" und "ausführen" von Menu Items.

wenn ich nun WinID nehme "sehe" ich das dass Menu zum Dialog gehört, so wie es ja sagte.
du musst also selbst das Menu in dein Dialog einbauen und dann das "HMENU" ( Vermutung )
vom Menubar ( XbpMenuBar():getHWND() ) an "AcroExch.App" übergeben wo es die Methode(n) gibt.

man muss also mit "mehr" als einem ActiveX arbeiten so wie es bei Codejock auch oft der Fall ist.
Jan hat geschrieben:Wenn ich Excel oder Word per ActiveX starte, dann erscheinén die doch auch vollständig.
ich sage ja das es eine "Commandbar" ist die nicht Dialog "abhängig" ist.
somit kann man die "Commandbar" an-/ab- stellen ähnlich einer Toolbar.

Menu -> Dialog abhängig, immer direkt unter der Titlebar
Toolbar -> auf der o:drawingArea. sinnvoll nur an den 4 Rändern
Commandbar ( Ribbon ) -> frei platzierbar auch auf dem AppDeskTop()

Re: Reader vollständig anzeigen

Verfasst: Do, 09. Jun 2011 5:50
von AUGE_OHR
Martin Altmann hat geschrieben:wenn Du davon ausgehen kannst, dass ein Reader installiert ist, kannst Du die pdf einfach starten (runshell). Die wird dann im Standardprogramm, das fuer PDF auf dem PC konfiguriert ist, angezeigt.
das gilt natürlich nicht nur für PDF sondern alle Datei Typen

Code: Alles auswählen

FUNCTION SHELLOPENFILE(cPath, cFILE )
LOCAL lSuccess
LOCAL Retvar := .F.
/*----------------------------------------------------------
  Created from ContactUs.PRG
  Posted to Alaska Generic NG 3/15/01
  By Anand K Gupta  Sun, 24 Dec 2000
----------------------------------------------------------- */
* #define SW_HIDE             0
* #define SW_NORMAL           1
* #define SW_SHOWMINIMIZED    2
* #define SW_SHOWMAXIMIZED    3
* #define SW_MAXIMIZE         3
* #define SW_SHOWNOACTIVATE   4
* #define SW_SHOW             5
* #define SW_MINIMIZE         6
* #define SW_SHOWMINNOACTIVE  7
* #define SW_SHOWNA           8
* #define SW_RESTORE          9
* #define SW_SHOWDEFAULT      10
* #define SE_ERR_NOASSOC 31

   lSuccess := DllCall( "SHELL32.DLL"  , DLL_STDCALL, ;
            "ShellExecuteA", AppDesktop():GetHWND(), "open", cPath+cFile,;
            NIL, CurDir(), SW_NORMAL )  // SW_MAXIMIZE

   DO CASE

   CASE lSuccess > 32                  // Aufruf erfolgreich
      Retvar := .T.

   Case lSuccess = SE_ERR_NOASSOC      // Keine verknüpfte Anwendung

      // Falls ShowOpenWithDialog = True, wird der Dialog
      // "Öffnen mit" für diese Datei angezeigt:
      // Shell "RunDLL32 shell32.dll,OpenAs_RunDLL " & Filename

      DllCall( "SHELL32.DLL"  , DLL_STDCALL, ;
            "OpenAs_RunDLL", AppDesktop():GetHWND(), NIL, cPath+cFile,;
            NIL, CurDir(), SW_NORMAL )  // SW_MAXIMIZE

      //  Die Auswahlmöglichkeit wird als Erfolg gewertet:
      Retvar := .T.
   OTHERWISE
      // ShellExecute war erfolglos.
      // Boolean-Standardwert False zurückgeben

      Retvar := .F.
   ENDCASE

RETURN Retvar

Re: Reader vollständig anzeigen

Verfasst: Do, 09. Jun 2011 9:39
von Martin Altmann
Jimmy,
klar gilt das grundsaetzlich :!: Ist auch am einfachsten so.

Viele Gruesse,
Martin

Re: Reader vollständig anzeigen

Verfasst: Do, 09. Jun 2011 17:34
von Jan
OK, hat 1a geklappt mit dem Code von Jimmy. Danke.

Jan