Autor Beitrag
karozocker
Hält's aus hier
Beiträge: 14

Win 3.0 - Win7 aktuell Vista
Basic (VS 2003) C# (VS 2008)
BeitragVerfasst: Do 08.09.11 10:24 
Hi Community!
Ich hab ein kleines Problem, bei dem ich nicht von "object.sender", auf das jeweilige object zurück schließen konnte.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
private void f_Click(object sender, EventArgs e)
        {
            for (int a = 1; a <= 4; a++)
            {
                for (int b = 1; b <= 6; b++)
                {
                    if (sender.Equals(f[a].f[b]))
                    {
                        farbe[a] = f[a].f[b].BackColor;
                        this.BackColor = farbe[a];
                    }
                }
            }
        }


Bei diesem Auszug geht es darum, wie man bei einem kleinen Mastermind-Spiel die Farbe wählt..

Danke im voraus für die Hilfe!

LG
karozocker
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 08.09.11 10:59 
Hallo,

mittels des C#-Schlüsselworts 'as' kannst du den Typ entsprechend casten:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
Control control = sender as Control;
if (control != null)
{
  control.BackColor = ...;
}

(ersetze 'Control' gegebenfalls durch das konkrete Steuerelement, z.B. 'Button', falls du spezifische Eigenschaften ansprechen möchtest)

P.S. Array-Indizes sind null-basiert:
ausblenden C#-Quelltext
1:
for (int a = 0; a < 4; a++)					


Und der Ausdruck 'f[a].f[b]' kommt mir auch eigenartig vor...
karozocker Threadstarter
Hält's aus hier
Beiträge: 14

Win 3.0 - Win7 aktuell Vista
Basic (VS 2003) C# (VS 2008)
BeitragVerfasst: Do 08.09.11 11:31 
Danke für die schnelle Antwort!

das mit dem array im array kommt daher, dass f eine von mir verwendete Klasse ist (abgeänderte Label Klasse), in der wiederum ein array von Labes besteht.

Tut mir Leid, meine Fragestellung war nicht präziese, wie mir inzwischen aufgefallen ist.
Damit meine ich, dass ich den Teil, in dem ich die void implementiert habe nicht aufgeführt habe.
In diesem Ausschnitt habe ich versucht, eine allgemeine Funktion zu schaffen, die für alle Labels gilt, aber durch die for-Schleife wird diese nur für die letzten Werte übernommen, da die vorherigen überschrieben werden ( blöder Fehler meinerseits).

Ist es möglich, trotzdem eine allgemeingültige void für die Lasbels_Click zu schreiben, ohne für jedes eine einzelne funktion zu beanspruchen?

Hier der Ausschnitt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
 for (int a = 1; a <= 4; a++)
            {
                for (int b = 1; b <= 6; b++)
                {
                    f[a] = new farben();
                    f[a].f[b].BringToFront();
                    f[a].nr = a;
                    this.Controls.Add(f[a].f[b]);
                    this.f[a].f[b].Click += new System.EventHandler(this.f_Click);

                    if (b <= 3) f[a].f[b].Location = new System.Drawing.Point(-10 + 29 *a, 370+13*b);
                    else f[a].f[b].Location = new System.Drawing.Point(3 + 29 * a, 331 + 13 * b);
                    
                }
            }


und die Klasse farben:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
class farben : Control
    {
        public Label[] f = new Label[7];
        public int nr;

        public farben()
        {
            nr = new int();

            for (int i = 1; i <= 6; i++)
            {
                f[i] = new Label();
                f[i].BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
                f[i].Size = new System.Drawing.Size(1010);
            }
            f[1].BackColor = System.Drawing.Color.Red;
            f[2].BackColor = System.Drawing.Color.RoyalBlue;
            f[3].BackColor = System.Drawing.Color.Green;
            f[4].BackColor = System.Drawing.Color.Yellow;
            f[5].BackColor = System.Drawing.Color.Violet;
            f[6].BackColor = System.Drawing.Color.Brown;

        }
    }
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 08.09.11 12:11 
Hallo Lukas,

ich habe dein Problem schon richtig verstanden ;-)

Meine Lösung ist genau die richtige, d.h. die ganze Doppel-Schleife kann entfallen. Mittels 'sender' erhältst du das zugehörige Control (bzw. in deinem Fall: Label).

Außerdem ist deine Initialisierungschleife noch falsch: 'f[a] = ...' muß außerhalb der inneren Schleife (bisher erzeugst du anstatt 4 exakt 24 Objekte).

P.S. Bitte schreib nie wieder "in dem ich die void implementiert habe". Schreib dafür einfach "Methode" ('void' ist ja einfach der Rückgabetyp der Methode - bzw. gibt an, daß diese Methode keinen Rückgabetyp hat. Bei 'int' würdest du es ja auch nicht so schreiben, oder?)
karozocker Threadstarter
Hält's aus hier
Beiträge: 14

Win 3.0 - Win7 aktuell Vista
Basic (VS 2003) C# (VS 2008)
BeitragVerfasst: Do 08.09.11 12:40 
sry für meine naive Formulierung, ist ne dumme Angewohnheit ;)

Naja aber ich habe es genau so gewollt: 4*6 Labels, um die Farben auszuwählen.
im Anhang siehst du den bescheidenden Anfang, den ich bisher geschafft habe, bevor ich auf dieses Problem gestoßen bin.

Wenn die Funktionen mal passen, will ich das ganze auch grafisch schöner gestalten, aber jetzt muss es einfach nur laufen!

P.S.: wunder dich nicht, bisher steckt noch kein wirklicher Sinn dahinter

LG
Einloggen, um Attachments anzusehen!