pictureBox array
-
Hi,
ich wollte meinen Code verkleinern
pictureBox3->SetBounds(,,,); pictureBox4->SetBounds(,,,); pictureBox5->SetBounds(,,,); pictureBox6->SetBounds(,,,); pictureBox7->SetBounds(,,,); pictureBox8->SetBounds(,,,); pictureBox9->SetBounds(,,,); pictureBox10->SetBounds(,,,); pictureBox11->SetBounds(,,,);
und zwar in dem Stil
for(int i=1;i<11;i++) { pictureBox[i]->SetBounds(,,,); }
Könnte mir da vielleicht jemand helfen?
Danke im Vorraus
-
Geht nicht. Vielleicht alle pictureBoxen in ein Vector legen am Anfang und dann später greifst du auf jedes Element zu und machst dein Ding damit dann.
-
Bin leider n ziemlicher Newbie und wir hatten Vektoren noch nicht. Das ist mein bisheriger Quellcode, lässt sich da was machen? Denn ohne diesen Array funktioniert mein verkürzter Code nicht so ganz^^
static int angle[9]; int X[9],Y[9]; double PI2 = 2 * Math::PI; for(int i=1;i<11;i++) { angle[i] = (60/9)*(i-1); X[i] = static_cast<int>((90-10*i) * Math::Cos(angle[i]/PI2)); Y[i] = static_cast<int>((90-10*i) * Math::Sin(angle[i]/PI2)); //pictureBox[i]->SetBounds(X[i]+600, Y[i]+480,20,20); angle[i]++; } pictureBox2->SetBounds(X[1]+600, Y[1]+480,20,20); //Merkur pictureBox3->SetBounds(X[2]+600, Y[2]+480,25,25); //Venus pictureBox4->SetBounds(X[3]+600, Y[3]+480,30,30); //Erde pictureBox5->SetBounds(X[4]+600, Y[4]+480,10,10); //Mond pictureBox6->SetBounds(X[5]+600, Y[5]+480,20,20); //Mars pictureBox7->SetBounds(X[6]+600, Y[6]+480,100,100); //Jupiter pictureBox8->SetBounds(X[7]+600, Y[7]+480,77,41); //Saturn pictureBox9->SetBounds(X[8]+600, Y[8]+480,54,54); //Uranus pictureBox10->SetBounds(X[9]+600, Y[9]+480,54,54); //Neptun pictureBox11->SetBounds(X[10]+600, Y[10]+480,20,20); //Pluto
-
Das kann man mit Präprozessormakros sehr schön machen. Aber das Thema ist nicht ganz einfach und bietet viele böse Fallstricke, auf die man achten muss. Du solltest dich schon gut mit dem Präprozessor auskennen, bevor du mit solchen Sachen anfängst.
Es gibt auch eine Bibliothek namens boost::preprocessor die einen vor vielen der möglichen Fehler schützt und außerdem viel Arbeit abnimmt. Ein solides Grundverständnis des Präprozessors würde ich aber auch hier voraussetzen.
-
Oder
for(size_t i = 0; i <= vector.size(); i++) { vector[i]->SetBounds(...); }
-
Wieso Präprozessor? Liste oder Vektor reicht doch.
Keine Ahnung welchen Typ pictureBox* hat, aber ich nehme mal TPictureBox als Typ.#include <list> //Liste erzeugen aus Template // Das is jetzt eine Liste, die std::list<TPictureBox*> Boxen; // Neue Picture Box hinzufügen geht so: Boxen.push_back(gültiger_zeiger); // Iterieren geht so: std::list<TPictureBox>::iterator it; for ( it = Boxen.begin(); it != Boxen.end(); ++it) { TPictureBox* element = *it; element->SetBounds(,,,); }
Nur bitte dran denken den Speicher der Boxen wieder freizugeben beim Beenden des Programms.
Beispiel:std::list<TPictureBox*>::iterator it; for ( it = Boxen.begin(); it != Boxen.end(); ++it) { TPictureBox* element = *it; delete element; }
Oder hab ich was falsch verstanden?
lg
-
Also ich danke schonmal für die Hilfe. Ich habe vergessen zu erwähnen dass ich Visual C++ 2008 Express Edition verwende und eine Windows Forms-Anwendung erstellt habe. Ich habe diese Quellcodes mit einem Kollegen angeschaut und wir wussten nicht so recht wohin damit. Wir haben es jetzt anders gelöst, nur wurde das ganze jetzt unübersichtlicher:
array<PictureBox ^> ^ bild; #pragma endregion private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { bild = gcnew array<PictureBox ^>(11); this->bild[1] = (gcnew System::Windows::Forms::PictureBox()); this->bild[1]->Location = System::Drawing::Point(84, 62); this->bild[1]->Name = L"bild"; this->bild[1]->Size = System::Drawing::Size(73, 68); this->bild[1]->TabIndex = 0; this->bild[1]->BackColor = System::Drawing::SystemColors::ControlText; this->bild[1]->TabStop = false; this->Controls->Add(this->bild[1]); this->bild[2] = (gcnew System::Windows::Forms::PictureBox()); this->bild[2]->Location = System::Drawing::Point(150, 80); this->bild[2]->Name = L"bild"; this->bild[2]->Size = System::Drawing::Size(73, 68); this->bild[2]->TabIndex = 0; this->bild[2]->BackColor = System::Drawing::SystemColors::Window; this->bild[2]->TabStop = false; this->Controls->Add(this->bild[2]); } }; }
Damit hatten wir schonmal einen Array, jedoch würde ich lieber eure Varianten nehmen, da diese kürzer sind^^
-
Falsches Forum: korrekt wäre C++/CLI.
Ausserdem: http://www.c-plusplus.net/forum/viewtopic-var-t-is-263084.html
-
Ich würd ja lieber den C++ Builder benutzen, ich muss dieses Projekt allerdings in der Schule beenden und dort haben wir nur VC 2008 (auch die Prüfungen werden mit diesem Programm gemacht). Wär natürlich toll, wenn dieses Thema jemand verschieben und mir einer aus den Schnipsel etwas verständliches basteln kann. Der Lehrer scheint jedenfalls auch keine Ahnung zu haben.
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Habs irgendwie hinbekommen:
static int winkel[10]; #pragma once
array<PictureBox ^> ^ bild; #pragma endregion private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { int X[10],Y[10]; double PI2 = 2 * Math::PI; for(int i=1;i<11;i++) { X[i] = static_cast<int>((90-10*i) * Math::Cos(winkel[i]/PI2)); Y[i] = static_cast<int>((90-10*i) * Math::Sin(winkel[i]/PI2)); bild[i]->SetBounds(X[i]+600, Y[i]+480,20,20); winkel[i]++; } } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { for(int i=1;i<11;i++) { winkel[i] = (60/9)*(i-1); textBox1->Text = Convert::ToString(winkel[i]); } bild = gcnew array<PictureBox ^>(12); bild[1] = pictureBox1; bild[2] = pictureBox2; bild[3] = pictureBox3; bild[4] = pictureBox4; bild[5] = pictureBox5; bild[6] = pictureBox6; bild[7] = pictureBox7; bild[8] = pictureBox8; bild[9] = pictureBox9; bild[10] = pictureBox10; bild[11] = pictureBox11; }
Abermals vielen Dank für die Hilfe. Vielleicht gibts ne Möglichkeit, das ganze noch weiter zu verkürzen, doch ich bin soweit zufrieden damit.
-
Erster Tipp:
Anstatt:bild = gcnew array<PictureBox ^>(11); bild[0] = pictureBox1; bild[1] = pictureBox2; bild[2] = pictureBox3; bild[3] = pictureBox4; bild[4] = pictureBox5; bild[5] = pictureBox6; bild[6] = pictureBox7; bild[7] = pictureBox8; bild[8] = pictureBox9; bild[9] = pictureBox10; bild[10] = pictureBox11;
"besser" (nicht immer aber für einige):
for(int i = 0; i < 12; i++) bild[i] = this->Controls["pictureBox" + i.ToString()];
Wenn du nicht aufpasst kann "nullptr" zurückgegeben.
Zweiter:
Außerdem (ich gehe mal von einem kreis aus - sonst kannst du mit den Zahlen rumspielen:// int X[10],Y[10]; brauchst du nicht, wenn du es nnur in der Schleife verwendest double PI2 = 2 * Math::PI, angle = 0.0 /* oder anders z.B.: eine Variable anstatt (1) */, step = 2d * Math::PI / 11; for(int i = 0; i < 11; i++, angle += step) { double x = (int) ((90-10*i) * Math::Cos(angle), y = (int) ((90-10*i) * Math::Sin(angle); bild[i]->SetBounds(x + 600, y + 480, 20, 20); //winkel[i]++; // (1) }
-
Vielen Dank! Hat funktioniert!
static int winkel[10]; #pragma once
Timer1 Tick
double PI2 = 2 * Math::PI, step = 2d * Math::PI / 11; for(int i=1;i<11;i++, winkel += step) { double X[i] = (int) ((90-10*i) * Math::Cos(angle), Y[i] = (int) ((90-10*i) * Math::Sin(angle); bild[i]->SetBounds(X[i]+630, Y[i]+500,100+i*30,20); }
Form1 Load
for(int i=1;i<11;i++) { static int winkel[i] = (60/9)*(i-1); } for(int i = 0; i < 12; i++) { bild[i] = this->Controls["pictureBox" + i.ToString()]; }
EDIT: wohl doch nicht, das Programm hat irgendwie alles angenommen. Werd's mir nochmal anschauen und poste dann hier das endgültige Ergebnis.