Acrobat ActiveX und speichern

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Acrobat ActiveX und speichern

Beitrag von Rudolf »

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: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Acrobat ActiveX und speichern

Beitrag von Rudolf »

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
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Acrobat ActiveX und speichern

Beitrag von HaPe »

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
Antworten