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:
...
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
...
2.) Ein Timer ruft in Intervallen die AddVirtual-procedure auf.
Timer beendet sich selbst nach letztem Durchlaufen, damit nach Ende der Suche auch die letzten
gefundenen Einträge übergeben werden.
Delphi-Quellcode:
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;
3.) Die jeweils noch nicht geaddeten Einträge werden beim timerDurchlauf angefügt.
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:
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;
Viele Grüße,bluescreen25