Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#17

AW: Warum gibt es hier eine Acess Violation?

  Alt 8. Dez 2018, 12:44
Die Deklaration von TFindeDateiRM brauchst du schon um den Parameter zu deklarieren. Allerdings sind hier für die Übergabe keine lokalen Unterroutinen erlaubt, sondern nur globale Prozeduren oder statische Klassenmethoden. Meiner Meinung nach fehlt bei dieser Deklaration noch ein Kontext.

Wenn du die Deklaration von TFindeDateiRM nach deinen Bedürfnissen anpassen kannst, dann bietet sich folgende Lösung an:

TFindeDateienRM = procedure(const Verzname:string;const Data:_WIN32_FIND_DATAW;var Abbr:Boolean) of object; Durch das of object wird zu der Methoden-Adresse noch die Objekt-Instanz übergeben (die Prozedurvariable wird dadurch zu einer Methodenvariable). So kannst du unterschiedliche Klassen deklarieren, die auf die jeweiligen Bedürfnisse zugeschnitten sind. Als Parameter für FindeDateien wird dann jeweils MeineInstanz.FindeDateiRM angegeben.

Delphi-Quellcode:
TEineKlasse = class
public
  procedure FindeDateiRM(const Verzname:string;const Data:_WIN32_FIND_DATAW;var Abbr:Boolean);
end;

TAndereKlasse = class
public
  procedure FindeDateiRM(const Verzname:string;const Data:_WIN32_FIND_DATAW;var Abbr:Boolean);
end;

...
  EineInstanz := TEineKlasse.Create;
  try
    FindeDateien(VerzListe[i], '*', False, EineInstanz.FindeDateiRM, Abbrechen);
  finally
    EineInstanz.Free;
  end;
...
  AndereInstanz := TAndereKlasse.Create;
  try
    FindeDateien(VerzListe[i], '*', False, AndereInstanz.FindeDateiRM, Abbrechen);
  finally
    Anderenstanz.Free;
  end;

TEineKlasse und TAndereKlasse halten dann die nötigen Strukturen vor (z.B. BldListe ), mit denen die jeweilige Methode FindeDateiRM arbeiten muss.

Sollte die bisherige Deklaration von TFindeDateiRM allerdings extern vorgegeben sein, gibt es zwar auch Lösungen, die sind aber alle irgendwie hässlich.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat