GUI-Durcheinander
-
Hallo zusammen,
ich habe auf meinem GUI diverse TCheckBoxen angeordnet in folgender Darstellung:
inv [ ] [ ] Caption der Rechten TCheckBox [ ] [ ] Caption der Rechten TCheckBox [ ] [ ] Caption der Rechten TCheckBox [ ] [ ] Caption der Rechten TCheckBox [ ] [ ] Caption der Rechten TCheckBox [ ] [ ] Caption der Rechten TCheckBox [ ] [ ] Caption der Rechten TCheckBox [ ] [ ] Caption der Rechten TCheckBox [ ] [ ] Caption der Rechten TCheckBox [ ] [ ] Caption der Rechten TCheckBoxund die CheckBoxen haben folgende Namen:
// die linken Boxen Betrb_inv_CB Stoer_inv_CB AUS2_inv_CB AUS3_inv_CB Warn_inv_CB Fahr_inv_CB Soll_inv_CB ExBrem_inv_CB Lage_inv_CB Ausg1_inv_CB // die rechten Boxen Betrb_CB Stoer_CB AUS2_CB AUS3_CB Warn_CB Fahr_CB Soll_CB ExBrem_CB Lage_CB Ausg1_CBund ich habe bei allen das OnClick-Ereigniss 'Check_inv' zugewiesen, die Funktion sieht wie folgt aus:
void __fastcall TExtAusg_Frm::Check_inv(TObject *Sender) { TCheckBox *tmpBox_p = dynamic_cast<TCheckBox*>(Sender); if (tmpBox_p)//ist Sender vom Typ TCheckBox? { if (tmpBox_p->Name.AnsiPos("_inv"))// Wenn es eine invertierungs CheckBox ist {// überprüfen ob CheckBox welche nicht inv ist, nicht auch angekreuzt ist AnsiString tmpName= tmpBox_p->Name.Delete((tmpBox_p->Name.AnsiPos("_inv")),4); TCheckBox* p_tmpCB = dynamic_cast<TCheckBox*>(FindComponent(tmpName));// Edit finden im Parent if (p_tmpCB) { if (p_tmpCB->Checked) p_tmpCB->Checked=false; } } else {// überprüfen, ob nur CheckBox ohne '_inv' angekreuzt ist. } } }D.h. ich möchte immer, wenn ich eine linke CheckBox ankreuze und bereits eine rechte angekreuzt ist, die Rechte 'abkreuzen'

Das würd' ja auch ganz gut funktionieren, nur, wenn ich auf eine linke Checkbox klicke, ist Sender in Check_inv() plötzlich (meistens) ein Pointer auf die Rechte, d.h. Sender->Name ist plötzlich = 'Betrb_CB' anstatt = 'Betrb_inv_CB'
Warum bloss das??? Danke für eure Hilfe!

-
roN schrieb:
tmpBox_p->Name.Delete((tmpBox_p->Name.AnsiPos("_inv")),4);roN schrieb:
d.h. Sender->Name ist plötzlich = 'Betrb_CB' anstatt = 'Betrb_inv_CB'
Was hattest Du denn erwartet, was passieren würde, wenn du den Text rauslöschst?
Gruß,
Alexander
-
Davon abgesehen, sollte für so etwas TRadioGroup, oder TRadioButton verwendet werden.
"Interface Hall of Shame"
-
Alexander Kempf schrieb:
roN schrieb:
tmpBox_p->Name.Delete((tmpBox_p->Name.AnsiPos("_inv")),4);roN schrieb:
d.h. Sender->Name ist plötzlich = 'Betrb_CB' anstatt = 'Betrb_inv_CB'
Was hattest Du denn erwartet, was passieren würde, wenn du den Text rauslöschst?
Gruß,
Alexander
Das mach ich ja nur um abzuchecken ob die rechte CheckBox auch angekreuzt ist, ich mach damit nichts, ich weise das ja dem tmpName-String zu, oder überschreibt das sich etwa selber?:
AnsiString tmpName= tmpBox_p->Name.Delete((tmpBox_p->Name.AnsiPos("_inv")),4); TCheckBox* p_tmpCB = dynamic_cast<TCheckBox*>(FindComponent(tmpName));// CheckBox finden im Parent if (p_tmpCB) { if (p_tmpCB->Checked)// falls doch anekreuzt,... p_tmpCB->Checked=false; // ...abkreuzen }Joe_M. schrieb:
Davon abgesehen, sollte für so etwas TRadioGroup, oder TRadioButton verwendet werden.
"Interface Hall of Shame"Die kann man aber nicht mehr De-Selektieren.
-
roN schrieb:
oder überschreibt das sich etwa selber?:
Schau doch mal in die Hilfe...
Wenn Du keine Lust hast (oder Zeit oder irgendein anderer Grund besteht), kannst Du Dir auch behelfen,
indem Du vor dem Löschen den Inhalt in die temporäre Variable kopierst.roN schrieb:
Joe_M. schrieb:
Davon abgesehen, sollte für so etwas TRadioGroup, oder TRadioButton verwendet werden.
Die kann man aber nicht mehr De-Selektieren.
Dann nimm halt drei.
Gruß,
Alexander
-
Dir ist schon klar, dass Du auch mit dem manuellen Zuweisen des Checked-Status, die Ereignisroutine dazu ausgelöst wird?
Äh, dann gibt es 3 Stati? Beide aus und entweder das eine an, oder das andere an? Das wären dann 3 Radiobuttons. Status 1, Status 2 und Nichts von alledem. Als User würde ich das vorziehen, da weiß ich gleich woran ich bin.
-
Alexander Kempf schrieb:
Schau doch mal in die Hilfe...
Wenn Du keine Lust hast (oder Zeit oder irgendein anderer Grund besteht), kannst Du Dir auch behelfen,
indem Du vor dem Löschen den Inhalt in die temporäre Variable kopierst.Gruß,
Alexander
*genauerindieHilfekuk*
Ach ja...
*huups* jetzt läufts 
Danke Dir!
-
Joe_M. schrieb:
Dir ist schon klar, dass Du auch mit dem manuellen Zuweisen des Checked-Status, die Ereignisroutine dazu ausgelöst wird?
Äh, dann gibt es 3 Stati? Beide aus und entweder das eine an, oder das andere an? Das wären dann 3 Radiobuttons. Status 1, Status 2 und Nichts von alledem. Als User würde ich das vorziehen, da weiß ich gleich woran ich bin.
Das ist schon so, aber um die 'Zueinandergehörigkeit' festzulegen muss ich noch 10 Gruppenfelder anlegen, welche schlecht Platz finden...

-
roN schrieb:
Joe_M. schrieb:
Dir ist schon klar, dass Du auch mit dem manuellen Zuweisen des Checked-Status, die Ereignisroutine dazu ausgelöst wird?
Äh, dann gibt es 3 Stati? Beide aus und entweder das eine an, oder das andere an? Das wären dann 3 Radiobuttons. Status 1, Status 2 und Nichts von alledem. Als User würde ich das vorziehen, da weiß ich gleich woran ich bin.
Das ist schon so, aber um die 'Zueinandergehörigkeit' festzulegen muss ich noch 10 Gruppenfelder anlegen, welche schlecht Platz finden...

Schonmal die Hilfe zu TRadioButton durchgelesen? Da steht auch wie es in deinem Fall gehen würde...
-
Dasd schrieb:
die Hilfe zu TRadioButton durchgelesen? Da steht auch wie es in deinem Fall gehen würde...
eben, ich müsste 10 Gruppenfelder erstellen.
-
*seufz*
BCB-Hilfe schrieb:
Standardmäßig gehören alle Optionsfelder, die in einem fensterorientierten Container enthalten sind (z.B. in TRadioGroup oder TPanel), zur selben Gruppe. Zwei Optionsfelder in einem Formular können beispielsweise nur dann gleichzeitig aktiviert sein, wenn sie in separaten Containern (z.B. in zwei unterschiedlichen Gruppenfeldern) enthalten sind.
Ich habe mal die wichtigsten Dinge markiert. Und bei Panels kann man den Rahmen unsichtbar machen...