Einzelnen Beitrag anzeigen

Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Datei aus dem Papierkorb wiederherstellen

  Alt 27. Aug 2014, 08:52
Vorneweg: Top!

Konvertiere das doch in eine Klasse. Einfach die lokalen Prozeduren in private Methoden überführen und die Hauptprozedur als public deklarieren.
Dann würde ich für das IDL-Zeugs kein Record nehmen, sondern eine Klasse und das in eine TObjectList packen. Damit ist das aufräumen erledigt (OwnsObject = true).
Deine Prozedur muss aufgeräumt werden. Ein 'try..finally LeerePIDLListe end' um alles herum erspaart dir die einzelnen Aufruf von 'LeerePIDLListe', denn bei einem 'exit' wird vorher der finally-Abschnitt aufgerufen.
Und dann würde ich jeden einzelnen Schritt in der Prozedur in eine eigene Methode packen, z.B. aus :
Delphi-Quellcode:
// code above gets the Recycle Bin IShellFoldr Interface in RecycleI
PapierkorbDateienAuflisten;
For i := 0 to PIDLListe.Count - 1 do begin
  If SameText(PPIDLItem(PIDLListe[i])^.Dateiname,Dateiname) then begin
    pItemIDL := PItemIDList(PPIDLItem(PIDLListe[i])^.IDL);
    break;
  end;
If i = PIDLListe.Count - 1 then begin
// das ist eh falsch, denn i ist = PIDLListe.Count, wenn nichts gefunden wurde
  // LeerePIDLListe;
  exit;
end;
wird (was passiert denn den da?)
Delphi-Quellcode:
Const
  NotFound = -1;
...
  i := FindeNameInListe(Dateiname);
  if i = NotFound then exit; //
  pItemIDL := PItemIDList(PPIDLItem(PIDLListe[i])^.IDL);
  ...
und
Delphi-Quellcode:
function TPapierkorb.FindeNameInListe (const Dateiname : String) : Integer;
Begin
  For result := 0 to PIDLListe.Count - 1 do
    If SameText(PPIDLItem(PIDLListe[result])^.Dateiname,Dateiname) then
      exit;

  Result := -1 // nicht gefunden
End;
Extrahiere die Einzelschritte so, das jeder Schritt genau einen kleinen Beitrag zur Gesamtlösung liefert. Hier: "Sucht einen Dateinamen in der Liste und liefert den Index oder -1, wenn der Name nicht gefunden wurde". Mehr macht das Teil nicht und mehr muss es auch nicht machen.

Deine Routine sähe dann in etwa so aus:
Delphi-Quellcode:
Procedure TPapierkorb.StelleDateiWiederher(const Dateiname : String);
...
begin
  Result := False;
  Try
    PIDLListe := TObjectList.Create(true);
    RecycleI := GetRecycleBinInterace();
    PapierkorbDateienAuflisten (PIDLListe);
    i := FindeNameInListe(Dateiname);
    if i=-1 then exit; //
    pItemIDL := PItemIDList(PPIDLItem(PIDLListe[i])^.IDL);
    
    If pItemIDL <> nil then
      RecycleFile(RecycleI, pItemIDL);
    Result := FileExists(Dateiname);
  finally
    PIDLListe.Free;
  end
end;
Das ist immer noch komplex (aus Sicht eines pingeligen Softwarearchitekten), aber wenn Du soweit bist, kann man noch weiter am Code rumschrauben, damit er verständlicher wird. Ziel sollte es sein, den Code ohne Kommentare intuitiv zu verstehen.
Eins zum Schluss: Ich habe deutsche und englische Bezeichnernamen vermischt: Ganz großer Käse! Entscheide dich für eine Sprache und dann zieh das durch. Vermeide Abkürzungen, außer, sie entsprechen dem Fachjargon ('PIDL')

Geändert von Dejan Vu (27. Aug 2014 um 08:58 Uhr)
  Mit Zitat antworten Zitat