![]() |
eintragen in listview sehr, sehr langsam
Hallo Listers,
ich habe eine Listview und eine Stringliste. Die Einträge der Stringliste sollen in die Listview übertragen werden. Allerdings ist mein Verfahren fürchterlich langsam, d.h., für ca. 1.100 einträge, braucht das ganze ca. 5 Minuten. Hab ich hier was falsch gemacht? Gibt es eine bessere Lösung? Hiiiiilfe! ;-) Hier der Code:
Delphi-Quellcode:
Vielen Dank und herzliche Grüße
// liste ist eine stringliste die mit Werten gefüllt ist.
// lv die Listview, die gefüllt werden soll. // NeuerEintrag: TListItem; Lv.Items.BeginUpdate; for i := 0 to Liste.Count - 1 do begin NeuerEintrag := Lv.Items.Add; NeuerEintrag.Caption := IntToStr(lv.Items.count); NeuerEintrag.SubItems.Add(ExtractFileName(Liste[i])); NeuerEintrag.SubItems.Add(ExtractFilePath(Liste[i])); End; Lv.Items.EndUpdate; Marco |
Re: eintragen in listview sehr, sehr langsam
Der Fehler muss woanders liegen, bei mir geht das in Sekundenbruchteilen.
|
Re: eintragen in listview sehr, sehr langsam
Da sieht in der Tat nicht so aus, als ob es lange dauern könnte.
Du könntest aber dennoch ein wenig optimieren. Wir haben doch keinen Platz :lol: : NeuerEintrag =>
Delphi-Quellcode:
Warum denn jedesmal zählen? :gruebel:
with ListView.Items.Add do begin
Caption := 'xxxx'; Subitems.Add('xxxx'); end;
Delphi-Quellcode:
=>
xx.Caption := IntToStr(lv.Items.count);
Delphi-Quellcode:
xx.Caption := IntToStr(i + 1);
|
Re: eintragen in listview sehr, sehr langsam
Zitat:
Optimiert ist's auch, sieht jetzt schöner aus, läuft aber als net schneller! ;-) Kann's an Delphi 5 liegen? Das hab ich nämlich noch! Es sind keine weiteren Ereignisse für die ListView definiert. Bei mir gibt's pro sekunde so ungefähr 3 Items... Hat jemand noch 'ne idee? Viele grüße Marco |
Re: eintragen in listview sehr, sehr langsam
Für alles über einer Handvoll an Einträgen würde ich bei TListView immer OwnerData verwenden, sprich Lv.Items.Count := Liste.Count und dann in OnData jeweils zuweisen.
|
Re: eintragen in listview sehr, sehr langsam
Hallo
wie hast due die Spaltenbreiten gesetzt? stehen die auf columnheaderwidth/textwidth oder auf einer festen breite? Mfg Frank |
Re: eintragen in listview sehr, sehr langsam
@Marco
Kann ich mir eigentlich nicht vorstellen, das es so lange dauert?! Hast du zu wenig verfügbaren Arbeitsspeicher, eine andere aktive Anwendung (zb. Firefox) die manchmal zu viel Leistung haben möchte? Hast du an der richtigen Stellen die Zeit gemessen? Mach mal bitte eine Anwendung nur mit dem obigen Code und poste die Ausführungszeit. |
Re: eintragen in listview sehr, sehr langsam
optmieren könntest du noch in dem du nicht ExtractFileName und ExtractFilePath verwendest sondern nur eins von beiden und die länge des resultates verwendest um das andere zu erhalten. Ansonsten muss jedesmal ein weiteres mal danach gesucht werden wo der pfad zu ende ist und der dateiname folgt. Selbst implementieren ginge hier natürlich auch noch.
Wieviel Einträge befinden sich in deiner Listbox zu dem Zeitpunkt wenn du einen neuen Eintrag hinzufügst? Ich kann mir beim besten Willen nicht vorstellen das nur 3 Einträge pro Sekunde hinzugefügt werden wenn BeginUpdate und EndUpdate wirklich eingesetzt werden. |
Re: eintragen in listview sehr, sehr langsam
Verhindere, dass der Listview bei jedem Entrag neu gezeichnet wird:
![]() Über Sinn und Unsinn für den Anwender mit über tausend Einträgen im Listview wollen wir hier mal nicht weiter diskutieren. |
Re: eintragen in listview sehr, sehr langsam
Womit allerdings immer noch nicht geklärt wäre, wo der enorme Unterschied herkommt (5 Minuten bei ihm/ihr gegenüber gefühlten 0,7 Sekunden bei mir). Ich habe dabei den Source 1:1 übernommen, sogar die Komponenten gleich benannt. Könnte es sein, dass versehentlich Ereignisse ausgelöst werden, an die man gar nicht gedacht hat?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 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