![]() |
ListBox.SelectAll dauert etwas länger
Ich habe eine TListBox mit Style=lbVirtualOwnerDraw mit ca. 50k Einträgen.
Wenn ich ein SelectAll mache dauert das etwas länger, und wenn das SelectAll endlich fertig ist, werden die letzten Einträge der Liste angezeigt. Ich möchte aber erstens, dass das ohne merkliche Verzögerung abläuft und dass am Schluss die Einträge angezeigt werden, die vorher angezeigt wurden. Vorerst habe ich das so gelöst:
Delphi-Quellcode:
Das geht blitzartig und die Darstellung ist so, wie ich es möchte.
var i:integer;
begin i:=ListBox.TopIndex; ListBox.Visible:=false; // Bei vielen Einträgen dauert SelectAll etwas länger ListBox.SelectAll; ListBox.TopIndex:=i; ListBox.Visible:=true; end; Mir gefällt aber das .Visible:=false und ab Schluss Visible:=true nicht. Weiß jemand eine andere Lösung? |
AW: ListBox.SelectAll dauert etwas länger
Versuch es mal mit
Delphi-Quellcode:
ListBox.Items.BeginUpdate;
try // hier jetzt selektieren finally ListBox.Items.EndUpdate; end; |
AW: ListBox.SelectAll dauert etwas länger
Und wenn der Code von Sir Rufo keine Besserung bringt (die Items werden ja nicht verändert sondern nur selektiert, was im Hintergrund wahrscheinlich zig1000 Messages verursacht) dann vielleicht dies:
Delphi-Quellcode:
// von TeamB
procedure LockControl(c: TWinControl; lock: boolean); begin if (c = nil) or (c.Handle = 0) then exit; if lock then SendMessage(c.Handle, WM_SETREDRAW, 0, 0) else begin SendMessage(c.Handle, WM_SETREDRAW, 1, 0); RedrawWindow(c.Handle, nil, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN); end; end; LockControl(ListBox, True); try ListBox.SelectAll; ListBox.TopIndex:=i; finally LockControl(ListBox, False); end; |
AW: ListBox.SelectAll dauert etwas länger
Das Problem sind die 50k Einträge. Da Fehler an der Wurzel gepackt werden sollen, setze hier an: An deinem GUI-Konzept ist was faul, denn wer scrollt schon durch 50k Einträge?
|
AW: ListBox.SelectAll dauert etwas länger
Zitat:
funktioniert ganz hervorragend. Vielen Dank. |
AW: ListBox.SelectAll dauert etwas länger
Zitat:
Wenn die Entwickler auch dieser Meinung wären, dann 1) wären ListBoxen in ihrer Kapazität limitiert 2) gäbe es z.B. kein BeginnUpdate/EndUpdate, denn das wäre ja nicht nötig. Warum, deiner Meinung nach, wurde die Limitierung von max 32767 Einträgen, die bis Windows 98 galt, aufgehoben? Brauchst nicht anworten, das Problem ist gelöst. |
AW: ListBox.SelectAll dauert etwas länger
Zitat:
Es muß also nicht unbedingt das Ziehl gewesen sein die Beschränkung aufzuheben ... dieses kann ausversehn mitgekommen sein. :stupid: z.B. die Limitierung beim Memo wurde dadurch aufgehoben, daß man von einem (vermutlich) statischen 64 KB-Puffer weggegangen ist. :roll: |
AW: ListBox.SelectAll dauert etwas länger
Zitat:
Zitat:
Zitat:
|
AW: ListBox.SelectAll dauert etwas länger
Zitat:
MfG Dalai |
AW: ListBox.SelectAll dauert etwas länger
Zitat:
|
AW: ListBox.SelectAll dauert etwas länger
Was spricht dagegen nur Sichtbare Einträge zu verwalten.
Da ist es eigentlich egal wieviele Einträge sich in der liste befinden. Bei 30 Tausend Songs/Titel oder aber 50K an Einträgen wäre es auch sinnvoll auf SQL(Datenbanken) umzusteigen anstelle vom Listbox/en Von daher muss ich Furtbichler recht geben "GUI-Design" Es kommt halt immer darauf an was man anschließend mit den Einträgen tun möchte. OT: Das ist widermal so eine zwischen Antwort die dem Thread ersteller "An den Pranger" nicht gefallen würde. gruss |
AW: ListBox.SelectAll dauert etwas länger
Ich hätte noch einen On Topic - Vorschlag, solange die Anzahl der Einträge unterhalb von 65535 bleibt, Latenz= 0, statt Listbox.SelectAll :
Delphi-Quellcode:
SendMessage(Listbox.Handle, LB_SELITEMRANGE, Longint(True), (Listbox.count-1) * 65536 );
|
AW: ListBox.SelectAll dauert etwas länger
Zitat:
Danke Bummi! |
AW: ListBox.SelectAll dauert etwas länger
Zitat:
Und warum sollte mir das "An den Pranger" nicht gefallen. Erstens weiß ich wer's schreibt und zweitens freue ich mich, wenn jemand, der keinerlei Information hat, was eigentlich beabsichtigt ist, Negativkommentare statt konstruktiver Hilfe bietet. Spricht doch für sich! |
AW: ListBox.SelectAll dauert etwas länger
Zitat:
Zitat:
Furtbichler und ich sagen ja nicht dass dein Programm auf jeden Fall grundsätzlich geändert werden muss. Wenn du oder dein Auftraggeber der Meinung sind, dass in diese Listbox 50k Einträge rein müssen, dann soll es eben so sein. Wenn man aber so frei sein kann und über angebracht Kritik kurz nachdenkt, kann es bei anderen Personen ja doch unter Umständen dazu kommen, dass man merkt, dass 50k Einträge tatsächlich nicht immer Sinn machen. Wenn du aber meinst es macht hier Sinn, dann ist das doch okay. Dann macht dir keiner einen Vorwurf. Und dann solltest du niemandem einen Vorwurf machen, der dich auf eine eventuell sinnvollere Lösung hinweißt. Liebe Grüße, Valentin |
AW: ListBox.SelectAll dauert etwas länger
Zitat:
Da wird gesagt 1) "Das Problem sind die 50k Einträge." Nachgewiesenermaßen ist das aber nicht das Problem. Das Problem ist ein schlecht implementiertes ListBox.SelectAll. Und dieses Problem ist auf unterschiedliche Weisen lösbar. 2) Da Fehler an der Wurzel gepackt werden sollen .... . Da war kein Fehler. 3) "... Denn wer scrollt sich denn schon durch 50k Einträge?" In anderen Worten heißt das wohl, daß jemand der das doch macht etwas dumm ist. Ich halte es für nicht konstruktiv, wenn keinerlei Lösungsansatz gegeben wird, aber zwischen den Zeilen Dummheit unterstellt wird. Wenn du es anders siehst, fein, kann ich akzeptieren. Andere User, angefangen bei Sir Rufo und aufgehört bei bei Bummi haben mir schlicht und einfach aufgezeigt wie man das lösen kann und das nenne ich konstruktiv. Zu Zitat:
Ich gehe nicht davon aus, daß die Entwickler des Systems bewußt darauf achten, daß ihr System in bestimmten Situationen besonders langsam wird. Du? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:42 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