Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi eintragen in listview sehr, sehr langsam (https://www.delphipraxis.net/93267-eintragen-listview-sehr-sehr-langsam.html)

Marco Steinebach 3. Jun 2007 15:15


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:
    // 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;
Vielen Dank und herzliche Grüße
Marco

DeddyH 3. Jun 2007 15:22

Re: eintragen in listview sehr, sehr langsam
 
Der Fehler muss woanders liegen, bei mir geht das in Sekundenbruchteilen.

s-off 3. Jun 2007 15:39

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:
with ListView.Items.Add do begin
Caption := 'xxxx';
Subitems.Add('xxxx');
end;
Warum denn jedesmal zählen? :gruebel:

Delphi-Quellcode:
xx.Caption := IntToStr(lv.Items.count);
=>
Delphi-Quellcode:
xx.Caption := IntToStr(i + 1);

Marco Steinebach 3. Jun 2007 16:14

Re: eintragen in listview sehr, sehr langsam
 
Zitat:

Zitat von s-off
Da sieht in der Tat nicht so aus, als ob es lange dauern könnte.

das hab ich ja auch gedacht...
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

CCRDude 3. Jun 2007 16:16

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.

Keldorn 3. Jun 2007 16:51

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

Gremlin 3. Jun 2007 17:00

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.

SirThornberry 3. Jun 2007 17:10

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.

Luckie 3. Jun 2007 17:14

Re: eintragen in listview sehr, sehr langsam
 
Verhindere, dass der Listview bei jedem Entrag neu gezeichnet wird: MSDN-Library durchsuchenWM_SETREDRAW.
Über Sinn und Unsinn für den Anwender mit über tausend Einträgen im Listview wollen wir hier mal nicht weiter diskutieren.

DeddyH 3. Jun 2007 17:17

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 03:03 Uhr.
Seite 1 von 2  1 2      

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