Frage

Ich habe ein ListView: TlistView in meinem Formular, und ich füge viele Werte hinzu (ungefähr 25K TlistViewItem), die ziemlich schnell funktioniert. Wenn ich jedoch ListView anrufe.Clear, friert das Programm ein. diese Linie.

Meine Frage ist: Wie löste ich mein Problem? Wenn das Erstellen von so vielen Elementen in weniger als einer Sekunde möglich ist, warum dauert das Löschen von Ewigkeit (ich habe über 5 Minuten gewartet)?

War es hilfreich?

Lösung

Haben Sie versucht, Ihren Anruf beizuschließen Klar In einem Block von BeginnUpdate/Endupdate:

  listview.Items.BeginUpdate;
  try
    listview.Items.Clear;
  finally
    listview.Items.EndUpdate;
  end;

Hinzufügen/Entfernen von Elementen in einer Listansicht (oder verschiedenen anderen Steuerelementen, z. B. Listbox) löst eine GUI -Aktualisierung des Steuerelements für jedes Element, das hinzugefügt/entfernt/entfernt wird, aus. Insbesondere für eine Listansicht kann dies ziemlich teuer sein und für 25.000 Artikel wäre der Overhead erheblich.

Zugegeben, 5 Minuten klingen übermäßig, aber dies wäre das erste, was ich versuchen würde.

Andere Tipps

Das erste, was ich versuchen würde, ist, Ihren Anruf zu wickeln, um mit BeginnUpdate/Endupdate zu klären.

  ListView1.Items.BeginUpdate;
  ListView1.Clear;
  ListView1.Items.EndUpdate;

Haben Sie Ereignisse an der ListView beigefügt, und schießen sie, wenn die Liste gelöscht wird?

Wie die anderen feststellten, dass ein BeginnUpdate ... Endupdate die Leistung erheblich erhöht, würde ich wirklich vorschlagen, dass Sie Ihren Code für die Verwendung von VirtualTreeview verschieben. Es handelt sich um einen Hybrit -Baum/eine Listansicht, die in weniger als einer Sekunde zu 1m Knoten addiert (eigentlich hängt das vom Prozessor ab, aber Sie erhalten die Idee).

Am Anfang ist es ein bisschen schwieriger zu lernen, aber wenn Sie sich daran gewöhnt haben, werden Sie es "einfach" finden, mit ihnen zu arbeiten. Ich persönlich, wenn ich viele Zeilen in einer ListView oder TreeView brauche, suche nicht weiter als VirtualTreeview. Oh, und habe vergessen, dass es darüber hinaus kostenlos ist. Probieren Sie es aus: http://soft-geems.net/

John, es sollte nicht länger sein, um die 25K -Artikel hinzuzufügen.
Ich frage mich, ob Sie es laden, solange es nicht sichtbar ist (automatisch Updates deaktivieren), löschen Sie es jedoch, wenn es sichtbar ist, wenn jedes Element Löschen ein Update auslöst.

Ich weiß nicht, ob ich diese Frage löschen sollte oder nicht, ich glaube, sie wird für niemanden in irgendeiner Weise gebraucht, aber ich ziehe es vor, sie zumindest für Sie zu behalten, die geantwortet haben.

Das Problem war, dass ich eine Komponente verwendete, die von TlistView geerbt wurde. Ich dachte, es wäre kein Problem, also habe ich mich entschlossen, TlistView zu sagen, aber ich habe mich geirrt.

Ich habe alle Ihre Antworten aufgewendet, bitte entschuldigen Sie meine Unwissenheit - ich bin neu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top