Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi ListBox.SelectAll dauert etwas länger (https://www.delphipraxis.net/167986-listbox-selectall-dauert-etwas-laenger.html)

Amateurprofi 29. Apr 2012 00:38

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:
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;
Das geht blitzartig und die Darstellung ist so, wie ich es möchte.
Mir gefällt aber das .Visible:=false und ab Schluss Visible:=true nicht.

Weiß jemand eine andere Lösung?

Sir Rufo 29. Apr 2012 01:08

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;

sx2008 29. Apr 2012 01:24

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;

Furtbichler 29. Apr 2012 07:10

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?

Amateurprofi 29. Apr 2012 09:33

AW: ListBox.SelectAll dauert etwas länger
 
Zitat:

Zitat von Sir Rufo (Beitrag 1164105)
Versuch es mal mit
Delphi-Quellcode:
ListBox.Items.BeginUpdate;
try
  // hier jetzt selektieren
finally
  ListBox.Items.EndUpdate;
end;

Super, Sir Rufo,
funktioniert ganz hervorragend. Vielen Dank.

Amateurprofi 29. Apr 2012 09:48

AW: ListBox.SelectAll dauert etwas länger
 
Zitat:

Zitat von Furtbichler (Beitrag 1164117)
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?

Das ist nur deine Meinung.
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.

himitsu 29. Apr 2012 10:48

AW: ListBox.SelectAll dauert etwas länger
 
Zitat:

Zitat von Amateurprofi (Beitrag 1164128)
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.

Andere Speicherverwaltung?

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:

Furtbichler 29. Apr 2012 11:24

AW: ListBox.SelectAll dauert etwas länger
 
Zitat:

Zitat von Amateurprofi (Beitrag 1164128)
Das ist nur deine Meinung.

Äh. Nein.
Zitat:

Wenn die Entwickler auch dieser Meinung wären, dann...
Nuckelt an Fäkalien, 100 Mio Fliegen können nicht irren ;-)
Zitat:

Brauchst nicht anworten, das Problem ist gelöst.
Tu ich aber: Denk nach und lerne ein wenig über gutes GUI Deisgn.

Dalai 29. Apr 2012 14:32

AW: ListBox.SelectAll dauert etwas länger
 
Zitat:

Zitat von Furtbichler (Beitrag 1164117)
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?

Nun mal langsam. So ist diese Aussage zu pauschal, denn was ist mit Listen von Dateien/Verzeichnissen, die sicher eine solche Zahl erreichen können? Klar ist ein Scrollen durch eine solche Anzahl sicher nicht sinnvoll, aber das lässt sich ja anders lösen (im Explorer und auch im Total Commander kann man anfangen, den Dateinamen zu tippen).

MfG Dalai

Popov 29. Apr 2012 14:44

AW: ListBox.SelectAll dauert etwas länger
 
Zitat:

Zitat von Furtbichler (Beitrag 1164117)
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?

Ob es nun Sinn macht alles zu selektieren ist eine Frage für sich, aber die Frage nach 50k Einträgen sehe ich nicht als Problem an. Ich kenne Wörterbücher die zuerst einfach alle Wörter in einer Listbox listen und erst bei der ersten Eingabe anfangen zu filtern. Es ist deren Konzept. Andere teilen es in 26 Teile. Jedem das seine.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 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