2010-08-05 9 views
6

Mi aplicación contiene documentos en su base de datos. Los usuarios pueden abrir los documentos, en cuyo caso, el documento se guarda en una carpeta temporal y se abre en la computadora del usuario.Notificación de Delphi cuando se actualiza un archivo

Me gustaría recibir una notificación cuando se modifique uno de estos archivos temporales y ofrecerle al usuario que guarde el documento modificado de nuevo en la base de datos.

¿Cuál es la manera más simple de hacer esto en Delphi7? (Supongo que requiere un poco de magia de concha o un componente de terceros)

¡Gracias!

+0

casos de llenado de los documentos? TRichEdit? TMemo? – zz1433

+0

Microsoft Excel – Steve

Respuesta

4

Puede:

  1. utilizar la función Win32 API SHChangeNotifyRegister para observar los cambios en la carpeta temporal, y luego tener su cheque de devolución de llamada si los archivos temporales están reportando cambios.

  2. Dado que conoce los archivos exactos que le interesan, puede controlarlos directamente para ver los cambios en sus tamaños y marcas de tiempo usando FindFirstFile en un temporizador o hilo.

8

Puede detectar cambios en sus archivos temporales (o cualquier archivo) utilizando el componente TJvChangeNotify de la colección JEDI JVCL.

+3

Prefiero no usar ningún componente JVCL porque he encontrado que son un poco problemáticos. No quiero hablar de tener que instalar los componentes de gazilion solo para tener el que realmente necesita ... – Steve

4

Además de lo RRuz y Remy Lebeau escribió:

Tenga en cuenta que TJvChangeNotify en la unidad JvChangeNotify hace uso de la llamada API FindFirstChangeNotification; this es la documentación de MSDN. Tenga en cuenta que es un poco contra-intuitivo: vea el hilo mencionado a continuación sobre cómo usarlo dentro de un ciclo while.

También hay la llamada ReadDirectoryChanges API, que no está envuelto por el JCL/JVCL, y tiene documentación de MSDN here y hay una Delphi win32 example también.

This thread explica las diferencias entre las dos llamadas de API.

--jeroen

+0

Gracias por la información, voy a verificar esto también. – Steve

2
+0

Tenga en cuenta que hay un error en esa biblioteca. Debe agregar Terminate en TDirWatchThread.Execute (después de SignalError (ErrorMessage)) - Sin esto, entra en un bucle infinito cuando elimina todos los archivos de la carpeta y luego la carpeta misma. Pasos para reproducir este error: cree una carpeta, supervise la carpeta, coloque los archivos en la carpeta, elimine TODOS los archivos de la carpeta, elimine la carpeta, congele la aplicación – Ampere

Cuestiones relacionadas