AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Dateien in ListView eintragen - Fortschritt anzeigen lassen
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien in ListView eintragen - Fortschritt anzeigen lassen

Ein Thema von Yheeky · begonnen am 25. Feb 2005 · letzter Beitrag vom 26. Feb 2005
Antwort Antwort
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#1

Dateien in ListView eintragen - Fortschritt anzeigen lassen

  Alt 25. Feb 2005, 22:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Dateien in ListView eintragen - Fortschritt anzeigen las

  Alt 25. Feb 2005, 22:27
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.

Na bevor du das erste Elemten einträgst und dann nach dem du fertig bist und das letzte Element eingetragen hast.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#3

Re: Dateien in ListView eintragen - Fortschritt anzeigen las

  Alt 25. Feb 2005, 22:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Dateien in ListView eintragen - Fortschritt anzeigen las

  Alt 25. Feb 2005, 22:53
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#5

Re: Dateien in ListView eintragen - Fortschritt anzeigen las

  Alt 25. Feb 2005, 23:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Dateien in ListView eintragen - Fortschritt anzeigen las

  Alt 25. Feb 2005, 23:19
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
bigg
(Gast)

n/a Beiträge
 
#7

Re: Dateien in ListView eintragen - Fortschritt anzeigen las

  Alt 25. Feb 2005, 23:28
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;
  Mit Zitat antworten Zitat
Yheeky

Registriert seit: 7. Jun 2002
1.339 Beiträge
 
#8

Re: Dateien in ListView eintragen - Fortschritt anzeigen las

  Alt 26. Feb 2005, 00:34
Endlich mal was konstruktives! Danke Bigg, wird geändert!

Noch Vorschläge zum Problem?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Dateien in ListView eintragen - Fortschritt anzeigen las

  Alt 26. Feb 2005, 08:23
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 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