Autor Beitrag
Susilein
Hält's aus hier
Beiträge: 10

xp
c#
BeitragVerfasst: Fr 31.12.10 13:26 
Hi,


ich habe 4 Buttons in ein Array gepackt. Ich möchte nun bei diesen 4 Buttons
die Images vergleichen: Wenn ein Bild gleich mit dem 2.ten Button soll dieser
Enabled = false auswerten. Hier mein Code dazu. Meiner Meinung nach habe ich die Schleife richtig geschrieben oder? lg und EINEN GUTEN RUTSCH ins neue Jahr

susi

ausblenden volle Höhe 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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
public void button1_Click(object sender, EventArgs e)
        {
            Button[] buttonar = new Button[4] { button1, button2, button3, button4 };
           
            for (int i = 0; i <  buttonar.Length;i++)
            {
                if (buttonar[0].Image == buttonar[i].Image)
                {
                   // buttonar[0].Enabled  = false;
                    buttonar[i].Enabled = false;

                   
                }
                else if (buttonar[1].Image == buttonar[i].Image)
                {
                    //buttonar[1].Enabled = false;
                    buttonar[i].Enabled = false;

                    
                }
               else if (buttonar[2].Image == buttonar[i].Image)
                {
                   // buttonar[2].Enabled = false;
                   // buttonar[i].Enabled = false;

                  
                }
                else if (buttonar[i].Image == buttonar[3].Image)
                {
                    //buttonar[3].Enabled = false;
                    buttonar[i].Enabled = false;

                    
                }
                      }


Moderiert von user profile iconKha: C#-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 31.12.10 13:49 
Du vergleichst hier die Image-Objekte, genauer gesagt deren Adressen. Du möchtest aber vergleichen was die Images für einen Inhalt haben. Das geht so nicht (sinnvoll).

Es ist sinnvoll die Datenhaltung (also was wo drin ist) von der Oberfläche zu trennen. Heißt: Benutze dafür separate Variablen, in denen du direkt speicherst was du wo drin hast. ;-)

Dafür kannst du z.B. Integerwerte nehmen oder auch Strings um die Speicherpfade zu speichern, je nachdem was du da genau machst.
Susilein Threadstarter
Hält's aus hier
Beiträge: 10

xp
c#
BeitragVerfasst: Fr 31.12.10 16:44 
Ja das hatte ich auch schon versucht. Ich bin dabei ein Memorie-Spiel zu programmieren.
Es gibt also 9 verschiedene Bilder in 18 Picturebox-Objekten.
D.H. 9 verschiedene Bilder die jeweils 2 maö vorkommen. Hatte das ganze auch schon mit separaten Variablen gemacht. Meine Frage ist nur wieso das mit meiner Schleife nicht geht?

p
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
rivate void Form1_Load(object sender, EventArgs e)
        {
            Bitmap bit1 = new Bitmap("c:\\test1.jpg");
            Bitmap bit2 = new Bitmap("c:\\test2.jpg");
            Bitmap bit3 = new Bitmap("c:\\test3.jpg");
            Bitmap bit4 = new Bitmap("c:\\test4.jpg");
            
            
            button1.Image = bit1;
            button2.Image = bit2;
            button3.Image = bit3;
            button4.Image = bit4;
            
            
           
        }

Alle Bilder sind unterschiedlich, dennoch gibt die Schleife für alle buttons :enabled = false zurück! Wieso? Alle Pfade sind doch unterschiedlich?

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
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: Fr 31.12.10 17:32 
Hallo Susilein,

deine Schleife ergibt auch keinen wirklichen Sinn.
Du vergleichst jeden Button mit jedem (auch mit sich selbst!!!) und wenn die beiden Bilder dann übereinstimmen, dann setzt du Enabled = false.

Was genau soll die Schleife denn vergleichen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 31.12.10 17:32 
user profile iconSusilein hat folgendes geschrieben Zum zitierten Posting springen:
Ich bin dabei ein Memorie-Spiel zu programmieren.
Sowas dachte ich mir schon. ;-)

user profile iconSusilein hat folgendes geschrieben Zum zitierten Posting springen:
Alle Bilder sind unterschiedlich, dennoch gibt die Schleife für alle buttons :enabled = false zurück! Wieso? Alle Pfade sind doch unterschiedlich?
Es ist ein Unterschied, ob du ein Bildobjekt hast, das aus einem bestimmten Pfad geladen wurde oder ob du die Pfade selbst hast und vergleichst.

Du solltest stattdessen z.B. ein Integerarray oder eine Liste verwenden, in die du z.B. einfach die Indizes der Bilder schreibst. Dann kannst du (bezogen auf Memory) einfach in dieser Liste nachschauen, ob die beiden angeklickten Bilder das selbe Bild enthalten. Und mehr ist ja auch nicht notwendig, oder?
Wofür du die Schleife brauchst, verstehe ich grad nicht so ganz. :gruebel:
Susilein Threadstarter
Hält's aus hier
Beiträge: 10

xp
c#
BeitragVerfasst: So 02.01.11 19:00 
Hi und erstmal danke für die Antwort und ein Gesundes Neues Jahr :-)

Also mit der Schleife for (int i = 0; i < buttonar.Length;i++)

lese ich das array zeilenweise aus. für 4 Buttons müsste ich sonst etliche if.anweisungen schreiben. Bei einem Memorie-SPiel von z.b. 18 Feldern wäre der COde undenkbar lang. Deshalb die Schleife. Das komische an der Sache ist:

Verlgeiche ich die Buttons ohne Schleife miteinander z.b. So:
ausblenden C#-Quelltext
1:
2:
3:
4:
if (buttonar[0].Image == buttonar[1].Image)
                {
                    buttonar[0].Enabled  = false;
                    buttonar[1].Enabled = false;


bekomme ich das richtige Ergebnis. Mit dem Integerarray das hatte ich schon verstanden das funktioniert auch. Ich benötige jedoch diese Schleife um nicht zuviel Code schreiben zu müssen. Oder es gibt noch eine andere Methode Buttons miteinander zu vergleichen?

lg

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
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: So 02.01.11 20:16 
Hallo und ebenfalls Frohes Neues Jahr,

Du willst also vergleichen, ob zwei Buttons das selbe Bild darstellen und dann beide Buttons 'disablen'?

Wie ich schon schrieb ist dein Fehler bisher, daß du auch die Buttons mit sich selbst vergleichst.

Einfacher und kürzer geht das mit zwei Schleifen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
for (int i = 0; i <  buttonar.Length; i++)
    for (int j = 0; j <  buttonar.Length; j++)
    {
        if (i != j) // wichtig: nur unterschiedliche Buttons vergleichen (nicht mit sich selbst)!!!
            if (buttonar[i].Image == buttonar[j].Image)
            {
                buttonar[i].Enabled = false;
                buttonar[j].Enabled = false;
            }
    }
Susilein Threadstarter
Hält's aus hier
Beiträge: 10

xp
c#
BeitragVerfasst: Mo 17.01.11 21:01 
Hey und ein Gesundes Neues Jahr allerseits. ICh danke für die Antworten die letzte Schleife funtktioniert :-) viel Grüsse
Necaremus
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: Do 20.01.11 12:38 
ich hätte ne kleine OT Frage dazu:
was genau vergleicht der, wenn man zwei bilder vergleicht?
den Pfad? den hash? das bild? O_O

_________________
[Master of dangerous sciolism].
"Never assume malice when stupidity will suffice." Hanlon's Razor
-= Some people see the glass half full. Others see it half empty. I see a glass that's twice as big as it needs to be. =-
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 20.01.11 13:34 
Naja, offenbar speichert C# dann wirklich das selbe Bildobjekt und kopiert (anders als Delphi) nicht den Inhalt.

Da C# bzw. .NET einen Garbage Collector benutzt, ist das auch kein Problem von der Freigabe her.