Tastatureingabe erzeugt Absturz bei TChecklistbox

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
jrx
Beiträge: 49
Registriert: Fr 14. Mai 2010, 13:23
OS, Lazarus, FPC: Win/UX
Wohnort: Erlangen

Tastatureingabe erzeugt Absturz bei TChecklistbox

Beitrag von jrx »

Hallo

In meinem Programm kommt eine TChecklistbox zum Einsatz.
Mit der Maus funktioniert alles ganz gut, Probleme gibts wenn wir die Tastatur bemühen.
Plattform Windows, Fehler tritt unter XP und W7 auf, Lazarus 1.0.2 r39019 FPC 2.6.0 i386-win32-win32/win64

Beispiel: (TChecklistbox mit 2 Items)
  • mit TAB in die TChecklistbox --> das erste Item erhellt den Fokus (XP, dünner Rahmen).
  • mit den Pfeiltasten wird kann ich nun das Item auswählen.
    Allerdings bewegt sich der "Cursor" nun nicht, sondern zunächst wird bei Tastendruck das Item markiert (blau).
    Erst beim zweiten KeyDown bewegt sich der Cursor.
  • mit der Spacetaste kann ich die Checkbox auf checked setzen.
So weit so gut: A B E R
Wenn ich aber gleich auf im ersten Item die Spacetaste drücke, weil ich genau dieses erste "checken" will, stürzt das Programm ab!
Exception-Fehlermeldung: TChecklistbox Index -1 out of bounds 0 .. 1


Mein Workaround ist momentan, daß ich im Programm prüfen lasse, ob was in der TChecklistbox drin ist :
  • benutze einen Timer :( der natürlich schneller sein muss als ein flinker Finger
  • TChecklistbox.enabled := (TChecklistbox.items.count>0);
    Damit es gar nicht erst den Fokus bekommt.
  • if (TChecklistbox.Items.Count>0) AND (if TChecklistbox.ItemIndex<0) then TChecklistbox.ItemIndex:=0;
Das ist aber umständlich!
Wieso bekommt TChecklistbox.itemindex nicht gleich den Wert 0, wenn es das erste Mal den Fokus erhält (und auch was drin ist)?
Kann man das im Formulareditor/Objektinspektor vorgeben?
Ist das ein Bug? (Glaub ich selber nicht.)

Mein Workaround ist umständlich, weil ich immer die Änderungen in der TChecklistbox berücksichtigen muss.
Vielleicht kann mir jemand bitte einen Tipp geben.

jrx

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

Re: Tastatureingabe erzeugt Absturz bei TChecklistbox

Beitrag von theo »

MMn ist das ein Bug. Auf GTK2 gibt es kein Problem damit.
Mach ein Minimalbeispiel und erstelle einen Bugreport: http://bugs.freepascal.org/

Als temporärer Workaround könnte man das OnEnter Event der Checklistbox benutzen:

Code: Alles auswählen

procedure TForm1.CheckListBox1Enter(Sender: TObject);
begin
  if CheckListBox1.Count>0 then CheckListBox1.Selected[0]:=true;
end;  

Soner
Beiträge: 756
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Tastatureingabe erzeugt Absturz bei TChecklistbox

Beitrag von Soner »

jrx hat geschrieben: Kann man das im Formulareditor/Objektinspektor vorgeben?
Ja, bei ItemIndex-Eigenschaft.

Scheint Bug zu sein. Wenn du in Checklst.pas diese Änderungen machst löst sich das Problem für immer:

lazaurs/lcl/checklst.pas

Code: Alles auswählen

 
//...
procedure TCustomCheckListBox.KeyDown(var Key: Word; Shift: TShiftState);
var
  Index: Integer;
begin
  if (Key = VK_SPACE) and (Shift=[]) then
  begin
    Index := ItemIndex;
 
   //FÜGE HIER DIE NÄCHSTEN 4 ZEILEN EIN
    if (Index<0)and(Items.Count>0) then begin
      ItemIndex:=0;
      Index := 0;
    end;
   //BIS HIER
 
    Checked[Index] := not Checked[Index];
    ItemClick(Index);
    Key := VK_UNKNOWN;
  end else
    inherited KeyDown(Key,Shift);
end;    
//..
 

jrx
Beiträge: 49
Registriert: Fr 14. Mai 2010, 13:23
OS, Lazarus, FPC: Win/UX
Wohnort: Erlangen

Re: Tastatureingabe erzeugt Absturz bei TChecklistbox

Beitrag von jrx »

Danke,
hab die Variante vom Theo genommen.
Das LCL fass ich nicht an. Dann taucht der Fehler beim nächsten Update vllcht. wieder auf.

Grüße jrx

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

Re: Tastatureingabe erzeugt Absturz bei TChecklistbox

Beitrag von theo »

@jrx: Hast du einen Bugreport gemacht?
Das ist eindeutig ein Fehler im win32 Interface.

jrx
Beiträge: 49
Registriert: Fr 14. Mai 2010, 13:23
OS, Lazarus, FPC: Win/UX
Wohnort: Erlangen

Re: Tastatureingabe erzeugt Absturz bei TChecklistbox

Beitrag von jrx »

Hallo theo,
ich hab noch nie einen Bugreport gemacht.
Die bunte Seite hat mich etwas abgeschreckt.
jrx

Antworten