Holger Schieferdecker
2021-02-23 15:48:32 UTC
Hallo,
in einem kleinen Programm (D4) habe ich mehrere Checkboxen, von denen
nur eine oder keine gleichzeitig angehakt sein soll. Dazu habe ich im
OnMouseUp (gleiche Routine für alle Checkboxen) folgendes stehen:
procedure TForm1.CheckBoxFunctionMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Sender is TCheckBox then begin
if TCheckBox(Sender).Checked then begin
ClearFunctionCheckboxes(Sender);
end;
StringGrid1.Repaint;
end;
end;
ClearFunctionCheckboxes(Sender) setzt bei allen Checked:=false, nur bei
der des Sender nicht.
procedure TForm1.ClearFunctionCheckboxes(aCBtoTrue:TObject=NIL);
begin
CheckboxReplace.Checked:=false;
CheckBoxDelete.Checked:=false;
CheckBoxInsert.Checked:=false;
CheckBoxEnumerate.Checked:=false;
CheckBoxCorrectNumbering.Checked:=false;
CheckBoxDeleteSep.Checked:=false;
if aCBtoTrue is TCheckBox then begin
(aCBtoTrue as TCheckBox).Checked:=true;
end;
end;
Das klappt auch soweit. Nun ist mir aufgefallen, daß man ja auch mit der
Leertaste das Häkchen einer mittels TAB angesteuerten Checkbox setzen
oder löschen kann. Also habe ich etwas ähnliches mit OnKeyUp gemacht:
procedure TForm1.CheckBoxFunctionKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Sender is TCheckBox) and (Key=VK_SPACE) then begin
// showmessage('Hallo');
if TCheckBox(Sender).Checked then begin
ClearFunctionCheckboxes(Sender);
end;
StringGrid1.Repaint;
end;
end;
Damit klappt es aber nur, wenn ich den Kommentar bei showmessage
entferne. Ohne showmessage sehe ich im Debugger, daß
TCheckBox(Sender).Checked=false ist, obwohl anschließend das Häkchen
gesetzt wird. Was könnte showmessage da noch machen, daß in dem Fall
bereits true gefunden wird? Ist das eine Timing-Geschichte?
Application.ProcessMessages bringt übrigens nichts.
Da das nur ein kleines Programm für den Eigenbedarf ist, ist das kein
echtes Problem, aber mich interessiert, woher der Unterschied kommt. Wie
könnte ich dem auf die Spur kommen? Oder wie könnte ich das anders lösen?
Ja, natürlich könnte ich das ganze auf eine Radiogroup umbauen, dann
bräuchte ich eben ein zusätzliches Item für den Fall, daß keine Funktion
gewünscht ist.
Holger
in einem kleinen Programm (D4) habe ich mehrere Checkboxen, von denen
nur eine oder keine gleichzeitig angehakt sein soll. Dazu habe ich im
OnMouseUp (gleiche Routine für alle Checkboxen) folgendes stehen:
procedure TForm1.CheckBoxFunctionMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Sender is TCheckBox then begin
if TCheckBox(Sender).Checked then begin
ClearFunctionCheckboxes(Sender);
end;
StringGrid1.Repaint;
end;
end;
ClearFunctionCheckboxes(Sender) setzt bei allen Checked:=false, nur bei
der des Sender nicht.
procedure TForm1.ClearFunctionCheckboxes(aCBtoTrue:TObject=NIL);
begin
CheckboxReplace.Checked:=false;
CheckBoxDelete.Checked:=false;
CheckBoxInsert.Checked:=false;
CheckBoxEnumerate.Checked:=false;
CheckBoxCorrectNumbering.Checked:=false;
CheckBoxDeleteSep.Checked:=false;
if aCBtoTrue is TCheckBox then begin
(aCBtoTrue as TCheckBox).Checked:=true;
end;
end;
Das klappt auch soweit. Nun ist mir aufgefallen, daß man ja auch mit der
Leertaste das Häkchen einer mittels TAB angesteuerten Checkbox setzen
oder löschen kann. Also habe ich etwas ähnliches mit OnKeyUp gemacht:
procedure TForm1.CheckBoxFunctionKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Sender is TCheckBox) and (Key=VK_SPACE) then begin
// showmessage('Hallo');
if TCheckBox(Sender).Checked then begin
ClearFunctionCheckboxes(Sender);
end;
StringGrid1.Repaint;
end;
end;
Damit klappt es aber nur, wenn ich den Kommentar bei showmessage
entferne. Ohne showmessage sehe ich im Debugger, daß
TCheckBox(Sender).Checked=false ist, obwohl anschließend das Häkchen
gesetzt wird. Was könnte showmessage da noch machen, daß in dem Fall
bereits true gefunden wird? Ist das eine Timing-Geschichte?
Application.ProcessMessages bringt übrigens nichts.
Da das nur ein kleines Programm für den Eigenbedarf ist, ist das kein
echtes Problem, aber mich interessiert, woher der Unterschied kommt. Wie
könnte ich dem auf die Spur kommen? Oder wie könnte ich das anders lösen?
Ja, natürlich könnte ich das ganze auf eine Radiogroup umbauen, dann
bräuchte ich eben ein zusätzliches Item für den Fall, daß keine Funktion
gewünscht ist.
Holger