2010-08-05 5 views
6

Meine App enthält Dokumente in ihrer Datenbank. Die Benutzer können die Dokumente öffnen. In diesem Fall wird das Dokument in einem temporären Ordner gespeichert und auf dem Computer des Benutzers geöffnet.Delphi-Benachrichtigung beim Aktualisieren einer Datei

Ich möchte eine Benachrichtigung erhalten, wenn eine dieser temporären Dateien geändert wird, und dem Benutzer anbieten, das geänderte Dokument zurück in die Datenbank zu speichern.

Was ist der einfachste Weg, dies in Delphi7 zu tun? (Ich nehme an, es erfordert etwas Shell Magie oder 3rd Party Komponente)

Vielen Dank!

+0

Wo werden die Dokumente eingelegt? TRichEdit? TMemo? – zz1433

+0

Microsoft Excel – Steve

Antwort

4

Sie können entweder:

  1. die Win32-API verwenden SHChangeNotifyRegister Funktion für Änderungen im temporären Ordner zu sehen, und dann Rückruf überprüfen, ob Ihre temporären Dateien Änderungen berichten.

  2. Da Sie die genauen Datei (en) kennen, an denen Sie interessiert sind, können Sie sie manuell auf Änderungen ihrer Größen und Zeitstempel mithilfe von FindFirstFile in einem Timer oder Thread überwachen.

8

Sie können Änderungen in Ihren temporären Dateien (oder einer Datei) mit der Komponente TJvChangeNotify aus der JEDI JVCL Sammlung erkennen.

+3

Ich bevorzuge keine JVCL-Komponenten zu verwenden, da ich festgestellt habe, dass sie irgendwie fehlerhaft sind. Nicht um über die Installation von Gazilion-Komponenten zu reden, nur um die zu haben, die Sie wirklich brauchen ... – Steve

4

Zusätzlich zu dem, was RRuz und Remy Lebeau schrieb:

Beachten Sie, dass TJvChangeNotify in der JvChangeNotify Einheit Verwendung des FindFirstChangeNotification API-Aufruf macht; this ist die MSDN-Dokumentation. Beachten Sie, dass es etwas kontraintuitiv ist: Sehen Sie sich den unten erwähnten Thread zur Verwendung in einer While-Schleife an.

Es gibt auch den ReadDirectoryChanges API-Aufruf, der nicht durch die JCL/JVCL gewickelt ist, und hat MSDN-Dokumentation here und es gibt ein Delphi win32 example auch.

This thread erläutert die Unterschiede zwischen den beiden API-Aufrufe.

--jeroen

+0

Danke für die Info, werde diese auch überprüfen. – Steve

2
+0

Bitte beachten Sie, dass in dieser Bibliothek ein Fehler vorliegt. Sie müssen Terminate in TDirWatchThread.Execute hinzufügen (nach SignalError (ErrorMessage)) - Ohne dies geht es in eine Endlosschleife, wenn Sie alle Dateien aus dem Ordner und dann den Ordner selbst löschen! Schritte, um diesen Fehler zu reproduzieren: Ordner erstellen, Ordner überwachen, Dateien in Ordner ablegen, ALLE Dateien aus Ordner löschen, Ordner löschen, App friert ein – Ampere

Verwandte Themen