Results 1 to 7 of 7

Thread: Onderbreken van de zoekaktie.

  1. #1

    Question Onderbreken van de zoekaktie.

    Met veel plezier heb ik NLDFileSearch verwerkt in mijn progje.
    Echter wat ik mis de annulleer optie tijdens het zoeken.

    Stel: Ik ben op zoek naar alle .csv bestanden in 1 bepaalde map.

    dit is een hoofdmap ( like F:\something) en bevat een kleine 300 gig aan data( bestanden).

    nu heb ik een map gekozen, want ik had in F:\somethingelse moeten zijn,
    In de map f:\something zijn geen .csv bestanden aanwezig, maar ik kan niet uitgevonden krijgen hoe ik dan de zoekaktie kan stoppen.

    Wel als ik 1 .csv gevonden heb kan ik de FileFound vertellen te stoppen.
    concreet de vraag.
    Waar lanceer ik het cCancel event om de aktie te onderbreken, zonder de appl. te stoppen.

    Alvast mijn dank
    een dag niet gelachen is een dag geen fouten gemaakt.
    Een dag geen fouten gemaakt is een dan niet geleefd

  2. #2
    Als je de routine aanroept met een Callback van het type TNLDFoundFileProc of TNLDFoundFileEvent kun je Continue op False zetten in je callback routine. Voor zover ik zie is er inderdaad geen callback die wordt aangeroepen als er geen bestanden worden gevonden. Maar is de actie traag genoeg om daar iets voor in te bouwen?
    Marcel

  3. #3
    Code:
    if Doorgaan = True then
      begin
        if Pos('snapshot',Path) = 0 then
        begin
          NLDEnumFiles(path+Edit1.text, FileFound, [soRelativePaths,SoRecursive,soNoDirs, soProcessMessages]);
        end;
      end;
    dat is hoe ik de aanroep maak, gebruik ik dan de verkeerde manier om te gaan zoeken?

    Als er eenmaal een bestand gevonden is, ga ik naar
    Code:
    procedure TForm1.FileFound(const FileName: string; Attr: Integer;  var DoContinue: TFSContinue);
    begin
      if Doorgaan = False then
      begin
        DoContinue := cCancel;
        ShowMessage('proces is gestopt');
      end;
      Bestanden.Add(FileName);
    
      if ProgressBar1.Position = 100 then ProgressBar1.Position := ProgressBar1.Min;
      ProgressBar1.StepIt;
      Application.ProcessMessages;
    end;
    daar stopt de boel dan wel.
    De zoekactie die gedaan moet worden, is groot genoeg ( uur of tien mag je wel aan denken) dus als het fout gaat ( moet redelijk dummy-proof zijn) dan moet er wel een cancel gedaan kunnen worden.

    Graag iets meer advies
    Bij voorbaat mijn dank
    een dag niet gelachen is een dag geen fouten gemaakt.
    Een dag geen fouten gemaakt is een dan niet geleefd

  4. #4
    Het FoundFile event wordt inderdaad alleen afgevuurd wanneer er een bestand is gevonden. Een andere mogelijkheid is om geen gebruik te maken van de NLDEnumFiles functie, maar van de classes die bij NLDFileSearch horen. Deze bieden namelijk de Terminate procedure waarmee de zoekactie kan worden geannuleerd. Het nadeel van de classes is helaas dat veel properties en methods protected zijn, maar toch kun je hier eenvoudig bijkomen: De volgende code laat het resultaat in een listbox zetten en is voor het afbreken niet meer afhankelijk van of er een file wordt gevonden. Voor het voorbeeld gebruik ik de TNLDStringsFileSearch. Je kunt natuurlijk ook net zo makkelijk de TNLDEnumFiles gebruiken:
    Code:
    type
      TMyFileSearch = class(TNLDStringsFileSearch)
      end;
    
      TForm1 = class(TForm)
        btnSearch: TButton;
        btnCancel: TButton;
        Resultaat: TListBox;
        procedure btnSearchClick(Sender: TObject);
        procedure btnCancelClick(Sender: TObject);
      private
        FileSearch: TMyFileSearch;
      end;
    
    ...
    
    procedure TForm1.btnSearchClick(Sender: TObject);
    begin
      FileSearch := TMyFileSearch.Create;
      try
    // Stel voor een TNLDEnumFiles afgeleide de
    // OnFoundFile property in
        FileSearch.Strings := Resultaat.Items;
        FileSearch.EnumFiles('d:\', [soRecursive, soProcessMessages]);
      finally
        FreeAndNil(FileSearch);
      end;
    end;
    
    procedure TForm1.btnCancelClick(Sender: TObject);
    begin
    if Assigned(FileSearch) then
        FileSearch.Terminate;
    end;
    1+1=b

  5. #5
    Begin me spontaan blond te voelen :-(

    zou je vriendelijk willen zijn een stuk voorbeeld code op het forum te plaatsen voor het gebruik van de TNLDEnumFiles.
    Krijg dat namelijk niet voor elkaar in mijn code.
    Het is wel de bedoeling dat ik die ga gebruiken, gezien het feit dat ik moet gaan zoeken op *.mdb bestanden in een grote structuur.

    Alvast mijn dank.
    een dag niet gelachen is een dag geen fouten gemaakt.
    Een dag geen fouten gemaakt is een dan niet geleefd

  6. #6
    Je kunt dat met bovenstaande code ook. Deze zet alles in een listbox, maar dat kan natuurlijk ook met een stringlist. Een TStringList heeft trouwens een OnChange event dat je zou kunnen koppelen om te zien of er een bestand is toegevoegd.

    Natuurlijk zijn dat maar truukjes, daarom heb ik hierbij een form ge-attacht. Dit form doet vrijwel hetzelfde als bovenstaande code (het is ook bijna dezelfde code), maar zoekt op MDB bestanden. Gevonden files worden doorgegeven aan het OnFoundFile event waarvoor een handler is geïmplementeerd. Voor het voorbeeld zet deze handler de gevonden file nog steeds in een listbox, maar je kunt er natuurlijk mee doen wat je wilt.

    Lees wel nog even de andere threads ook door, want er was laatst sprake van dat door het gebruik van de MatchesMask routine van Delphi, de files zonder extentie niet gevonden zouden worden. Nu is dat in jouw geval waarschijnlijk niet van toepassing; je past geen mask toe op de mappen, dus die worden sowieso allemaal gevonden en voor de files ga je op zoek naar een .mdb extentie, dus zijn bestanden zonder extentie niet van toepassing.

    Vraag ik me nog wel af waarom je 10 uur zou moeten zoeken!?!

    Als je trouwens een 'zware' actie met die mdb databases uit zou willen voeren, dan kun je misschien beter eerst alle files zoeken en in een lijst zetten en deze lijst opslaan. Om het zoeken namelijk later verder te laten gaan is erg lastig, maar je kunt wel eenvoudig verder gaan met de lijst. Je haalt daar namelijk gewoon alle items uit die je al gehad hebt. Dit kun je dus eenvoudig annuleren en later voortzetten.
    1+1=b

  7. #7
    En dat form natuurlijk:
    Attached Files Attached Files
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •