![]() |
Aktualisierung ListView mit FindAllFiles
Hallo,
ich bringe durch FindAllFiles gesuchte Dateien in meine ListView. In FindallFiles adde ich direkt in Stringlisten, damit die Anzeige kontinuierlich File für File kommt. Für den schnelleren virtual-Mode muss ich jedoch ListView.beginupdate bzw endupdate einfügen, das ist mir innerhalb der Repeatschleife gelungen. Klappt jetzt wunderbar schnell und kontinuierlich, wenn ich jedoch während des addens mit der Maus über das ListView fahre, hängt das Programm. Es liegt wohl daran, das ich in der Schleife das ListView daran hindere sich neu zu zeichnen und beim Überfahren mit der Maus muss ein Event kommen, welche wahrscheinlich das ListView neuzeichnen lassen will, nur was genau kann es sein ??? Hier mal der Code:
Delphi-Quellcode:
Gruß bluescreen25
procedure FindAllFiles(DirList:TStrings; FileList: TStrings; RootFolder: string; Mask: string; Recurse: Boolean = True; AddFolderNames: Boolean = False; IgnoreMaskAtFolderNames: Boolean = True);
var Tick : Cardinal; procedure LFindAllFiles(AParentFolder: String); var LSearchRec: TSearchRec; begin if FindFirst(AParentFolder + '*', faAnyFile, LSearchRec) = 0 then begin repeat ListMedia.BeginUpdate; if GetTickCount <= Tick then begin Tick := GetTickCount + 200; Application.ProcessMessages; end; if (LSearchRec.Name <> '.') and (LSearchRec.Name <> '..') then begin if LSearchRec.Attr and faDirectory = faDirectory then begin if AddFolderNames and (IgnoreMaskAtFolderNames or Like(AnsiLowerCase(LSearchRec.Name), Mask)) then begin DirList.AddObject(AParentFolder + LSearchRec.Name, TObject(True)); ListMedia.Items.AddVirtual(DirLst); end; if Recurse then LFindAllFiles(AParentFolder + LSearchRec.Name + '\'); end else if Like(AnsiLowerCase(LSearchRec.Name), Mask) then begin FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(False)); ListMedia.Items.AddVirtual(FileLst); end; end; ListMedia.EndUpdate; until FindNext(LSearchRec) <> 0 ; FindClose(LSearchRec); end; end; begin tick:=gettickcount; Mask := AnsiLowerCase(Mask); LFindAllFiles(IncludeTrailingPathDelimiter(RootFolder)); end; |
Re: ein weiteres ListView Problem
Könntest du bitte deinem Beitrag, entsprechend den Regeln des Forums, einen aussagekräftigen Titel verleihen?
|
Re: ein weiteres ListView Problem
Hi,
gib BeginUpdate und EndUpdate mal um die Repeat-Schleife herum. |
Re: ein weiteres ListView Problem
Zitat:
Gruß bluescreen25 |
Re: ein weiteres ListView Problem
Zitat:
Genau das ist ja mein Problem bei vielen Einträgen (>5000)das solange das Listview leer bleibt. Anderherum ohne BeginUpDate etc...ist es schnarchend langsam... Gruß bluescreen25 |
Re: Aktualisierung ListView mit FindAllFiles
Wann möchtest du denn das ListView Updaten? wenn man mit der Maus drüberfährt?
wie wärs damit?
Delphi-Quellcode:
OnMouseEnter/Leave sind beides events des ListViews wenn ichs noch genau weis.
procedure ListView1OnMouseEnter();
begin ListView1.EndUpdate; end; procedure ListView1OnMouseLeave(); begin ListView1.BeginUpdate; end; |
Re: Aktualisierung ListView mit FindAllFiles
Zitat:
Deine Möglichkeit würde das Problem überbrücken, das wenn ich mit der Maus über das ListView fahre,das Programm nicht sich aufhängen zu lassen. Müsste ich aber prüfen. Grüße,bluescreen25 |
Re: Aktualisierung ListView mit FindAllFiles
Damit die Frage auch beantwortet ist:
Nochmal zur Erinnerung: Es geht um die Kompo EasyListView im schnellen virtualMode, kann aber auch in der normalen ListView in virtualMode genutzt werden. 1.) In FindAllFiles werden die gefundenen Ordner und Files jeweils in eine StringList gebannt.
Delphi-Quellcode:
2.) Ein Timer ruft in Intervallen die AddVirtual-procedure auf.
...
Search := True; ... begin ShowList.Items.Clear; //ListView FileLst.Clear; //StringList DirLst.Clear; //StringList LastAdded:=0; //Zähler bisher aktualisierte Items in ListView tiAddTimer.Enabled := True; //addTimer aktualisiert ListView FindAllFiles(DirLst, FileLst, Path, FileMask, Rekursive, False, True);//FileSuche form1.AddSearchItems(FileLst.count); //Aktualisierung nach FileSuche beendet end; //bzw nach letzter addTimer-Aktualisierung ... Timer beendet sich selbst nach letztem Durchlaufen, damit nach Ende der Suche auch die letzten gefundenen Einträge übergeben werden.
Delphi-Quellcode:
3.) Die jeweils noch nicht geaddeten Einträge werden beim timerDurchlauf angefügt.
procedure TForm1.tiAddTimerTimer(Sender: TObject);//TimerInterval bestimmt erste
begin //und folgende Aktualisierungen //guter Mittelwert = 500 ms ShowLabel('songvalue', Format('%.0n Song(s) in Playlist', [1.0 * FileLst.Count])); if Search then AddSearchItems(FileLst.count) // procedure Files AddVirtual else tiAddTimer.Enabled := False; //FileSuche/Aktualisierung beendet end;
Delphi-Quellcode:
procedure TForm1.AddSearchItems(Count: Integer);
var i: Integer; // Items Virtual geaddet begin ListMedia.BeginUpdate; //ListView NeuzeichnungsStop ListMedia.Items.ReIndexDisable := True; LastAdded:=0; //Zähler bisher aktualisierte Items in ListView LastAdded := FileLst.Count - ListMedia.Items.count;//Count,wichtig für Virtual try for i := 0 to LastAdded - 1 do ListMedia.Items.AddVirtual; //virtual geaddete Items, sichtbar durch: finally //procedure SkinListItemGetCaption ListMedia.Items.ReIndexDisable := False; ListMedia.EndUpdate; //ListView NeuzeichnungsStop aufgehoben end; end; 4.) Die eigendliche Anzeige der Items im ListView
Delphi-Quellcode:
Viele Grüße,bluescreen25
procedure TForm1.SkinListItemGetCaption(Sender: TCustomEasyListview;Item: TEasyItem; Column: Integer; var Caption: WideString);
var idx : integer; // Index of Dir/FileList s : TStrings; // Dir/FileList t : integer; // ohne Dateiendung (4 Stellen gekürzt) begin case Column of 0:begin if item.index < DirLst.Count then begin s := DirLst; idx := item.Index; t := 0; end else begin s := FileLst; idx := item.index - DirLst.Count; t := 4; end; // gekürzte Filenames in Column 0 von ListView caption := (copy(ExtractFilename(s.strings[idx]),0, length(ExtractFilename(s.strings[idx]))-t)); end; 1:begin if item.index < DirLst.Count then begin s := DirLst; idx := item.Index; end else begin s := FileLst; idx := item.index - DirLst.Count; end; caption := s.strings[idx]; // komplette Pfade in Column 1 von ListView end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:40 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