Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   delphi unterordner auflisten(2) (https://www.delphipraxis.net/167562-delphi-unterordner-auflisten-2-a.html)

bernhard_LA 5. Apr 2012 14:31

delphi unterordner auflisten(2)
 
habe aus einem älteren Beitrag in DP eine Funktion zum Auflisten aller Unterordner entdeckt. möchte als Rückgabe wert eine Stringlist.

der Compiler spuckt folgende Fehlermeldung aus : [DCC Fehler] Unit_filerecovery.pas(54): E2238 Für 'aDirList' ist ein Vorgabewert erforderlich;

ich sehe leider den Fehler nicht , kann jemand helfen ??



Delphi-Quellcode:

unit Unit_filerecovery;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Menus, Vcl.ExtCtrls, FileCtrl ;

type
  TFileReCovForm = class(TForm)
    Memo1: TMemo;
    MainMenu: TMainMenu;
    File1: TMenuItem;
    Exit1: TMenuItem;
    Panel1: TPanel;
    RootFolderEdit: TEdit;
    SelectRFButton: TButton;
    GetAllFoldersButton: TButton;
    Label1: TLabel;
    procedure GetAllFoldersButtonClick(Sender: TObject);
    procedure Exit1Click(Sender: TObject);
    procedure SelectRFButtonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    FOutPutFolder : String;
    end;


   procedure FindAllFolders(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True; var aDirList : TStringList );

var
  FileReCovForm: TFileReCovForm;

implementation

{$R *.dfm}

procedure TFileReCovForm.SelectRFButtonClick(Sender: TObject);

begin
   selectDirectory('Select a Folder ', '', FOutPutFolder);

   RootFolderEdit.text := FOutPutFolder;
end;

procedure TFileReCovForm.Exit1Click(Sender: TObject);
begin
    close;
end;

procedure FindAllFolders(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True; var aDirList : TStringList );
var
  SR: TSearchRec;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';
  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
      try
        repeat
          if SR.Attr and faDirectory = faDirectory then
            if (SR.Name <> '.') and (SR.Name <> '..') then
            begin
              FindAllFolders(RootFolder + SR.Name, Mask, Recurse);
              aDirList.Add(RootFolder);
            end;
        until FindNext(SR) <> 0;
      finally
        FindClose(SR);
      end;
end ;

procedure TFileReCovForm.GetAllFoldersButtonClick(Sender: TObject);
var  DirStringList : TStringList;
begin

      DirStringList:=TStringList.Create;


      FindAllFolders(FOutPutFolder, '' ,true, DirStringList );


      memo1.Lines.Assign(DirStringList);


      DirStringList.Free;
end;

end.

BlackSeven 5. Apr 2012 14:38

AW: delphi unterordner auflisten(2)
 
Zitat:

procedure FindAllFolders(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True; var aDirList : TStringList );

procedure FindAllFolders(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True; const aDirList : TStringList = nil);

Dalai 5. Apr 2012 14:39

AW: delphi unterordner auflisten(2)
 
Da du für die Funktionsparameter Mask und Recurse Vorgabewerte gemacht hast, muss das auch für alle darauf folgenden Funktionsparameter gelten, hier ADirList. Da das nicht sonderlich sinnvoll ist, solltest du die Reihenfolge der Funktionsparameter ändern (z.B. ADirList zuerst) oder du gibst wirklich eine TStringList zurück, machst also eine function draus.

MfG Dalai

DeddyH 5. Apr 2012 14:55

AW: delphi unterordner auflisten(2)
 
Zitat:

Zitat von Dalai (Beitrag 1160386)
... oder du gibst wirklich eine TStringList zurück, machst also eine function draus.

Das würde ich nicht tun, da man sich damit potentielle Speicherlecks einfangen kann.

jaenicke 5. Apr 2012 14:57

AW: delphi unterordner auflisten(2)
 
Zitat:

Zitat von Dalai (Beitrag 1160386)
oder du gibst wirklich eine TStringList zurück, machst also eine function draus.

Bloß nicht. Objekte zurückzugeben ist so ungefähr der schlechteste Programmierstil, den es gibt...
Warum hat DeddyH ja schon geschrieben (danke roter Kasten ;-)).

Die Deklaration als var-Parameter macht auch keinen Sinn, wie BlackSeven schon korrigiert hat. Wenn man dann wie Dalai geschrieben hat, die Reihenfolge ändert und zusätzlich aus TStringList die allgemeinere Elternklasse TStrings macht (um direkt z.B. die Items einer ListBox übergeben zu können usw.), sieht das so aus:
Delphi-Quellcode:
procedure FindAllFolders(const ADirList: TStrings; const ARootFolder: string; const AMask: string = '*.*'; ARecurse: Boolean = True);
begin
  ...
// EDIT:
Nebenbei: Wozu übergibst du die Maske, wenn du sie ohnehin nicht nutzt?

bernhard_LA 5. Apr 2012 14:59

AW: delphi unterordner auflisten(2)
 
Danke für die Inputs; hatte keine Ahnung welchen Einfluss die Reihenfolge meine Funktionsparameter hat

Delphi-Quellcode:

procedure FindAllFolders(const ADirList: TStrings; const ARootFolder: string; const AMask: string = '*.*'; ARecurse: Boolean = True);

anstelle von

procedure FindAllFolders(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True; var aDirList : TStringList );

himitsu 5. Apr 2012 16:25

AW: delphi unterordner auflisten(2)
 
Zitat:

Delphi-Quellcode:
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';

Tipp: Delphi-Referenz durchsuchenIncludeTrailingPathDelimiter (früher mal Delphi-Referenz durchsuchenIncludeTrailingBackslash)

schöni 8. Apr 2012 08:25

AW: delphi unterordner auflisten(2)
 
Zitat:

Zitat von himitsu (Beitrag 1160409)
Zitat:

Delphi-Quellcode:
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';

Tipp: Delphi-Referenz durchsuchenIncludeTrailingPathDelimiter (früher mal Delphi-Referenz durchsuchenIncludeTrailingBackslash)

Ab welcher Delphi Version gibt es die Funktionen:

IncludeTrailingPathDelimiter() und

IncludeTrailingBackslash()

?

DeddyH 8. Apr 2012 08:38

AW: delphi unterordner auflisten(2)
 
IncludeTrailingBackslash mindestens ab Delphi 4 IIRC, IncludeTrailingPathDelimiter müsste mit Kylix dazugekommen sein, also ab Delphi 6.

Bummi 8. Apr 2012 08:40

AW: delphi unterordner auflisten(2)
 
Seit D5


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz