Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Reguläre Prozedur in Methodenzeiger umwandeln

  Alt 24. Mai 2017, 14:48
Hallo,

ich habe mich - wie angekündigt - des Themas Verzeichnisüberwachung angenommen und das ganze ohne TObject in einen Thread gepackt. In einer Windows-Anwendung mit VCL klappt das ganze prima. Ich brauche es aber für die Konsole und da geht "der Spaß" erst richtig los.
Wenn ich versuche, meine Prozedur mit exakt dem definierten Kopf zu übergeben, bekomme ich die Fehlermeldung E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur' . Wenn ich den Lösungsvorschlag von hier nutze, wird das Programm zwar kompiliert, es kommt aber kein Ereignis an

Es geht um folgenden Code(ausschnitt):
Delphi-Quellcode:
Program DirMon.nonVCL;

{$APPTYPE CONSOLE}

Uses
   System.SysUtils,
   DirMonitor in '..\DirMonitor.pas';

Procedure ShowChange(Action: TAction; FileName: String);
Var
   S               : String;
Begin
   S:= FormatDateTime('yyyy.mm.dd hh:nn:ss ', Now);
   Case Action Of
      faADDED            : S:= '[ADD] "' + FileName + '"';
      faREMOVED         : S:= '[DEL] "' + Filename + '"';
      faMODIFIED         : S:= '[MOD] "' + FileName + '"';
      faRENAMED_OLD_NAME: S:= '[REN] "' + FileName + '" (old name)';
      faRENAMED_NEW_NAME: S:= '[REN] "' + FileName + '" (new name)';
   End;
   WriteLn(S);
End;

Var
   T               : TMethod;
   Run            : Boolean = True;
   KeyBuffer      : String = '';
   KeyInput         : Char;
Begin
   Try
      T.Code:= @ShowChange;   // <- https://www.entwickler-ecke.de/viewtopic.php?t=31378
      With TDirMonitor.Create('C:\', TDirEvent(T)) Do // <- Ereignisse kommen nicht an
      With TDirMonitor.Create('C:\', ShowChange) Do // <- wird nicht kompiliert
      Try
         While Run Do                              // ständig wiederholen
         Begin
            Sleep(60);                              // kurz schlafen legen

// Programm einfach am "Leben" erhalten ...

         End;
      Finally
         Free;                                       // das Thread-Objekt freigeben
      End;
   Except
      On E: Exception Do Writeln(E.ClassName, ': ', E.Message);
   End;
End.
Wie löst man das Problem?

Ich habe allein in der DP 3 Funde zu diesem Thema gefunden und natürlich gelesen. Diese landen allesamt auf vorderen Plätzen bei der google-Suche. Aber ich komme auf keine Lösung. Die VCL-Variante klapp. Ich habe mal den Code als zip-Datei angehängt.
Angehängte Dateien
Dateityp: zip Small_DirMon.zip (5,1 KB, 7x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat