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 Dateien in ListView eintragen - Fortschritt anzeigen lassen (https://www.delphipraxis.net/41093-dateien-listview-eintragen-fortschritt-anzeigen-lassen.html)

Yheeky 25. Feb 2005 22:22


Dateien in ListView eintragen - Fortschritt anzeigen lassen
 
Hi,

ich habe folgenden Code hier aus der DP genommen und in mein Programm eingebaut. Es handelt sich um den Code, mit dem man die Dateien eines Verzeichnisses (inkl. Unterverzeichnisse) auslesen kann. Dies kann ja bei vielen Dateien sehr lange dauern. Meine Frage ist nun, wie ich den Fortschritt in einer ProgressBar anzeigen lassen kann. Zudem sollten die Dateien erst in der ListView gezeigt werden, wenn alle eingetragen wurden (das geht mit BeginUpdate und EndUpdate, doch wo baue ich das hier im Code ein?).
Hier ist der genaue Code:

Code:
function TForm1.FindAllFiles(RootFolder: string; Mask: string = '*.*'; Recurse: Boolean = True) : TStringDynArray;
var
  wfd         : TWin32FindData;
  hFile       : THandle;
  SLVItem     : TListItem;
  IDTag       : TID3v2;
begin
  if AnsiLastChar(RootFolder)^ <> '\' then
    RootFolder := RootFolder + '\';
  if Recurse then
  begin
    hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd);
    if hFile <> INVALID_HANDLE_VALUE then
    try
      repeat
        if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY =
          FILE_ATTRIBUTE_DIRECTORY then
          if (string(wfd.cFileName) <> '.') and (string(wfd.cFileName) <> '..')
            then
            FindAllFiles(RootFolder + wfd.cFileName, Mask, Recurse);
      until FindNextFile(hFile, wfd) = False;
    finally
      windows.FindClose(hFile);
    end;
  end;
  hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd);

  if hFile <> INVALID_HANDLE_VALUE then
  try
    repeat
      if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <>
        FILE_ATTRIBUTE_DIRECTORY then
      begin
      SLVItem := Form1.SmartListView1.Items.Add;
      SLVItem.SubItems.Add(wfd.CFileName);

      // MP3
      if LowerCase(Copy(wfd.CFileName, LastDelimiter('.', wfd.CFileName)+1, Length(wfd.CFileName)-LastDelimiter('.', wfd.CFileName))) = 'mp3' then
         begin
         SLVItem.ImageIndex := 0;
         SLVItem.SubItems.Add('Mp3 - Datei');

         // ID-Tags auslesen

         IDTag := TID3v2.Create;
         IDTag.ReadFromFile(RootFolder + wfd.CFileName);
         SLVItem.SubItems.Add(IDTag.Artist);
         SLVItem.SubItems.Add(IDTag.Title);
         SLVItem.SubItems.Add(IDTag.Genre);

         end;

      // WAVE
      if LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) = 'wav' then
         begin
         SLVItem.ImageIndex := 0;
         SLVItem.SubItems.Add('Wave - Datei');
         end;

      // MPG, MPEG, AVI, WMV, ASF
      if IstVideoDatei(wfd.cFileName) = True then
         begin
         SLVItem.ImageIndex := 1;
         SLVItem.SubItems.Add('Video - Datei');
         end;

     // Wenn es keiner der o.a. Dateien ist
     if (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'mp3') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'wav') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'mpg') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'mpeg') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'wmv') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'asf') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'avi') then
        begin
        SLVItem.ImageIndex := 2;
        SLVItem.SubItems.Add('Sonstige Datei');
        end;


     end;
    until FindNextFile(hFile, wfd) = False;
  finally
    Windows.FindClose(hFile);

  end;


end;
Ich hoffe, mir kann jemand helfen. Danke!

Gruß Yheeky

Luckie 25. Feb 2005 22:27

Re: Dateien in ListView eintragen - Fortschritt anzeigen las
 
Zitat:

Zitat von Yheeky
Meine Frage ist nun, wie ich den Fortschritt in einer ProgressBar anzeigen lassen kann.

Das habe wir gerade in der letzten Woche schon al gehabt. Aber anscheinend ist es sehr schwer vorher mal die Suche zu benutzen. Dabei haben wir jetzt schon eine "Schaltfläche" unter dem Texteingabefeld für den Titel, wenn man ein neues Topic erstellt, um direkt erstmal zu suchen.

Kurz: Du brauchst einen maximalen Wert, um die Anzeige des Fortschritts sinnvoll zu gestallten. Und jetzt überleg mal, ob du den bekommst oder hast.

Zitat:

Zudem sollten die Dateien erst in der ListView gezeigt werden, wenn alle eingetragen wurden (das geht mit BeginUpdate und EndUpdate, doch wo baue ich das hier im Code ein?).
Nur eine Frage pro Thread. :warn:

Na bevor du das erste Elemten einträgst und dann nach dem du fertig bist und das letzte Element eingetragen hast.

Yheeky 25. Feb 2005 22:45

Re: Dateien in ListView eintragen - Fortschritt anzeigen las
 
Naja, also den Maximalwert bekomme ich ja erst, wenn auch alle Dateien eingetragen sind. Deswegen frage ich.
Den angesprochenen Thread, in dem das Thema bereits behandelt wurde, habe ich bis jetzt immer noch nicht gefunden.

Okay, das Problem mit Begin-/EndUpdate ist dann klar.

Gruß Yheeky

Luckie 25. Feb 2005 22:53

Re: Dateien in ListView eintragen - Fortschritt anzeigen las
 
Zitat:

Zitat von Yheeky
Den angesprochenen Thread, in dem das Thema bereits behandelt wurde, habe ich bis jetzt immer noch nicht gefunden.

Hier im Forum suchenfindfirst, erster Treffer. Ohne Worte.

Yheeky 25. Feb 2005 23:12

Re: Dateien in ListView eintragen - Fortschritt anzeigen las
 
Erstens: Es mag auch Leute geben, die nicht jede Sekunde hier im Forum hängen und alle Threads auswendig kennen!
Zweitens: Dass du FindFirst in deiner Suche eingibst, ist ja schön, aber wenn man mit dem Thema nicht sonderlich vertraut ist, weiss man das eben nicht.
Drittens: Auch deine zweite Antwort bezüglich dem Fortschritt hilft mir in keinster Weise!

Vielleicht gibt´s ja noch jemanden, der mir in nem netten Ton eine Antwort zu dem Thema geben kann. Wäre nett, danke!

Gruß Yheeky

Luckie 25. Feb 2005 23:19

Re: Dateien in ListView eintragen - Fortschritt anzeigen las
 
Zitat:

Zitat von Yheeky
Erstens: Es mag auch Leute geben, die nicht jede Sekunde hier im Forum hängen und alle Threads auswendig kennen!

Und genau für die ist die Suche da.
Zitat:

Zweitens: Dass du FindFirst in deiner Suche eingibst, ist ja schön, aber wenn man mit dem Thema nicht sonderlich vertraut ist, weiss man das eben nicht.
Steht doch bei dir im Quellcode drinne. Daher ist es doch das naheliegenste es in der Suche einzugeben, find eich.
Zitat:

Drittens: Auch deine zweite Antwort bezüglich dem Fortschritt hilft mir in keinster Weise!
Weil es wohl keine einfache Lösung gibt.

bigg 25. Feb 2005 23:28

Re: Dateien in ListView eintragen - Fortschritt anzeigen las
 
hi,

Delphi-Quellcode:
 // Wenn es keiner der o.a. Dateien ist
     if (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'mp3') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'wav') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'mpg') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'mpeg') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'wmv') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'asf') and
        (LowerCase(Copy(wfd.cFileName, LastDelimiter('.', wfd.cFileName)+1, Length(wfd.cFileName)-LastDelimiter('.', wfd.cFileName))) <> 'avi') then

Warum so kompliziert und unübersichtlich?
Du brauchst den Vergleichstring doch nur einmal erstellen.
Ist nur ein Beispiel, da ich nicht weiß wie das ganze bei dir genau aussieht.

Delphi-Quellcode:
Ext := Lowercase(ExtractFileExt(FileName)); // gibt die Dateierweiterung eines String zurück

if Ext <> '' then
if (Ext = '.mp3') or
   (Ext = '.wav') or
   (Ext = '.ogg') or
   (Ext = '.wma') then
Audio_Files := True else
Audio_Files := False;

Yheeky 26. Feb 2005 00:34

Re: Dateien in ListView eintragen - Fortschritt anzeigen las
 
Endlich mal was konstruktives! Danke Bigg, wird geändert!

Noch Vorschläge zum Problem?

SirThornberry 26. Feb 2005 08:23

Re: Dateien in ListView eintragen - Fortschritt anzeigen las
 
das mit der Progressbar wirst du nicht hinnbekommen. Denn nicht das eintragen in die Progressbar dauert so lange sondern das abfrage mit FindFirst etc. welche dateien vorhanden sind. Und da weißt du eben erst am ende wieviel dateien das sind. Imho gibt es keine Lösung für dich da du nicht vor dem gesammten Listen der Dateien weißt wieviel dateien es sind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 Uhr.

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