Actualizar archivo
Hola, le cuento mi problema... yo tengo el 'p.bat' que me crea el archivo 'ticket.xml.cms' una vez creado, lo tomo y lo pongo en un memo, eso lo hago periodicamente, el tema es que siempre me toma el 'ticket.xml.cms' proximo anterior... es decir que no se actualiza mi 'ticket.xml.cms' antes de que yo lo quiera poner en el memo. Tendria que poner algo entre medio de estas dos lineas que me permita actulizar mi archivo 'ticket.xml.cms'.
winexec('p.bat', SW_HIDE); memo2.lines.LoadFromFile('ticket.xml.cms'); Espero me hayan entendido, de lo contrario con gusto respondere. Gracias desde ya. |
Creo que tu error puede venir porque accedes al fichero antes de que le de tiempo de generarse, ya que ShellExecute no espera a que se genere el fichero.
Busca en los foros sobre la función: WinExecAndWait32 que ha salido en otras ocasiones. Creo que si en lugar de ShellExecute utilizas esta, dará tiempo a que se genere. Prueba y ya dirás... |
A ver... bueno acá esta. encontré una función que tengo desde hace rato ratón.
Te comento que WinExec no se recomienda usarla más. Al menos eso decen los de Microsoft. Sólo quedó por compatibilidad y en su lugar se puede usar CreateProcess o (como hago yo) ShellExecute/ShellExecuteEx. El punto a tener en cuenta a tu problema es la función WaitForSingleObject.
un ejemplo sería: ShellExec('cmd','', SW_NORMAL, true); Si alguien se le ocurre alguna mejora, no duden en avisar así actualizo mi código. Especialmente se puede implementar un TimeOut. Por ejemplo, la función tirar error y/o esperar la intervención del usuario y, por consiguiente, colgarse, esperando indefinidamente. En caso de que se implemente un TimeOut, se puede tomar una acción como terminar el proceso creado o... qué se yo! Recueda de poner el cursor en espera antes y restaurarlo después ;) Paso algunos links de interés http://msdn.microsoft.com/en-us/libr...54(VS.85).aspx http://msdn.microsoft.com/en-us/libr...84(VS.85).aspx http://msdn.microsoft.com/en-us/library/ms682425.aspx http://msdn.microsoft.com/en-us/library/ms687032.aspx Seguro que están en castellano también... |
hola, muchas gracias por la pronta respuesta... pero he probado con la funcion WinExecAndWait32 y con la ShellExec y en ambas sigue sin actulizarse antes de que yo utilice el archivo. Alguna otra sugerencia... lo necesito si o si
|
are you sure?
qué hace p.bat? estás seguro que se está ejecutando? porque si ejecutas la función de arriba el control NO es devuelto hasta que lo que mandas a ejecutar no termina.
Haz una prueba y verás: ShellExec('cmd','', SW_NORMAL, true); Application.Terminate; Hasta que no escribes "exit" en la consola de comandos que se levanta, el programa no termina... otra prueba: hice un archivo p.bat conteniendo lo siguiente: echo Hola ClubDelphi! > c:\archivo.prueba Luego en un proyecto nuevo, en el OnFormCreate puse:
|
Otra opción sería intentar renombrar el último antes de generar el nuevo, y luego mandar el BAT.
Tu aplicación podrá esperar hasta que el fichero exista o hasta que se cumpl determinado tiempo de espera. De todas formas, habría que saber porqué lo anterior no está funcionando antes de probar otras cosas. |
hola, gracias a todos por sus respuestas. Creo que lo resolvi poniendo Timer entre medio de las dos lineas... porque p.bat se terminaba de ejecutar, pero entre que terminaba y el archivo aparecia en el directorio pasaban unos segundos, y en esos segundo es donde yo lo llamaba con el memo.
|
¿Y si borras el archivo antes de generarlo nuevamente?
|
hola maxium, mira he intentado hacer esto, pero cuando lo va a levantar el memo me tira un error de que 'ticket.xml.cms' esta siendo usado por otro proceso. Ya no se que hacer... un timer me lo soluciona.. pero es medio inestable no me convence demaciado. Si se te ocurre alguna cosa....te lo agradecere.
var nada:Integer; begin DeleteFile('ticket.xml.cms'); winexec('p.bat', SW_HIDE); While FileExists('ticket.xml.cms')=False do nada:=1; memo2.lines.LoadFromFile('ticket.xml.cms'); end; |
Yo uso esta funcion para poder imprimir en matriz de puntos, tuve que hacer algunas modificaciones pero nada del otro mundo, antes genero el informe en un plano y despues lo envia a impresora, sin ningun problema, hasta me di el gusto de ajustarlo para que lo hiciera a impresoras remotas en una red de windows XP (captura el puerto, lo envia a imprimir y despues lo descaptura)
Código:
|
Cita:
Código:
program Download; |
Otra solucion mas adecuada podria ser que tu bat genere un ticket.xml.cms.new y hacer algo como lo que sigue:
Algo largo, pero al menos te aseguras de la correcta lectura del archivo. Tambien puedes agregar algun control de excepciones adicionalmente. Ademas no impota cuanto tiempo demore en ejecutarse el .bat. Por otra parte, no has pensado en integrar la funcionalidad del bat en un ejecutable? o incluso en el mismo exe que contiene el memo? |
La franja horaria es GMT +2. Ahora son las 09:37:42. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi