AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi TCheckListBox.items.checked[n] alle auf einmal setzen?

TCheckListBox.items.checked[n] alle auf einmal setzen?

Ein Thema von alleinherrscher · begonnen am 11. Apr 2018 · letzter Beitrag vom 11. Apr 2018
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#1

TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 11:25
Hi@all.

Ich habe einen TTabControl. Jedes darin befindliche Tab soll andere Einträge in einer TCheckListBox anzeigen. Der Nutzer kann per Mausklick den die Haken bei den Einträgen der TCheckListBox entfernen oder setzen. Beim Wechsel zwischen Tabs müssen alle TCheckListBox.items.checked[n] für die entsprechenden Einträge wiederhergestellt werden.


Für jedes Tab habe ich ein boolsches Array, in welchem gespeichert ist, welcke Einträge "checked" sind und welche "unchecked" sind. Wie kann ich nun der TCheckListBox diese Information "schnell" übergeben? Seriell mit folgendem Code dauert dies eine halbe Ewigkeit, da nach jeder Änderung der Checked Property neu gezeichnet wird und die Variante halte ich für sehr unschön:

Delphi-Quellcode:
for n:=0 to length(CheckedMask)-1 do
   CheckListBox.checked[n]:=CheckedMask[n];
Aber ich habe weder im Forum, noch in der Delphi Hilfe eine Möglichkeit gefunden, den "checked-state" mehrer Einträge parallel zu setzen.

Hat jemand eine Idee?

Besten Gruß und vielen lieben Dank!

//edit: Tippfehler im Delphi-Quelltext behoben, danke an KodeZwerg, s. Beitrag nr. 6 und 7.
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS

Geändert von alleinherrscher (11. Apr 2018 um 14:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 13:42
Ich habe es gerade mal ausprobiert und stelle keine Neuzeichnungen fest.
Ich hab 50 Einträge in eine CheckListbox abgelegt und so den Checked-Wert verändert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
begin
 for i := 0 to CheckListBox1.Items.Count-1 do
 begin
  CheckListBox1.Checked[i] := not CheckListBox1.Checked[i];
 end;
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.017 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 13:45
Hallo,

bezügl. Performance:
hilft hier evtl. ein
Delphi-Quellcode:
  try
    CheckListBox.Items.BeginUpdate;
    for n := 0 to length(CheckedMask) - 1 do
      CheckListBox.Checked[n] := CheckedMask[n];
  finally
    CheckListBox.Items.EndUpdate;
  end;
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 14:05
Für "CheckListBox.Checked[X] := True/False" Variante braucht man kein Begin/EndUpdate da Einträge nicht verändert werden, nur die Box, oder irre ich mich?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#5

AW: TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 14:12
Für "CheckListBox.Checked[X] := True/False" Variante braucht man kein Begin/EndUpdate da Einträge nicht verändert werden, nur die Box, oder irre ich mich?
Korrekt, das habe ich schon versucht und das BeginUpdate funktioniert hier leider nicht. Das liegt daran meines Erachtens daran, dass im Quelltext (VCL.CheckLst) in der verantwortlichen Routine "SetState" ein "InvalidateCheck" aufgerufen wird, der via "UpdateWindow" irgendwie jedesmal alles neu zeichnet... Ich kann jedenfalls fast dabei zusehen, wie die Haken in der Liste der Reihe nach gesetzt werden (bei ca. 150 Einträgen).

Bisher habe ich herausgefunden, dass TListView die gleichen Funktionalität bereitstellen kann, aber hierbei eher noch langsamer arbeitet... Sehr komisch...
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS

Geändert von alleinherrscher (11. Apr 2018 um 14:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 14:19
CheckListBox.items[n].checked:=CheckedMask[n];
Da nimm CheckListBox.Checked[n] := CheckedMask[n];
Dein Aufruf über items[].checked löst ein Neuzeichnen aus, bin ich fast fest von überzeugt.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.635 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 14:25
Dein Aufruf über items[].checked löst ein Neuzeichnen aus, bin ich fast fest von überzeugt.
Es gibt gar kein CheckListBox.Items.Checked, da Items vom Typ TStrings ist. Das Neuzeichnen wird in TCheckListBox.SetChecked ausgelöst.

Oder reden wir hier nicht über VCL?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#8

AW: TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 14:32
Da nimm CheckListBox.Checked[n] := CheckedMask[n];
Dein Aufruf über items[].checked löst ein Neuzeichnen aus, bin ich fast fest von überzeugt.
Sorry, das war nur ein Tippfehler, items[].checked gibt es gar nicht, verwende natürlich CheckListBox.Checked. Wird meiner Meinung nach trotzdem neugezeichnet. Ich bin einen Schritt weiter. Das Parent der CheckListBox hat die Eigenschaft Doublebuffered auf true gesetzt. Entfernt man diese Option, wird das Verhalten der CheckListBox deutlich schneller. s. Anhang mit langsamer Version.

Das ist so schon mal besser, ich könnte mir aber vorstellen, dass es bei Fällen mit mehr als 150 Einträgen immer noch ein ähnliches Problem geben könnte. Aber vermutlich gibts hier keine bessere Möglichkeit, als alle Checkboxen einzeln zu setzen.

Zitat von Uwe Raabe:
Das Neuzeichnen wird in TCheckListBox.SetChecked ausgelöst.

Oder reden wir hier nicht über VCL?
TCheckListBox.SetChecked kennt mein Delphi XE2 (noch) nicht? Wir reden über VCL.
Angehängte Dateien
Dateityp: zip Project2.zip (3,2 KB, 2x aufgerufen)
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS

Geändert von alleinherrscher (11. Apr 2018 um 14:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.635 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 14:41
ich könnte mir aber vorstellen, dass es bei Fällen mit mehr als 150 Einträgen immer noch ein ähnliches Problem geben könnte.
Das ist nicht unbedingt so. Vor dem UpdateWindow wird ja gezielt der Bereich der CheckBox per InvalidateRect für das Neuzeichnen angemeldet. Das Ändern nicht-sichtbarer Einträge sollten dabei auch kein Neuzeichnen auslösen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: TCheckListBox.items.checked[n] alle auf einmal setzen?

  Alt 11. Apr 2018, 14:43
[Edit]Quarks[/Edit]
Ich habe mal in dein Projekt geschaut, eine schnellere Variante kenne ich auch nicht.
Wenn es Dir um Zeitersparniss in vielen CheckListBoxen geht, würd ich für jede eine CheckListBox nutzen, somit entfällt der Zeitraubende Faktor beim neu befüllen.
Ich hatte Anfangs gedacht das CheckListBoxen pro Tab die gleichen sind, nur halt anders markiert/gecheckt werden sollen.
Gruß vom KodeZwerg

Geändert von KodeZwerg (11. Apr 2018 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 01:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf