TCheckListBox und Spalten

Rund um die LCL und andere Komponenten
Antworten
WeePee
Beiträge: 25
Registriert: So 8. Dez 2013, 13:46

TCheckListBox und Spalten

Beitrag von WeePee »

Hallo,

ich bin neu hier und stelle mal gleich meine erste Frage.

Eine kurze Vorstellung meinerseits: Ich bin seit 1988 in der IT-industrie und arbeite als Software-Entwickler / Software-Architekt. Pascal war die Sprache, die wir damals an der Uni gelernt haben und die ich nun wiederentdeckt habe.

Ich habe nun ein Problem mit einer CheckListBox: genau genommen mit einem Spaltenanzahlwechsel zur Laufzeit. Die CheckListBox ist auf einem Panel positioniert, das wiederum auf einer Seite eines TPairSplitter lokalisiert ist.

Schiebe ich nun den Slider des Splitters, dann verändert sich die Breite (Width) der CheckListBox entsprechend und in Abhängigkeit von dieser Breite berechne ich die Anzahl der Spalten innerhalb der CheckListBox neu.

Das klappt auch alles ganz gut, allerdings gibt es einen kleinen Bereich, in dem das nicht klappt.

Ausgangssituation: in der CheckListBox mit Spaltenanzahl=1 sind so viele Einträge, dass es rechts einen Scrollbar gibt. Vergörßere ich die Breite der CheckListBox nun mit dem Slider so weit, dass ich intern die Spaltenanzahl auf 2 setze, dann passiert es über 2-4 Pixel an genau der Wechselgrenze, dass die CheckListBox nicht angezeigt wird! Das Ganze hat offensichtlich damit zu tun, dass der rechte Scrollbar verschwindet und ein horizontaler Scrollbar neu gezeichnet werden soll. Das wird allerdings erst dann getan, wenn ich den Slider weiter verschiebe.

Ein von mir programmiertes Invalidate oder auch Repaint auf die CheckListBox hatte keine Wirkung.

In den Anlagen findet ihr das Phänomen dargestellt. Es geht um die hellblaue CheckListBox.
Ausgangszustand
Ausgangszustand
Fehlerhafter Zustand nach Sliderbewegung
Fehlerhafter Zustand nach Sliderbewegung
Zustand nach weiterer Sliderbewegung
Zustand nach weiterer Sliderbewegung
UI Definition:
Die UI Hierarchie sieht so aus:
Die UI Hierarchie sieht so aus:
Das Coding im Resize sieht so aus
procedure THauptfenster.TCheckListBoxAufgabenResize(Sender: TObject);
begin
TCheckListBoxAufgaben.Columns := Berechne_ListBoxSpalten_Nach_Resize(TCheckListBoxAufgaben.Width);
end;
... , wobei ich auch schon ClientWidth statt Width ausprobiert habe.

Ich denke mir, dass ich hier nur einen saublöden Fehler mache, finde ihn aber nicht. Könnt Ihr mir ein paar Hinweise geben?

Viele Grüße
Wolfram

P.S.: EDIT: Win 7 64Bit, Lazarus 1.0.12 für FreePascal 2.6.2
Zuletzt geändert von WeePee am So 8. Dez 2013, 14:57, insgesamt 1-mal geändert.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TCheckListBox und Spalten

Beitrag von pluto »

Ich kann das Problem hier unter Linux/Ubuntu 12.04/KDE unter Lazarus 1.1 nicht nach stellen.

Ich habe jedoch auch TSplitter genommen und nicht TPairSplitter. Weil TPairSplitter wurde von meiner Anwendung beim Starten nicht gefunden. Ich habe mehrmals den Splitter verwendet und auch das Fenster entsprechend klein gemacht. Ich habe natürlich TCheckListBoxAufgabenResize nicht gemacht.
Vielleicht liegt es daran.

Wie sieht denn die Funktion " Berechne_ListBoxSpalten_Nach_Resize" aus?
MFG
Michael Springwald

WeePee
Beiträge: 25
Registriert: So 8. Dez 2013, 13:46

Re: TCheckListBox und Spalten

Beitrag von WeePee »

class function THauptfenster.Berechne_ListBoxSpalten_Nach_Resize(ImpWidth : integer) : integer;
begin
case ImpWidth of
0000 .. 0500 : Berechne_ListBoxSpalten_Nach_Resize := 1;
0501 .. 0900 : Berechne_ListBoxSpalten_Nach_Resize := 2;
0901 .. 1300 : Berechne_ListBoxSpalten_Nach_Resize := 3;
else
Berechne_ListBoxSpalten_Nach_Resize := 4;
end;
end;
Kleiner Nachtrag: Auch das hellgrüne Fenster verhält sich so, das ist aber eine ListBox.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TCheckListBox und Spalten

Beitrag von pluto »

Ach ja: bei mir zeigt die Eigenschaft "TCheckListBoxAufgaben.Columns" keine Wirkung. Vielleicht liegt es daran das ich GDK2 nutze.
MFG
Michael Springwald

diogenes
Beiträge: 200
Registriert: So 11. Jul 2010, 18:39
OS, Lazarus, FPC: Linux
CPU-Target: 64 Bit
Wohnort: Wien
Kontaktdaten:

Re: TCheckListBox und Spalten

Beitrag von diogenes »

Ich kann generell nur von der Verwendung von TCheckListbox abraten! Steuerung durch Tatatur funktioniert nicht richtig, und auch die Sache mit den Spalten ist, freundlich ausgedrückt, mühsam. Ich rate zu einem TListView mit CheckBoxes auf True (das macht kleine Kasterln links neben den Eintragstexten :)) und mit ViewStyle auf vsList und ScrollBars auf ssAutoBoth, womit der Listview genau das Verhalten zeigt, das Du vermutlich erwartest, WeePee, nämlich die automatische Anpassung der Spaltenzahl an die Umstände (Anzahl und Breite der Listeneinträge sowie Breite des Views), genau so, wie's bei der Dateiliste des Windoof-Explorers geht (das ist nämlich ein Listview ohne Checkboxen). Automatisches Sortieren geht auch noch.
Nachteil: extra Listitems an Stelle der Stringliste. Der Umgang damit ist zwar etwas unbequem, aber für mich ist der Aufwand vertretbar für den Effekt.
Ceterum censeo computatores per Pascal docendos esse.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TCheckListBox und Spalten

Beitrag von Michl »

Das Fehlverhalten kann ich bestätigen unter Win7 64Bit, Lazarus 1.3 r43509 FPC 2.7.1.

Im Bugtracker konnte ich dieses Fehlverhalten nicht finden!

Habe mal ein Minimalbsp. angehangen. Bevor das Ganze im Bugtracker gepostet wird, wäre evtl. noch interessant, ob dieser Bug unter Linux auch auftritt?
Dateianhänge
TCheckListBoxBug.zip
(125.31 KiB) 58-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TCheckListBox und Spalten

Beitrag von Michl »

Also Workaround habe ich mal einen Timer platziert (Interval=1) und

Code: Alles auswählen

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:=False;
  CheckListBox1.ReAlign;
end;
 
procedure TForm1.CheckListBox1Resize(Sender: TObject);
begin
  CheckListBox1.Columns:=PairSplitterSide1.ClientWidth div 200 + 1;
  Timer1.Enabled:=True;
end;
so sieht man den Bug nicht (Repaint, Refresh, Invalidate funktionierten nicht).

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TCheckListBox und Spalten

Beitrag von pluto »

So wie es aussieht wird die Columns Eigenschaft unter GTK2 nicht unterstützt.
MFG
Michael Springwald

WeePee
Beiträge: 25
Registriert: So 8. Dez 2013, 13:46

Re: TCheckListBox und Spalten

Beitrag von WeePee »

Vielen Dank an alle, die geholfen haben. So wie es aussieht, ist das wohl ein Fehler.

@diogenes:
Vielen Dank für den Tipp.

Die CheckListBox reicht für mich in diesem Fall aus und tut im Großen und Ganzen, was sie soll. Der Doppelklick macht auch Ärger, aber das kann ich programmtechnisch abfangen. Die Tastatursteuerung ist für mich nicht so wichtig.

@Michl:
Den Workaround mit dem Realign werde ich mal probieren.

Benutzeravatar
theo
Beiträge: 10906
Registriert: Mo 11. Sep 2006, 19:01

Re: TCheckListBox und Spalten

Beitrag von theo »

WeePee hat geschrieben:Vielen Dank an alle, die geholfen haben. So wie es aussieht, ist das wohl ein Fehler.
Für Fehler ist der Bugtracker da: http://bugs.freepascal.org/
Du kannst ja mal nachschauen, ob der Fehler schon berichtet wurde.
Falls nicht, kannst du einen Bug-Report machen. Idealerweise prüfst du aber vorher nochmal mit der tagesaktuellen Version nach, ob der Fehler noch besteht.
http://freepascal.dfmk.hu/test/lazarus/

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: TCheckListBox und Spalten

Beitrag von Michl »

@Theo: Nur als Info: die Versionen dort werden MMn nicht besonders gepflegt. Ich nutze zum Download immer http://mirrors.iwi.me/lazarus/snapshots/

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
theo
Beiträge: 10906
Registriert: Mo 11. Sep 2006, 19:01

Re: TCheckListBox und Spalten

Beitrag von theo »

Michl hat geschrieben:@Theo: Nur als Info: die Versionen dort werden MMn nicht besonders gepflegt. Ich nutze zum Download immer http://mirrors.iwi.me/lazarus/snapshots/
Ja, sieht so aus.
Ich selber ziehe immer von SVN deshalb ist mir das wohl nicht aufgefallen. Früher war es zuverlässiger.

Antworten