2010-08-05 11 views
6

Mon application contient des documents dans sa base de données. Les utilisateurs peuvent ouvrir les documents, auquel cas le document est enregistré dans un dossier temporaire et est ouvert sur l'ordinateur de l'utilisateur.Delphi notification lorsqu'un fichier est mis à jour

Je voudrais recevoir une notification lorsque l'un de ces fichiers temporaires sont modifiés, et offrir à l'utilisateur d'enregistrer le document modifié à la base de données.

Quelle est la façon la plus simple de le faire en Delphi7? (Je suppose que cela nécessite un peu de magie shell ou d'un composant 3ème partie)

Merci!

+0

Où sont les documents chargés? TRichEdit? TMemo? – zz1433

+0

Microsoft Excel – Steve

Répondre

4

Vous pouvez:

  1. utiliser la fonction API Win32 SHChangeNotifyRegister pour surveiller les changements dans le dossier temp, et alors votre chèque de rappel si vos fichiers temporaires rapportent des changements. Comme vous connaissez le (s) fichier (s) exact (s) qui vous intéresse, vous pouvez les contrôler manuellement pour connaître les changements de taille et d'horodatage en utilisant FindFirstFile dans une minuterie ou un fil.

8

Vous pouvez détecter les modifications dans vos fichiers temporaires (ou n'importe quel fichier) à l'aide du composant TJvChangeNotify de la collection JEDI JVCL.

+3

Je préfère ne pas utiliser des composants JVCL depuis que je les ai trouvé à être une sorte de buggy. Ne pas parler d'avoir à installer des composants gazilion juste pour avoir celui dont vous avez réellement besoin ... – Steve

4

En plus de ce RRuz et Remy Lebeau a écrit:

Notez que TJvChangeNotify dans l'unité JvChangeNotify utilise l'appel API FindFirstChangeNotification; this est la documentation MSDN. Notez que c'est un peu contre-intuitif: voir le fil mentionné ci-dessous sur la façon de l'utiliser dans une boucle while.

Il y a aussi l'appel de l'API ReadDirectoryChanges, qui n'est pas enveloppé par le JCL/JVCL, et a la documentation MSDN here et il y a un Delphi win32 example aussi bien.

This thread explique les différences entre les deux appels API.

--jeroen

+0

Merci pour l'info, je vais vérifier ça aussi. – Steve

2
+0

S'il vous plaît noter qu'il ya un bug dans cette bibliothèque. Vous devez ajouter Terminate dans TDirWatchThread.Execute (après SignalError (ErrorMessage)) - Sans cela, il entre dans une boucle infinie lorsque vous supprimez tous les fichiers du dossier, puis le dossier lui-même! Étapes pour reproduire ce bogue: créer un dossier, surveiller le dossier, mettre les fichiers dans le dossier, supprimer tous les fichiers du dossier, supprimer le dossier, l'application se fige – Ampere