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')