Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - 3 Checkboxen sollen aufeinander reagieren --> Stack-Überlauf


Terra23 - Do 06.10.11 19:42
Titel: 3 Checkboxen sollen aufeinander reagieren --> Stack-Überlauf
Hi Leute!

Ich habe 3 Checkboxen, die aufeinander reagieren sollen. Ich weiß, dass es mit einer RadioGroup viel einfacher zu lösen wäre, aber die wird von AlphaLite nicht geskinnt, aber AlphaLite bringt eigene Checkboxen mit.

Kann mir jemand helfen? Ich habe 3 Boxen. Wenn die eine angeklickt wird, dann soll sie den Haken bekommen und die anderen beiden sollen ihren Haken verlieren. Eigentlich ganz simpel ... das dachte ich zumindest, als ich diesen Code schrieb.

Mein Code sieht so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.ChckboxMainClick(Sender: TObject);
begin
ChckboxMain.State := cbChecked;
ChckboxSide.State := cbUnchecked;
ChckboxFusion.State := cbUnchecked;
end;

procedure TForm1.ChckboxSideClick(Sender: TObject);
begin
ChckboxMain.State := cbUnchecked;
ChckboxSide.State := cbChecked;
ChckboxFusion.State := cbUnchecked;
end;

procedure TForm1.ChckboxFusionClick(Sender: TObject);
begin
ChckboxMain.State := cbUnchecked;
ChckboxSide.State := cbUnchecked;
ChckboxFusion.State := cbChecked;
end;


Ich habe es auch vorher schon anders probiert, also nicht den State abgefragt sondern nach der Eigenschaft "Checked" gefragt. Es hat das gleiche Ergebnis gebracht, nur dass der Stack-Überlauf nicht gleich sofort kam... ;)

Gruß,

Terra

PS: Wenn mir noch jemand kurz erklären kann, was ein Stack-Überlauf ist, dann wäre ich noch zufriedener... ;)


Marc. - Do 06.10.11 19:53

Ich habe kein Delphi da, rate also einfach mal ins Blaue: Kann es sein, dass das Setzen von Checked ein OnClick-Ereignis auslöst? Damit würden sich die Ereignisse unbestimmt lange gegenseitig aufrufen, was möglichweise in einem StackOverflow enden könnte. ;)

Um es einmal grob zu formulieren: Ein Stack (FILO) ist eine Liste, beispielsweise ein Array, mit fester Länge. Sobald du mehr Daten dort ablegst (zwischenspeicherst) als reinpassen, gibt's einen Überlauf. :)


Horschdware - Do 06.10.11 20:21

@Marc: Genau so ist es. :zustimm:

@Terra:
ich würde Checkboxen für so ein Vorhaben ohnehin nicht nutzen. Für diese Funktionalität gibt es ja Radiobuttons.
Die Frage ist nun, ob dein dein AlphaLite normale Radiobuttons (statt RadioGroup) richtig skinnt.


BenBE - Do 06.10.11 22:20

Fasse alles dreis in eine Routine zusammen und bau das ganze so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.CBClick(Sender: TObject);
var
    CB: TCheckbox;
begin
    CB := TCheckbox(Sender);
    if not Assigned(CB) or (CB.Tag <> 0then Exit;

    CB.Tag := 1;

    ChckboxMain.State := cbUnchecked;
    ChckboxSide.State := cbUnchecked;
    ChckboxFusion.State := cbUnchecked;

    CB.State := cbChecked;

    CB.Tag := 0;
end;


Horschdware - Fr 07.10.11 08:18

Mein ehemaliger Dozent für Softwareergonomie stirbt bei so etwas immer ein kleines Bisschen :wink:


jaenicke - Sa 08.10.11 07:42

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Die Frage ist nun, ob dein dein AlphaLite normale Radiobuttons (statt RadioGroup) richtig skinnt.
Nur die (kostenpflichtige) Vollversion, nicht die Lite Version.

user profile iconHorschdware hat folgendes geschrieben Zum zitierten Posting springen:
Mein ehemaliger Dozent für Softwareergonomie stirbt bei so etwas immer ein kleines Bisschen :wink:
Geiz ist halt geil...

Ein normales Design ohne Skins wäre sicher besser geeignet als die falschen Komponenten zu verwenden, die dem Benutzer nun einmal eine andere Funktionalität signalisieren... :roll: