![]() |
auf Änderungen im Ordner reagieren
Wie kann ich, wenn eine Datei in einem Ordner erstellt, geändert bzw. gelöscht wird im Delphi darauf reagieren, dass sozusagen ein Ereignis ausgelöst wird.
danke schonmal.. |
Re: auf Änderungen im Ordner reagieren
|
Re: auf Änderungen im Ordner reagieren
ja danke, da sind jede menge komponenten dazu.
kann mir vielleicht jemand noch erklären, wie ich allgemein an dieses problem rangeh? |
Re: auf Änderungen im Ordner reagieren
Stichwort für das MSD:
![]() |
Re: auf Änderungen im Ordner reagieren
Bei mir gibt's bei Delphi die Komponente TShellChangeNotifier im Reiter Beispiele/Samples bei Delphi 6 und 7.
Wenn dich die API's interessieren, die dafür genutzt werden, dann schau dir einfach den Quelltext dazu von Borland an :P Übrigens bei Delphi 8 (also .NET) ist es der FileSystemWatcher ;-) |
Re: auf Änderungen im Ordner reagieren
danke luckie... das wollte ich wissen!!! und auch thx an alexander, werd mir die borland quellcodes auch mal reinziehen :-D
|
Re: auf Änderungen im Ordner reagieren
Moin Mumu,
für NT basierte Systeme kommt auch noch ReadDirectoryChangesW in Frage. |
Re: auf Änderungen im Ordner reagieren
Zitat:
ich habe dashier in einem Buch dazu gefunden. Nur wie rufe ich das ganze jetzt auf?
Delphi-Quellcode:
Vielen Dank!
unit DirChangeThread;
interface Uses Classes, Windows, Dialogs; Type TDirChange = Class(TThread) Private { Private-Deklarationen } Handle : THandle; Path : String; Protected Procedure Execute; Override; Procedure RefreshListBox; Destructor Destroy; Public { Public-Deklarationen } Constructor Create(Path : String); End; implementation Uses Unit1; Constructor TDirChange.Create(Path : String); Begin Inherited Create(False); Path := Path; FreeOnTerminate := True; End; Procedure TDirChange.Execute; Begin Handle := FindFirstChangeNotification(PChar(Path), FALSE, FILE_NOTIFY_CHANGE_NAME); If Handle <> INVALID_HANDLE_VALUE Then While True Begin If WaitForSingleObject(Handle, 500) = WAIT_OBJET_0 Then Begin Synchronize(RefreshListBox); End; FindNextChangeNotification(Handle); If Terminated Then Break; End; End; Procedure TDirChange.RefreshListBox; Begin Form1.FileListBox1.Update; End; Destructor TDirChange.Destroy; Begin If Handle <> NULL Then FindCloseChangeNotification(Handle); Inherited Destroy; End; end. |
Re: auf Änderungen im Ordner reagieren
Das ist doch ein ganz normales VCL-Thread-Objekt. Einfach wie jedes andere Objekt erzeugen. Weitere Infos hier:
![]() |
Re: auf Änderungen im Ordner reagieren
Hi,
leider hab ich noch nie mit Threads gearbeitet. Also ich habe im Buch den Aufruf so da stehen:
Delphi-Quellcode:
Jetzt weis ich aber nicht was Kontrolle sein soll.
If Kontrolle <> Nil Then
Kontrolle.Terminate; Kontrolle := TDirChange.Create(DirectoryListBox1.Directory); 2. ist wohl in dem Thread n Fehler drin. Denn der Compiler meckert hier rum:
Delphi-Quellcode:
Hinter NULL: Undefinierter Bezeichner NULL!
Destructor TDirChange.Destroy;
Begin If Handle <> NULL Then FindCloseChangeNotification(Handle); Inherited Destroy; End; Was muss da geändert werden? Danke! |
Re: auf Änderungen im Ordner reagieren
Kontrolle ist wohle ien Variable vom Typ TDirChange. Sieht man doch hier:
Delphi-Quellcode:
Das sind Grundlagen!
Kontrolle := TDirChange.Create(DirectoryListBox1.Directory);
Und aus was für eine Buch hast du das Beispiel? NULL ist das C/C++ Gegenstück zu Nil in Delphi. |
Re: auf Änderungen im Ordner reagieren
Hi,
so meinte ich die Frage aber net auf was Kontrolle ist. Denn ich wollte eher wissen warum dann kein Var-Abschnitt ist wie z. B.:
Delphi-Quellcode:
Und dann eben erst der Code initialisiert wird wie z. B. bei IniFiles oder was auch immer auch mit:
Var
Kontrolle : TDirChange;
Delphi-Quellcode:
Desweiteren:
Begin
Kontrolle := TDirChange.Create(...); Ich habe Nil verwendet. Operator kann auf diesen Operanten nicht angewendet werden! |
Re: auf Änderungen im Ordner reagieren
Zitat:
teste mal auf <> 0. Ich vermute mal das handle vom Typ THandle oder Cardinal ist. |
Re: auf Änderungen im Ordner reagieren
Hi,
so sieht mein Code jetzt aus:
Delphi-Quellcode:
Jetzt kommt in der Zeile <> 0 als Fehler:
procedure TForm1.DirectoryListBox1Change(Sender: TObject);
Var Kontrolle : TDirChange; begin If Kontrolle <> 0 Then Kontrolle.Terminate; Kontrolle := TDirChange.Create(DirectoryListBox1.Directory); end; Inkompatible Typen :-( Was mach ich denn da nur falsch? |
Re: auf Änderungen im Ordner reagieren
Moin MackHack,
tausch mal 0 gegen nil aus. |
Re: auf Änderungen im Ordner reagieren
Hallo,
weis jemand warum ich als Hinweis folgendes bekomme: Auf Kontrolle zugewiesener Wert wird niemals benutzt. Weis jemand wie ich jetzt mit Hilfe dieses Codes auch rausbekommen kann welche Dateien verändert wurden? Danke! |
Re: auf Änderungen im Ordner reagieren
Zitat:
|
Re: auf Änderungen im Ordner reagieren
:-)
Lucky kannst du mir dabei noch bitte helfen wie ich rausbekommen kann welche Datei verändert wurde? Vielen Dank! |
Re: auf Änderungen im Ordner reagieren
Hi,
Find*ChangeNotification() liefert dir leider nicht die Datei zurück, welche verändert worden ist. Du müsstest einen "Snapshot" des Verzeichnisses erstellen, welches überwacht wird und wenn Find*ChangeNotification() eine Veränderung mitteilt, wieder einen "Snapshot" erstellen. Am Schluss werden dann die beiden Snapshots verglichen und du weisst dann, welche Datei verändert worden ist. Unter NT gibt's die ReadDirectoryChangesW(): ![]() |
Re: auf Änderungen im Ordner reagieren
Aber macht das ReadDirectoryChangesW nicht das gleiche wie das FindFirstChangeNotification auch?
Oder verstehe ich grad den Text in der MSDN nicht richtig? Wenn nicht, könntest du mir da vielleicht ein wenig helfen? |
Re: auf Änderungen im Ordner reagieren
Moin!
Mach das mit dem SnapShot und merke dir die Dateigrössen und vergleiche beim auslösen der Notification die Grössen. Danach einfach die aktuellen Grössen der Dateien merken bis zum nächsten mal. MfG Muetze1 |
Re: auf Änderungen im Ordner reagieren
Danke Mütze1,
so wie besprochen :-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz