Acrobat ActiveX und speichern

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Acrobat ActiveX und speichern

Beitragvon Rudolf » Mo, 12. Sep 2016 8:06

Hallo,
mit welcher Methode kann ich ein im ActiveX control speichern ? Ich benötige die Methode da mit dem normalen save Button im control immer ein falscher Dateiname angzeigt wird, setzt immer das Laufwerk und das Verzeichnis vorne dazu. Weder save() noch saveas() gibt es nicht. Ich erstelle ein editierbares PDF und zeige es zur Bearbeitung an. Muss es mit ActiveX machen da ich es werder mit runshell(), dc_spawnurl() von eXpress+ noch mit trunprocess von OT4XB geschafft habe dass das Programm wartet bis der Acrobat Reader beendet wird. Mit trunprocess sieht man genau dass sofort active auf .f. geht mit exitcode 1.
Grüße
Rudolf
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1166
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: Acrobat ActiveX und speichern

Beitragvon Rudolf » Mo, 12. Sep 2016 8:22

Hallo,
das ist meine Notlösung
Grüße
Rudolf


Code: Alles auswählen
function openfileasync(cFile,lWin,cText,cStatus)
******************************************************************
local oProcess := TRunProcess():New(),nWait := 25,nError := 0,cError := ""
local lActive  := NIL
local dwExitCode,cDefPrg := getstandardprogram(cFile)
default lWin to .f.
default cText to cFile
cStatus := ""
if !fexists(cFile) .or. empty(cDefPrg)
     return .f.
endif
 *oProcess:cAppName := cDefPrg
 *oProcess:cParams  := cFile
 oProcess:cCmdLine := cDefPrg + " " + cFile
 oProcess:lUseShowWindow := .T.
 oProcess:wShowWindow := oProcess:swHide
if oProcess:Start()
    do while .t.
          while !oProcess:Wait( nWait )   // Wait 0,25 seconds
          enddo
          if lWin
               if empty(WildFindWindow(cText))
                    exit
               endif
          else
               dwExitCode := oProcess:GetExitCode(@lActive)
               if dwExitCode == NIL
                    cError := "Fail retrieving the process exit code for " + cCmd
                    if nError++ > 10
                         exit
                    endif
               else
                    cStatus := "Exit Code: " + var2char(dwExitCode)
                    if !lActive
                         oProcess:Release()
                         exit
                    endif
               endif
          endif
     enddo
else
      cError := "Fail to start process"
endif
return cError
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
 
Beiträge: 1166
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich

Re: Acrobat ActiveX und speichern

Beitragvon HaPe » Mo, 12. Sep 2016 10:40

Hallo Rudolf !
Ich erstelle ein editierbares PDF und zeige es zur Bearbeitung an. Muss es mit ActiveX machen da ich es werder mit runshell(), dc_spawnurl() von eXpress+ noch mit trunprocess von OT4XB geschafft habe dass das Programm wartet bis der Acrobat Reader beendet wird.


Meine Lösung mit der Funktion RunProcess sieht so aus (VFP-Code):
Code: Alles auswählen
*-- Parameter:
*-- tcCommandLine: Zu startendes Programm
*-- tlWait:        Soll auf das Prozess-Ende gewartet werden
*-- tnShowWindow:  Anzeigemodus des zu startenden Programmes
LPARAMETERS tcCommandLine AS STRING, tlWait AS BOOLEAN, tnShowWindow AS INTEGER

LOCAL lcStartUp AS STRING, lcProcessInfo AS STRING, lnProcessHandle AS INTEGER
LOCAL lnShowWindow AS INTEGER

*-- Parameterprüfung
*-- Wenn kein Anzeigemodus übergeben wurde ...
IF VARTYPE( tnShowWindow ) # 'N'

   *-- ... zeigen wir den zu startenden Prozess normal an.
   lnShowWindow = 1

*-- Andernfalls ...
ELSE

   *-- ... verwenden wir den gewünschten Parameter
   lnShowWindow = tnShowWindow
ENDIF

*-- Parameter setzen für CreateProcess
lcStartUp = CHR( 68 ) + REPLICATE( NUL, 43 ) + CHR( 1 ) + REPLICATE( NUL, 3 ) + CHR( lnShowWindow ) +  REPLICATE( NUL, 19 )
lcProcessInfo = REPLICATE( NUL, 16 )

*-- Wenn der Prozess gestartet werden konnte
IF CreateProcess( 0, tcCommandLine, 0, 0, 0, 0, 0, 0, lcStartUp, @lcProcessInfo ) # 0

   *-- Ja, dann holen wir das Prozess-Handle
   lnProcessHandle = CTOBIN( SUBSTR( lcProcessInfo, 1, 4 ), 'RS' )

   *-- Soll auf das Prozess-Ende gewartet werden?
   IF tlWait

      *-- Ist der gestartete Prozess noch vorhanden?
      DO WHILE WaitForSingleObject( lnProcessHandle, WAIT_INTERVAL ) == WAIT_TIMEOUT

         *-- Ja, dann Events ermöglichen und WAIT_INTERVAL
         *-- (zur Zeit 250 ms) Millisekunden schlafen
         DOEVENTS
         Sleep( WAIT_INTERVAL )
      ENDDO

      *-- Prozess-Handle wieder schließen
      CloseHandle( lnProcessHandle )
   ENDIF

*-- Andernfalls konnte der Prozess nicht erzeugt werden
ELSE

   *-- Fehlernummer holen und dann Fehlermeldung ausgeben
   lcError = TRANSFORM( GetLastError() )
   THIS.oMess.ShowError( 'Prozess nicht startbar', 'Der Prozess ' + tcCommandLine + ' konnte wegen >' + lcError + '< nicht gestartet werden!' )

   *-- Prozess-Handle auf -1 (für nicht vorhanden) setzen
   lnProcessHandle = -1
ENDIF

RETURN( lnProcessHandle )


Optional merke ich mir das ProzessHandle und prüfe mittels Timer-Funktion wie in der obigen Funktion mittels WaitForSingleObject ob der Prozess noch läuft.
Diese Möglichkeit verwende ich wenn zb. etwas mit einem anderen Programm berechnet werden soll, der Anwender aber noch weiterarbeiten kann.
--
Hans-Peter
Benutzeravatar
HaPe
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 130
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz


Zurück zu Allgemeine Fragen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron