Delphi-PRAXiS

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/)
-   -   ListView bei ShowModal sehr langsam? (https://www.delphipraxis.net/163467-listview-bei-showmodal-sehr-langsam.html)

cs.rumpelstilzchen 29. Sep 2011 17:10

ListView bei ShowModal sehr langsam?
 
Hallo Leute!

Folgendes Problem:

Ich habe ein Formular mit einer Kundenliste in einer ListView (vsReport).
Dieses Formular rufe ich mittels einer public-function innerhalb der Unit aus dem Hauptprogamm auf:
Delphi-Quellcode:
function TDk32KundenauswahlWnd.Kundenauswahl(var Kundendaten : TMyDbKundenDaten) : Byte;
begin
  Result := Self.Showmodal;
  Kundendaten := gActKundendaten;
end;
Funktioniert prima soweit!

Aaaaaber...
Wenn ich in der Listview einige Tausend Einträge habe, dann vergehen zwischen dem 'ShowModal'-Aufruf und dem auslösen des OnShow-Ereignisses der Form einige Sekunden!:( Je mehr Einträge in der ListView, umso größer die Verzögerung!
Auf einem typischen NetBook mit Atom-Prozessor und 2 Gb Ram - und darauf muss es laufen - bei 4.000 Einträgen etwa 12 Sekunden!
Die Daten werden NUR beim ERSTEN Aufruf des Formulars aus einer Datenbank eingelesen, was zu meiner Verwunderung sogar schneller geht (5-6 Sekunden bei 4.000 Einträgen), als das spätere wiederaufrufen des Formulars ohne neu befüllen der ListView!!!:?

Zeige ich das Formular aber NonModal und benutze statt 'Close' 'Hide', so geht alles blitzschnell ohne spürbare Verzögerung!!!:shock:

Eigentlich mus das Form aber Modal sein, damit der Benutzer keinen Mist bauen kann...

Weiss irgendjemand Rat?

FredlFesl 29. Sep 2011 18:56

AW: ListView bei ShowModal sehr langsam?
 
Verwende den 'virtual mode' vom TListView. Dann musst Du das ListView nicht mehr füllen. Das LV holt sich die Daten über das Event "OnGetData" (oder so) selbst.

Ich glaube, Du musst 'OwnerDraw' setzen irgendwie, und dann noch das o.g. Event implementieren und LV.Items.Count auf 1000000 setzen, z.B. ;-)

Wupps, in 0.1 Sekunden ist alles da.

cs.rumpelstilzchen 30. Sep 2011 10:53

AW: ListView bei ShowModal sehr langsam?
 
Danke für die Info!

Aber das Problem liegt ja nicht im befüllen der Liste!:|
Wenn das Formular nach einem Close erneut mittels ShowModal angezeigt wird, entsteht die lange Wartezeit, OHNE dass die Liste neu gefüllt wird. Sie zeigt nur die "alten" Daten an, die vorher schon drin waren...

Ich verstehe bzgl. der ListView den Unterschied zwischen "ShowModal / Close" und "Show / Hide" nicht!:roll:

Satty67 30. Sep 2011 11:12

AW: ListView bei ShowModal sehr langsam?
 
Zitat:

Zitat von cs.rumpelstilzchen (Beitrag 1127690)
Sie zeigt nur die "alten" Daten an

Die in VirtualMode ja nicht drin sind und somit bei erneutem Öffnen keine Probleme machen können.

Eine weitere Möglichkeit wäre, das modale Fenster dynamisch bei Bedarf zu erzeugen (nicht automatisch, wie es leider Standard ist). Dann hättest Du immer ein jungfreuliches Fenster mit leerem ListView und das Verhalten immer gleich (ohne Altlasten vom vorherigen Öffnen)

cs.rumpelstilzchen 6. Okt 2011 10:36

AW: ListView bei ShowModal sehr langsam?
 
Besten Dank euch!:thumb:

Hab's anders gelöst.
das Formular ist jetzt 'StayOnTop', die Public-Einsprungprozedur wartet nach dem 'show' in einer Schleife darauf, dass der Benutzer sich entscheidet und gibt dann die entprechenden Werte zurück.8-)

Funzt eigentlich genau so, wie ein modales Fenster!

Aber der Grund für die gewaltige Verzögerung ist mir nach wie vor schleierhaft...:?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr.

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