Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit Search procedure (https://www.delphipraxis.net/112909-problem-mit-search-procedure.html)

Darksniper 29. Apr 2008 13:08


Problem mit Search procedure
 
Hi all.

Kann mir jemand hierbei helfen.
Immer wenn ich mit dieser procedure suche dann tritt eine Exeption auf.

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt TXT.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 00456CB2 in Modul 'TXT.exe'.
Lesen von Adresse 00000000' aufgetreten.

Hier mal der Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Memo1: TMemo;
    Splitter1: TSplitter;
    Datei: TMenuItem;
    Aktualisieren1: TMenuItem;
    ListBox1: TListBox;
    procedure Aktualisieren1Click(Sender: TObject);
  private
    { Private-Deklarationen }

  public
   mompath:string;
   files:TStrings;
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure FindAllFiles(var FileList: TStrings; RootFolder: string; Mask: string =
  '*.*'; Recurse: Boolean = True);

var
  SR: TSearchRec;
begin
  RootFolder := IncludeTrailingPathDelimiter(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
            FindAllFiles(FileList, RootFolder + SR.Name, Mask, Recurse);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
  try
    repeat
      if SR.Attr and faDirectory <> faDirectory then
      begin
       FileList.Add(RootFolder + SR.Name); // hier tritt der Fehler auf
      end;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
end;


procedure TForm1.Aktualisieren1Click(Sender: TObject);
var i:integer;
begin
FindAllfiles(files,'C:\Programme\Selfmade\Reader\TXT files','*.txt',false);

for i:=0 to files.count -1 do
Listbox1.Items.addObject(extractFileName(files.Strings[i]),TObject(files.Strings[i]));
end;
end.

Bernhard Geyer 29. Apr 2008 13:10

Re: Problem mit Search procedure
 
und wo wird deine StringListe "files" erzeugt?

Darksniper 29. Apr 2008 13:16

Re: Problem mit Search procedure
 
Danke für den Hinweis.
Jetzt geht's.

DeddyH 29. Apr 2008 13:26

Re: Problem mit Search procedure
 
Wieso wird die Liste eigentlich als Var-Parameter übergeben? :gruebel:

Darksniper 29. Apr 2008 13:30

Re: Problem mit Search procedure
 
Weil ich sie noch mehrmals im programm brauchen werde.

DeddyH 29. Apr 2008 13:32

Re: Problem mit Search procedure
 
Ich meinte den Funktionskopf.
Zitat:

Delphi-Quellcode:
procedure FindAllFiles(var FileList: TStrings;...


Darksniper 29. Apr 2008 13:42

Re: Problem mit Search procedure
 
Da musst du hier schauen:

DeddyH 29. Apr 2008 13:46

Re: Problem mit Search procedure
 
Gut, dann schau Du mal hier :lol: :zwinker:

s-off 29. Apr 2008 14:12

Re: Problem mit Search procedure
 
Hallo,

wenn Du Code von irgendwo kopierst, dann ist das vollkommen ok.
Allerdings solltest Du um deinetwillen auch versuchen, das Ganze zu verstehen.

Zitat:

Zitat von Darksniper
Da musst du hier schauen:

zeigt, dass Du es in diesem Fall nicht verstanden hast.

=> nachholen? ;)

Darksniper 29. Apr 2008 14:23

Re: Problem mit Search procedure
 
Ich habs verstanden.
Die Stringlist wird während der Procedure verändert also muss des eine variable sein.
Weis aber jetzt dass man Stringlisten erstellen/freigeben muss.

DeddyH 29. Apr 2008 14:28

Re: Problem mit Search procedure
 
Das wäre prinzipiell richtig, aber hier handelt es sich um eine Objektinstanz, d.h. intern ist das bereits ein Zeiger, die Übergabe erfolgt also automatisch By Reference. An Deiner Stelle würde ich die Liste als const-Parameter übergeben, denn der Zeiger (die Referenz) ändert sich nicht bei der Abarbeitung der Prozedur.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.

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