Einzelnen Beitrag anzeigen

C.Schoch

Registriert seit: 2. Jan 2006
Ort: Wüstenrot
235 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: suche Funktion FindLastDir

  Alt 15. Nov 2007, 00:05
Zitat von bluescreen25:
Wow, ansatzweise hatte ich das auch noch so hinbekommen, scheiterte an Einzelheiten...zumindest bin ich jetzt in der Lage, weitere Teilfunktionen zu erstellen, ich denke, ich habs verstanden...

Vielen Dank..
Delphi-Quellcode:
  function FindLastDir(sDirectory : string) : string;
  var
    SearchRec : TSearchRec;
  begin
    sDirectory := IncludeTrailingPathDelimiter(sDirectory);
    result := sDirectory; //Hier wird dem result der aufrufende String zugewiesen, da sonst immer ein leerer String zurückgegeben wird --> Siehe Erklärung unten
    if FindFirst(sDirectory + '*.*', faDirectory, SearchRec) = 0 then
    begin
       try
        repeat
          if ((SearchRec.Attr and faDirectory) = faDirectory) and(SearchRec.Name <> '.') and
          (SearchRec.Name <> '..') then
          begin
            result := FindLastDir(sDirectory + SearchRec.Name);
            break;
          end;
        until FindNext(SearchRec) <> 0;
      finally
        FindClose(SearchRec);
      end;
    end;
  end;
Gruß, bluescreen25
Die Funktion ist rekursiv.

Angenommen ich habe einen Verzeichnisbaum der so aussieht,
Zitat:
C:\Ebene1\Ebene2\Ebene3\Ebene4\
Ich rufe meine Funktion so auf:
FindLastDir('C:\Ebene1')
Code:
Dann sieht Result so aus:
  1. Aufruf:
    1. Zuweisung: result = 'C:\Ebene1\'
  2. Aufruf:
    1. Zuweisung: result = 'C:\Ebene1\Ebene2\'
  3. Aufruf:
    1. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\'
    2. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\'
  4. Aufruf:
    1. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\' // --> 2.Zuweisung wir nicht ausgeführt!
    kehrt zurück zum
  3. Aufruf:
    2. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\'
    break;
    kehrt zurück zum
  2. Aufruf:
    2. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\'
    break;
    kehrt zurück zum
  1. Aufruf:
    2. Zuweisung: result = 'C:\Ebene1\Ebene2\Ebene3\Ebene4\'
    break;
    kehrt zurück zu
  Deinem Aufruf, du erhälst: 'C:\Ebene1\Ebene2\Ebene3\Ebene4\'


würde nun die 1. Zuweisung im 4. Aufruf fehlen erhälst du immer: ''
Daraus folgt der Rückgaberwert der Funktion ist immer der im letzten Aufruf ermittelt String.

Ich hoffe ich habe dir die Gedankengänge die zu dieser Zuweisung geführt haben etwas verdeutlichen können
Tschau Christian
Das System hofft auf Besserung
[Siemens]
  Mit Zitat antworten Zitat