none
Fehler in Quelltext? - Programm macht was es nicht soll RRS feed

  • Frage

  • Hallo,

    Ich will, für ein Programm, dass ein Panel des Fensters die Farbe ändert. und zwar soll er alle Panels im Fenster durchgehen, diejenigen bei denen Enabled == true zutrifft, soll er in ein Array ablegen, und dann per zufall eines auswählen, und dieses anders färben. Jetzt ist das Problem, dass er, trotz einer If - Anweisung, immer wieder Panels doppelt auswählt, also sie in das Array tut, obwohl Enabled == true nicht zutrifft.

    Hier mal der Quelltext. Ich habs mit Debuggen versucht, den fehler aber nicht gefunden. Vielleicht sieht ihn ja einer von euch.

     this->feldzahl = 0;  
        Panel ^pan = gcnew Panel();     
         for each(Control ^c in this->Controls)
         {
          pan = dynamic_cast<Panel^> (c);
          if (pan != nullptr)
          {
          
           if(pan->Enabled == true)
          {          
           felder[feldzahl] = pan;
           feldzahl += 1;      
          }     
          }
         }  
         for(int i = 0; i < felder->Length; i++)
         {
          if(felder[i] == nullptr)
           this->textBox1->Text += "nullptr";
          else
          this->textBox1->Text += felder[i]->Name;
         }
         Random ^feld = gcnew Random();
         int zahl;
         Panel ^panel = gcnew Panel();
         zahl = feld->Next(this->felder->Length);
         while(felder[zahl] == nullptr)
         {
          zahl = feld->Next(this->felder->Length);
         }    
         panel = felder[zahl];
         panel->Enabled = false;
         if(panel->BackColor == Color::Red)
          panel->BackColor = Color::Yellow;
         else
         panel->BackColor = System::Drawing::Color::Red;
         // this->textBox2->Text += panel->Enabled.ToString();
        
        // this->textBox2->Text += panel->Enabled.ToString();
         if(panel1->Enabled == false && panel2->Enabled == false && panel3->Enabled == false && panel4->Enabled == false && panel4->Enabled == false && panel5->Enabled == false)
         {MessageBox::Show("Alle Felder sind Belegt");}


    Chrissoftan Freeware - Live is Binary
    Sonntag, 28. März 2010 10:07

Antworten

  • Hallo,

    das Problem dürfte an Deinem Jonglieren mit dem "felder" Array liegen,
    denn mal nimmst Du "felder->length" und mal "feldzahl".
    Und alte Inhalte können so schon mal wieder zum Vorschein kommen ;-)

    Das ganze Problem vermeidest Du am einfachsten, in dem Du jeweils
    eine frische Auflistung verwendest. Alternative Variante meinerseits:

        void SwapPanelColors()
        {
            Panel^ panel = nullptr;
            List<Panel^> panels = gcnew List<Panel^>();
    
            for each(Control ^c in this->Controls)
            {
                panel = dynamic_cast<Panel^> (c);
                if (panel != nullptr && panel->Enabled)
                {
                    panels.Add(panel);
                }
            }  
    
            if (panels.Count > 0)
            {
                Random^ r = gcnew Random();
                int panelIndex = r->Next(panels.Count);
    
                panel = panels[panelIndex];
                panel->Enabled = false;
                panel->BackColor = (panel->BackColor == Color::Red)
                    ? Color::Yellow
                    : Color::Red;
            }
            else
            {
                MessageBox::Show("Alle Felder sind Belegt");
            }
        }
    
    Gruß Elmar

     

    • Als Antwort markiert Chrissoftan Dienstag, 30. März 2010 18:16
    Sonntag, 28. März 2010 13:55
    Beantworter