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
    

  • Mod

    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.


Anmelden zum Antworten