Hier mal der Quellcode der eigentlichen
Unit:
Delphi-Quellcode:
unit FileChanged;
interface
uses
Classes,Windows,Dialogs;
type
TThreadFileChanged =
class(TThread)
private
ChangeHandle: THandle;
WatchFile:
String;
{ Private-Deklarationen }
protected
procedure Execute;
override;
procedure AskAfterFileChanged;
public
constructor Create(AWatchFile:
String);
destructor Destroy;
end;
implementation
uses MainForm, SysUtils, MySynEdit;
{ TThreadFileChanged }
procedure TThreadFileChanged.AskAfterFileChanged;
begin
if f_MainForm.Editor.HasFileChanged = true
then
f_MainForm.FileHasChanged;
end;
constructor TThreadFileChanged.Create(AWatchFile:
String);
begin
inherited Create(False);
WatchFile:= AWatchFile;
FreeOnTerminate := True;
Priority := tpIdle
end;
destructor TThreadFileChanged.Destroy;
begin
if Self.ExternalThread = True
then begin
Exit;
end;
if ChangeHandle <> 0
then
FindCloseChangeNotification(ChangeHandle);
inherited Destroy;
end;
procedure TThreadFileChanged.Execute;
begin
{ Thread-Code hier einfügen }
ChangeHandle := FindFirstChangeNotification(PChar(WatchFile),False,FILE_NOTIFY_CHANGE_LAST_WRITE);
if ChangeHandle <> INVALID_HANDLE_VALUE
then
// Hier wird im 500 ms-Takt die Datei auf Änderungen überprüft.
while True
do begin
if WaitForSingleObject(ChangeHandle,500) = WAIT_OBJECT_0
then begin
Synchronize(AskAfterFileChanged);
FindNextChangeNotification(ChangeHandle);
if Terminated
then Break;
end;
end;
end;
end.
Hier noch einige Proceduren die den Thread starten und stoppen:
Delphi-Quellcode:
procedure Tf_MainForm.StartFileChangedThread;
begin
// Thread zur Verzeichnisüberprüfung starten
if SysUtils.ExtractFileDir(Editor.FileName) <> ''
then
FFileChanged := TThreadFileChanged.Create(SysUtils.ExtractFileDir(Editor.FileName));
end;
procedure Tf_MainForm.StopFileChangedThread;
begin
// Thread für Dateiüberwachung ausschalten
if FFileChanged <> nil then
begin
// Nur wenn kein external Thread dann stoppen.
if FFileChanged.ExternalThread = True
then begin
Exit;
end;
FFileChanged.Terminate;
FFileChanged := nil;
end;
end;
Die beiden Proceduren
StartFileChangedThread und
StopFileChangedThread werden immer innerhalb eines Vorgans aufgerufen.
Natürlich wird erst der Thread gestoppt, die Tabseite geweichselt oder die Datei abgespeichert und danach der Thread wieder gestartet.
Die Aufrufe finden jeweils über die beiden Proceduren statt.
Vielleicht hat ja jemand eine Idee.
Danke