PictureBox->Visible lässt sich nicht verändern



  • Guten Tag,
    ich habe 25 PictureBoxen, die nach und nach "verschwinden" sollen.

    while(i < 3){
        stand(time(0));
        int x = (rand() % 25) + 1;
        if(x == 1 && pictureBox1->Visible == true){
            pictureBox1->Visible = false;
            i++;
        }else if(x == 2 && pictureBox2->Visible == true){
            pictureBox2->Visible = false;
            i++;
        }
    //und so weiter
    
    }
    

    Als ich das Programm ausführte, bekam ich zwar keinen Fehler, aber das Programm blieb hängen, weil es nicht mehr aus der Schleife rauskam.
    Deshalb hab ich ein bisschen rumprobiert und festgestellt, dass i nicht erhöht wird, weil if(x == 1 && pictureBox1->Visible == true) (oder ein anderer Fall) nie eintritt.
    Ich hab das ganze auf folgendes vereinfacht.

    if(pictureBox1->Visible == true){
        pictureBox1->Visible = false;
    }
    

    Auch das hat nicht geklappt, obwohl ich die PictureBox vorher in meiner Form sehe, also müsste Visible ja eigentlich gleich true sein.
    Auch wenn ich pictureBox1->Visible vor der Abfrage geändert habe, hat es nicht geklappt.

    pictureBox1->Visible = true;
    if(pictureBox1->Visible == true){
        pictureBox1->Visible = false;
    }
    

    Weiß irgendjemand woran das liegt?

    Lukas



  • Was sagt der debugger dazu?

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    {
    	pictureBox1->Visible = !pictureBox1->Visible;
    }
    

    Pack zu Testzwecken ein Button auf Deine Form nebst Click-Event und packe den Code mal von mir rein.



  • Erstmal vielen Dank für die Antwort.

    Wenn ich die PictureBox z.B. durch einen Button verschwinden lasse, klappt es problemlos (mit beiden Methoden und auch mit einer if-Abfrage).
    Also liegt der Fehler wahrscheinlich woanders....
    Ich poste hier mal ein bisschen mehr Code.

    Also ich programmiere ein Hoelzchenspiel, bei dem man der Spieler und der Computer abwechselnd ein Hölzchen nehmen(http://www.lotharmelching.de/html/mathematisches/knobeleien_hoelzchen.htm). Allerdings soll man in meiner Variante einfach auf die Hölzchen(dargestellt durch eine PictureBox) klicken.

    private: System::Void pictureBox1_Click(System::Object^  sender, System::EventArgs^  e) {
    
    			 pictureBox1->Visible = false;
    			 ziehen(1);
    			 this->aus_Hoelzchen->Text =szAusHoelzchen;
    			 this->aus_Spieler->Text = szAusSpielerAmZug;
    			 this->aus_PcZug->Text = szPcZug;
    		 }
    

    In der Funktion "ziehen" wird dann eine Methode des Objektes Game aufgerufen

    void ziehen(int iArt)
    	{
    		static SpielerVsComputer Game (SystemStringToString(szName1Weiterleiter), SystemStringToString(szName2Weiterleiter), iPcStaerke); // Game ist Objekt von Klasse SpielVsComputer
    		if (iArt==1)
    			{
    				Game.spielerZug();
    			}
    

    Nachdem man entweder 3 PictureBoxen angeklickt oder den Zug vorher beendet hat, wird dann eine Methode aufgerufen, die errechnet, wie viele Hölzchen der Computer nimmt. Diese Zahl soll dann an eine Funktion (siehe erster Beitrag) übergeben werden, da ja auch die Hölzchen die der Computer nimmt verschwinden sollen.
    Eine PictureBox über einen Button oder über die PictureBox selbst verschwinden zu lassen ist kein Problem. In anderen Funktionen klappt das auch, wie zum Beispiel in der dieser, wo 15-25 (zufallsgesteuert) Hölzchen angezeigt werden.

    void showPicBox(){
    				 pictureBox16->Visible = false;
    				 pictureBox17->Visible = false;
    				 pictureBox18->Visible = false;
    				 pictureBox19->Visible = false;
    				 pictureBox20->Visible = false;
    				 pictureBox21->Visible = false;
    				 pictureBox22->Visible = false;
    				 pictureBox23->Visible = false;
    				 pictureBox24->Visible = false;
    				 pictureBox25->Visible = false;
    
    				 pictureBox1->Visible = true;
    				 pictureBox2->Visible = true;
    				 pictureBox3->Visible = true;
    				 pictureBox4->Visible = true;
    				 pictureBox5->Visible = true;
    				 pictureBox6->Visible = true;
    				 pictureBox7->Visible = true;
    				 pictureBox8->Visible = true;
    				 pictureBox9->Visible = true;
    				 pictureBox10->Visible = true;
    				 pictureBox11->Visible = true;
    				 pictureBox12->Visible = true;
    				 pictureBox13->Visible = true;
    				 pictureBox14->Visible = true;
    				 pictureBox15->Visible = true;
    
    				 if(iAnzahlPicBox == 16){
    					pictureBox16->Visible = true;
    				 }
    				 else if(iAnzahlPicBox == 17){
    					pictureBox16->Visible = true;
    					pictureBox17->Visible = true;
    				 }
    				 else if(iAnzahlPicBox == 18){
    					pictureBox16->Visible = true;
    					pictureBox17->Visible = true;
    					pictureBox18->Visible = true;
    				 }
    //und so weiter
    			}
    

    Kann es sein das die Funktion keinen Zugriff auf die PictureBoxen hat, weil sie nicht durch einen Button (wie showPicBox()), sondern durch eine Methode von Game aufgerufen wird?

    void SpielerVsComputer::computerZug(){
    //... errechne von der Anzahl der Hölzchen die der PC nehmen soll
    hoelzchenspiel::spieler_computer z;
    z.takePcZug(iPcNimm);
    

    Ich hoffe das ihr mir helfen könnt und bedanke mich schon mal im Voraus für eure Antworten. Wenn ihr noch Fragen habt fragt einfach.

    Lukas



  • Hallo Lukas,

    daß die PictureBoxen nicht sofort ausgeblendet werden, liegt an dem WinForms-Messagesystem, d.h. erst wenn die Methode wieder verlassen wird, wird die Windows-Messagequeue abgearbeitet und die Form wieder aktualisiert.
    Die richtige Methode ist die Verwendung eines Timers.

    Aus deinem Code ersehe ich, daß du noch ein Anfänger bist. Daher möchte ich dir noch ein paar weitere Tipps geben:
    - C++/CLI ist als Anfänger nicht zu empfehlen, nimm besser C#
    - statt der einzelnen PictureBox-Variablen solltest du besser ein Array (bzw. eine List<> benutzen) - so daß du dann mittels Schleifen deinen Code drastisch reduzieren kannst

    Und zu deinem eigentlichen Problem noch folgender Link: [FAQ] Warum blockiert mein GUI?
    Und für das Vereinfachen mittels Arrays: [FAQ] Variablennamen zur Laufzeit zusammensetzen
    (selbst wenn du bei C++/CLI bleiben solltest, gelten die oberen beiden Artikel für alle .NET_Sprachen)



  • Hallo Th69;
    erstmal vielen Dank für die Antwort, aber leider verstehe ich das noch nicht so ganz. Gib es keine Möglichkeit das Formular "manuell" zu upadaten?



  • Verwende einen Timer...
    Wenn Du es in einer Schleife machst, dann geht das eh zu schnell...


Anmelden zum Antworten