![]() |
Listview schläft ein
Hallo
ich lese vom System alle temp dateien ein und gebe sie in ein ListView aus zusätzlich werden noch ein Icon, dateigrösse und der ort angegeben nun hab ich folgenden effekt alles steht (frozen - brrrrr kalt) und wenn die die function alles abgearbeitet hat ist alles mit einmal da! ich wollte es gern das er sobald er eine datei gefunden hat sie sofort im Listview anzeigt und nicht das alles einschläft. ich habe es mal so mit ca. 10000 Dateien laufen lassen es dauert auch noch ein bischen lange - kann man da noch was drehen?
Delphi-Quellcode:
Warung_ListView41 sind die Laufwerk//****************************************************************************** //Haupt Function Procedure TD_Dateien_Anzeigen_WHU(); var laufwerke_sl : TStringList; dateien_sl : TStringList; i : Integer; laufwerk_s : String; icon_list_il : HImageList; file_info_fi : TSHFileInfo; file_name_s : String; file_groesse_e : Extended; file_groesse_s : String; file_verzeichnis_s : String; begin //Icon laden icon_list_il := HImageList(SHGetFileInfo('', 0, file_info_fi, SizeOf(file_info_fi), SHGFI_SYSICONINDEX or SHGFI_ICON)); if (icon_list_il <> 0) then begin Haupt_Form.Wartung_Temp_ImageList1.Handle := icon_list_il; Haupt_Form.Wartung_Temp_ImageList1.Height := 16; Haupt_Form.Wartung_Temp_ImageList1.Width := 16; end; //ListViewlöschen Haupt_Form.Wartung_ListView42.Items.BeginUpdate; laufwerke_sl := TStringList.Create; dateien_sl := TStringList.Create; laufwerke_sl.Clear; dateien_sl.Clear; try //Laufwerke übergeben for i := 0 to Haupt_Form.Wartung_ListView41.Items.Count - 1 do begin if (Haupt_Form.Wartung_ListView41.Items.Item[i].Checked = True) then begin laufwerk_s := ''; laufwerk_s := Copy(Haupt_Form.Wartung_ListView41.Items.Item[i].Caption, 1, 3); laufwerke_sl.Add(laufwerk_s); end; end; //Dateien in ListCheckBoxen if (laufwerke_sl.Count > 0) then begin //Checkboxenlöschen Haupt_Form.Wartung_ListView41.Visible := False; Haupt_Form.Wartung_ListView42.Clear; Haupt_Form.Wartung_ListView42.Visible := True; for i := 0 to laufwerke_sl.Count - 1 do begin Dateien_Suchen_GU(dateien_sl, laufwerke_sl.Strings[i], '*.tmp'); end; for i := 0 to dateien_sl.Count - 1 do begin file_name_s := ExtractFileName(dateien_sl.Strings[i]); file_groesse_e := Datei_Groesse_GU(dateien_sl.Strings[i]); file_groesse_s := Datei_Groesse_Format_GU(file_groesse_e); file_verzeichnis_s := ExtractFilePath(dateien_sl.Strings[i]); Haupt_Form.Wartung_ListView42.Items.Add; Haupt_Form.Wartung_ListView42.Items.Item[i].Caption := file_name_s; Haupt_Form.Wartung_ListView42.Items.Item[i].SubItems.Add(file_groesse_s); Haupt_Form.Wartung_ListView42.Items.Item[i].SubItems.Add(file_verzeichnis_s); //Icon SHGetFileInfo(PChar(dateien_sl.Strings[i]), 0, file_info_fi, SizeOf(file_info_fi), SHGFI_SYSICONINDEX or SHGFI_ICON); Haupt_Form.Wartung_ListView42.Items.Item[i].ImageIndex := file_info_fi.iIcon; end; end; finally laufwerke_sl.Free; dateien_sl.Free; Haupt_Form.Wartung_ListView42.Items.EndUpdate; end; end; Wartung_ListView42 sind die Dateien |
Re: Listview schläft ein
Hai HomerGER,
wenn ich deinen Code richtig verstehe sagst Du der ListView ja mit .BeginUpDate das sie nicht neu Zeichnen soll wenn ein neuer Eintrag gemacht wurde.
Delphi-Quellcode:
Nachtrag:
.
. Haupt_Form.Wartung_ListView42.Items.BeginUpdate; . finally Haupt_Form.Wartung_ListView42.Items.EndUpdate; end; Zitat:
|
Re: Listview schläft ein
Application.ProzessMessages heißt das Zauberwort ..., allerdings bin ich mir nicht sicher, ob es wirklich Sinn ergibt 10000 Dateien im Listview anzuzeigen. Dauert ein bißchen lange, oder?
|
Re: Listview schläft ein
Man könnte aber auch ein Application.ProcessMessages einbauen, oder?
[edit] Warum bin ich immer der letzte... [/edit] |
Re: Listview schläft ein
Zitat:
Zitat:
Zitat:
Aber komme jetzt bitte nicht auf die Idee, die komplette Unit zu posten. ;) Anhängen wäre evtl. der bessere Weg. :stupid: Aber ich glaube, man könnte wohl irgendwie auch auf die Stringlisten verzichten. |
Re: Listview schläft ein
Zitat:
|
Re: Listview schläft ein
@Sharky auch ohne Update schläft er ein
@Tom ja es dauert ein bischen lang - ein bischen sehr lang - es sollte aber schon ein ListView sein mir geht es jetzt darum den code zu optimieren - wenn das geht sprich die einträge, wenn er eine datei gefunden hat sofort zu aktualisieren ich lese sie erst in eine stringlist und dann sollte er sie nach und nach in das Listview dranhängen - sortiert sind sie ja und das auch noch schnell |
Re: Listview schläft ein
Datei suchen
Delphi-Quellcode:
//##############################################################################
//############################################################################## //Dateien Suchen //############################################################################## //############################################################################## //****************************************************************************** //Dateien suchen Procedure Dateien_Suchen_GU(var filelist_sl : TStringList; laufwerk_s : string; mask_s : string); var SR: TSearchRec; begin //Auf Backlash prüfewn if (AnsiLastChar(laufwerk_s)^ <> '\') then begin laufwerk_s := laufwerk_s + '\'; end; //Alle Ordner if FindFirst(laufwerk_s + '*.*', faAnyFile, SR) = 0 then try repeat if (SR.Attr and faDirectory = faDirectory) then begin if ((SR.Name <> '.') and (SR.Name <> '..')) then begin Dateien_Suchen_GU(filelist_sl, laufwerk_s + SR.Name, mask_s); end; end; until FindNext(SR) <> 0; finally FindClose(SR); end; //Alle Dateien if FindFirst(laufwerk_s + mask_s, faAnyFile, SR) = 0 then try repeat if (SR.Attr and faDirectory <> faDirectory) then begin filelist_sl.Add(laufwerk_s + SR.Name); end; until FindNext(SR) <> 0; finally FindClose(SR); end; end; |
Re: Listview schläft ein
Hai HomerGER,
wie wäre es zu versuchen mit einem Timer z.b alle 500-ms diesen Code aufzurufen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin ListView1.Items.EndUpdate; ListView1.Items.BeginUpdate; Application.ProcessMessages; end; |
Re: Listview schläft ein
Also, das try/finally kannst du dir hier schon mal sparen:
Zitat:
Delphi-Quellcode:
if FindFirst(...) = 0 then
repeat { ... } until FindNext(SR) <> 0; FindClose(SR); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 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 by Thomas Breitkreuz