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
Acrobat ActiveX und speichern
Moderator: Moderatoren
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: Acrobat ActiveX und speichern
Hallo,
das ist meine Notlösung
Grüße
Rudolf
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
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
- HaPe
- 1000 working lines a day
- Beiträge: 996
- 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
Hallo Rudolf !
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.
Meine Lösung mit der Funktion RunProcess sieht so aus (VFP-Code):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.
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 )
Diese Möglichkeit verwende ich wenn zb. etwas mit einem anderen Programm berechnet werden soll, der Anwender aber noch weiterarbeiten kann.
--
Hans-Peter
Hans-Peter