[MSVC++ 2005] for each Schleife

the incredible Leitman

Erfahrenes Mitglied
Hallo Leute, hoffe, mir kann mal jemand helfen :D

Also, mal angenommen, ich gehe mittels for each durch einen Container mit Controls und möchte die Anzahl der Buttons herausfinden... wie gehe ich da am geschicktesten vor?

Momentan habe ich es folgendermaßen probiert:
(Standard Windows Form mit einigen Controls)
C++:
for each (System::Windows::Forms::Button ^button in this->Controls)
{
    ++counter;
}
Nun habe ich aber das Problem, dass sich in dem Container noch andere Controls befinden, als nur Buttons...

Also bin ich nun auf diese Weise vorgegangen:
C++:
for each (System::Object ^object in this->Controls)
{
    if(System::Windows::Forms::Button::typeid->IsAssignableFrom(object->GetType())
    ++counter;
}

Dieses Problem ist mir bereits schon einige Male untergekommen,
und ich finde meine Lösung nicht gerade berauschend...

Muss ich für jeden Typ einen Extra Container anlegen? o_O

Andererseits finde ich die Logik dieser Funktion ziemlich unpassend...
Wenn ich "alle Buttons" in einem Container suche, wieso erhalte ich dann auch Labels und sonstigen Schnick Schnack zurück :confused:

Hoffe Ihr habt Ideen, Vorschläge ^^

Vielen Dank und
mit freundlichen Grüßen

Leitman
 
Hi

Weil die Collection nur Controls (Basisklasse) kennt, keine Buttons:

C++:
for each (Control^ ctrl in this->Controls)
{
    if (ctrl->GetType() == typeof(Button))
    {
        //mach was
    }
}
ich kann dir jetzt nicht sagen, ob es die Funktion typeof auch unter C++.NET gibt, ggf. musst du das Equivalent suchen.
 
hm... so wie du es in deinem Code gemacht hast,
gibt es "typeof" scheinbar in VC++ nicht....

Ich kann stattdessen if(ctrl->GetType() == System::Windows::Forms::Button::typeid) verwenden ^^

Aber darin lag nicht das Problem...
Eher an diesem unnötigen Zwischenschritt...

Wieso kennt die Collection nur die Basisklasse? :confused:
Ich mein, ich kann ja auch andere Controls hinzufügen?
wie z.B this->Controls->Add(gcnew System::Windows::Forms::Button())

Da sollte ich die ja auch ohne diesen "Überprüfungsschritt" auch wieder rausholen können :p
 
Wie gesagt nein, die Collection kennt nur die Basisklasse.
Du kannst aber auch .NET 3.x nutzen und per LINQ eine Abfrage auf de Collection machen. Ich kann dir jetzt aber nicht sagen, ob der Typ als Bedingung möglich ist.
 
Hm.... nagut, dann lass ichs eben -.- *grml*

Trotzdem danke ^^
Würd deinen Beitrag ja gerne bewerten, aber scheinbar hast du schon genug Plus von mir bekommen XD
 
Zurück