Array von CheckBoxen erzeugen
-
Moin,
ich möchte ein Array von CheckBoxen erzeugen, um meine Checkboxen in einer for Schleife auswerten zu können.
__published: // Von der IDE verwaltete Komponenten TGroupBox *GroupBox1; private: TCheckBox *cb; void CreateCheckBoxes(int num_boxes, int j) { for (int i = 0; i < num_boxes; i++) { cb = new TCheckBox(GroupBox1); cb->Parent = GroupBox1; cb->Left = j+40; cb->Top = j+20; cb->Caption = "Checkbox " + IntToStr(i); cb->Checked = True; // or false j+=20; } }
Leider schaffe ich es jedoch nicht mittels:
for(int i=0; i<10; i++) { if (cb[i]->Checked == True) { //do anything } else { //do nothing } }
meine CheckBoxen dynamisch via Schleife abzufragen.
Bin für jede Hilfe dankbar.
MfG
Alibaba258
-
Hallo
Die Variable "cb" ist nur ein Zeiger und kein Array von Zeigern, die Anwendung des []-Operators darauf ist damit nicht gültig.
Und "Leider schaffe ich es jedoch nicht" ist auch keine ausreichende Fehlerbeschreibung.bis bald
akari
-
Nimm ein Vektorarray, wenn du nicht weißt, wieviele Boxen du benötigst. Ansonsten brauchst du ein normales Array. Alternativ könntest du noch durch alle Objekte auf der Form loopen und schauen ob es eine Checkbox ist. Die erste Version sollte aber für die beste sein.
greetz KN4CK3R
-
Schon mal vielen Dank für eure Hilfe.
Vielleicht habe ich mich etwas falsch ausgedrückt, deswegen schreibe ich mein problem nochmals.
In meiner Anwendung habe ich 512 CheckBoxen. Halt CheckBox1 - CheckBox512.
Das problem ist nun das ich jede einzelne CheckBox abfragen muss ob Cheked oder nicht. Natürlich möchte ich jetzt nicht 512 Abfragen starten sondern das ganze gerne mit einer Schleife lösen.
Also habe ich folgendes probiert:
for(int i=1; i<513; i++) { if(CheckBox[i]->Checked == True) { //Do anything } else { //Do nothing } }
Das Programm compiliert jedoch nicht mit der Fehlermeldung "Undefiniertes Symbol CheckBox".
So dann bin ich auf die Idee mit dem Array gekommen weiß jedoch nicht wie ich das nun realisieren kann.
MfG
Alibaba258
-
Alibaba258 schrieb:
Vielleicht habe ich mich etwas falsch ausgedrückt, deswegen schreibe ich mein problem nochmals.
Nein, eher hast du die Antworten nicht ausreichend verstanden.
Du musst du eine Variable haben, die alle Checkboxen aufnimmt, um sie Abfragen zu können. Am besten im private-Bereich deiner Form (Da die VCL die sich um die Freigabe kümmert, sofern ein Owner wie bei dir beim Konstruktoraufruf gesetzt ist, kannst du beispielsweise ein std::vector oder ein Array von Zeigern verwenden).
cu André
-
Du bist schon verstanden worden, hast aber scheinbar die Antworten nicht verstanden.
Nochmal: Deine Variable cb ist kein Array auf TCheckBox, sondern eine einzelne CheckBox. Was du brauchst ist eine Array auf Zeiger von TCheckBox oder wie schon erwähnt ein vector darauf.
Hier mal die ArrayVariante.private: TCheckBox **cb = new TCheckBox*[num_boxes]; void CreateCheckBoxes(int num_boxes, int j) { for (int i = 0; i < num_boxes; i++) { cb[i] = new TCheckBox(GroupBox1); cb[i]->Parent = GroupBox1; cb[i]->Left = j+40; cb[i]->Top = j+20; cb[i]->Caption = "Checkbox " + IntToStr(i); cb[i]->Checked = true; // or false j+=20; } } //zum Schluß (z.Bsp. im Destruktor) das delete nicht vergessen delete[] cb;
mit einem std::vector ist das etwas einfacher
private: std::vector<TCheckBox*> cb_vect; void CreateCheckBoxes(int num_boxes, int j) { for (int i = 0; i < num_boxes; i++) { TCheckBox* cb = new TCheckBox(GroupBox1); cb->Parent = GroupBox1; cb->Left = j+40; cb->Top = j+20; cb->Caption = "Checkbox " + IntToStr(i); cb->Checked = true; // or false cb_vect.push_back(cb); // zum vector zufügen j+=20; } }
-
Stimmt hatte es falsch verstanden
Ich hab jetzt mal die Version des Array gewählt und alles in mein Programm integriert.
class TFrame4 : public TFrame { __published: // IDE-verwaltete Komponenten TGroupBox *GroupBox1; private: // Benutzer Deklarationen TCheckBox **cb = new TCheckBox*[7]; public: // Benutzer Deklarationen __fastcall TFrame4(TComponent* Owner); void CreateCheckBoxes(int num_boxes, int j) { for (int i=0; i < num_boxes; i++) { cb[i] = new TCheckBox(GroupBox1); cb[i]->Parent = GroupBox1; cb[i]->Left = j+40; cb[i]->Top = j+20; cb[i]->Checked = false; j+= 20; } } };
Leider spuckt er mir in Zeile 7 folgenden Fehler aus:
E2233 Klassenelement kann hier nicht initialisiert werden
Vielleicht kann mir ja noch jemand sagen woran das liegt.
MfG
Alibaba258
-
TCheckBox **cb = new TCheckBox*[7];
Die Fehlermeldung sagt doch eigentlich alles:
Du kannst das Element an der Stelle nicht initialisieren. Pack die Initialisirung einfach in den Konstruktor von TFrame4.
Ich will dich ja nicht entmutigen aber du solltest dir eventuell erstmal das Basis Wissen aneignen wozu auch Arrays und Klassen gehören.
-
Vielen Dank jetzt funktionierts.
Hab die Zeile 7 jetzt einfach über die Klassendefinition gesetzt und siehe da, funktioniert ohne Probleme.
MfG
Alibaba258