Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Warum gibt es hier eine Acess Violation?

  Alt 8. Dez 2018, 14:27
Aber der Grund für meine Konstruktion mit der Unterprozedur war ja der, dass ich bei dieser Implementation innerhalb von FindeDateiRM auf Strukturen der Klassenmethode zugreifen will, die nicht global erreichbar sind.
Von dieser Forderung wirst du dich verabschieden müssen. Es gibt keinen praktikablen Weg, wie du über ein Callback an eine lokale Variable einer Methode kommen kannst.

Was aber geht wäre sowas:

Delphi-Quellcode:
type
  TBldListeWrapper = class
  private
    FBldListe: TBldListe;
  public
    constructor Create(ABldListe: TBldListe);
    procedure FindeDateiRM(const BasisVerz:string;const Data:TWin32FindDataW;var Abbrechen:Boolean);
  end;

constructor TBldListeQrapper.Create(ABldListe: TBldListe);
begin
  inherited Create;
  FBldListe := ABldListe;
end;

procedure TBldListeWrapper.FindeDateiRM(const BasisVerz:string;const Data:TWin32FindDataW;var Abbrechen:Boolean);
var Bld:TBld;
begin
  Bld := TBld.Create;
  Bld.Name := string(Data.cFileName);
  FBldliste.add(Bld);
end;

procedure TForm1.ErstelleListe;
var Bldliste:TBldliste;
begin

  procedure Intialisiere;
  begin
    Bldliste := TBldliste.Create(True);
  end;

  procedure ListeDateienAuf;
  var
    wrapper: TBldListeWrapper;
  begin
    wrapper := TBldListeWrapper.Create(BldListe);
    try
      FindeDateien(VerzListe[i],'*',False,wrapper.FindeDateiRM,Abbrechen);
    finally
      wrapper.Free;
    end;
  end;

end;
Oder man erweitert TBldListe :
Delphi-Quellcode:
type
  TExtendedBldListe = class(TBldListe);
  public
    procedure FindeDateiRM(const BasisVerz:string;const Data:TWin32FindDataW;var Abbrechen:Boolean);
  end;

procedure TExtendedBldListe.FindeDateiRM(const BasisVerz:string;const Data:TWin32FindDataW;var Abbrechen:Boolean);
var Bld:TBld;
begin
  Bld := TBld.Create;
  Bld.Name := string(Data.cFileName);
  add(Bld);
end;


procedure TForm1.ErstelleListe;
var Bldliste:TExtendedBldliste;
begin

  procedure Intialisiere;
  begin
    Bldliste := TExtendedBldliste.Create(True);
  end;

  procedure ListeDateienAuf;
  begin
    FindeDateien(VerzListe[i],'*',False,BldListe.FindeDateiRM,Abbrechen);
  end;

end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat