Autor Beitrag
Hagato
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mi 22.01.14 21:03 
Hallo!
c# Visual Studio

Ich habe einer ImageList Bilder hinzugefügt. Danach will ich - nur 1 bestimmtes - löschen sobald es 1 mal vorkommt. Es gibt mehrere Pictureboxen und sobald "DAS BILD" das erste mal erscheint soll es in den anderen Pictureboxen nicht mehr erscheinen können.
ausblenden C#-Quelltext
1:
2:
3:
pbx_teil2.Image = hindernisse[m_hindernisse.Next(0, hindernisse.Count)];
if (pbx_teil2.Image == pbx_kanister.Image)
    hindernisse.RemoveAt(2);

Funktioniert nicht.

Ich bin schon lange am tüfteln jedoch komm ich nicht drauf wie ich das schreiben soll/muss.

Bitte um rasche Antwort, vielen Dank.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 22.01.14 22:02 
ImageList hat keine RemoveAt Methode. Die Image Collection einer Image List schon und die Methode funktioniert.
Beschreibe bitte genauer was "Funktioniert nicht" bedeutet. Also was du erwartet hast das passiert und was stattdessen passiert. Implodieren wird dein Rechner ja vermutlich nicht.
Warum übrigens RemoveAt(2)? Wo hast du die 2 her?
Hagato Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mi 22.01.14 22:33 
RemoveAt(2) -> Die 2 steht für mein 3. Bild das ich der Liste hinzugefügt habe.
Bild 1 -> 0
Bild 2 -> 1
Bild 3 -> 2

ausblenden C#-Quelltext
1:
2:
3:
pbx_teil2.Image = hindernisse[m_hindernisse.Next(0, hindernisse.Count)]; 
if (pbx_teil2.Image == pbx_kanister.Image) 
   hindernisse.RemoveAt(2);

Ich habe 11 Pictureboxen, den Code oberhalb habe ich für alle ähnlich. Sobald in einer Picturebox der "Kanister" enthalten ist sollte mein 3. Bild aus der ImageListe entfernt werden.

pbx_kanister ist dabei mein Vergleichs Image. Also wenn eines der Pictureboxen das gleiche Image enthält sollte es von der Liste entfernt werden sodass der "Kanister" nicht nocheinmal vorkommt.
D.H. von 11 Pictureboxen darf der "Kanister" maximal 1 mal vorkommen.
Er kommt jedoch "nur" random, meine if-Abfrage zeigt keine Wirkung.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 22.01.14 22:50 
Funktioniert jetzt der Vergleich nicht (die if Bedingung) oder der RemoveAt nicht?

Wenns der Vergleich ist vermute ich mal das man Images so nicht einfach vergleichen kann. Der wird nicht irgendwie die Pixel durchgegangen ob die gleich sind sondern einfach die Referenzen verglichen. Wenn das also 2 verschiedene Instanzen der Image Klasse hast werden die immer ungleich sein auch wenn da drin das gleiche Bild ist.

Zitat:
pbx_kanister ist dabei mein Vergleichs Image. Also wenn eines der Pictureboxen das gleiche Image enthält sollte es von der Liste entfernt werden sodass der "Kanister" nicht nocheinmal vorkommt.


Klingt wirr. Für deinen Code heißt das der Kanister immer das 3.te Bild ist oder eben nicht in der Liste ist. Dann brauchst du die Bilder doch nie vergleichen Sobald du mit m_hindernisse eine 2 würfelst kannst du das Bild entfernen wenn es in der LIste ist. Und ob es in der Liste ist oder nicht kannst du dir auch in einem Bool unabhängig von der Liste selbst merken.
Hagato Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mi 22.01.14 23:02 
Naja wenn der Random Generator 2 gewürfelt hat sollte 2 removed werden.
Falls 1 rauskommt, passiert nichts, dasselbe bei 0.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
Random m_hindernisse = new Random();

hindernisse.Add(Image.FromFile("Bilder\\saturn.png"));
hindernisse.Add(Image.FromFile("Bilder\\asteroid.png"));
hindernisse.Add(Image.FromFile("Bilder\\kanister.png"));


Das ist mein Randomgenerator. Könnte es theoretisch sein dass ich mit jeder Zeile: pbx_teil1.Image = hindernisse[m_hindernisse.Next(0, hindernisse.Count)];
Den Generator neu "mache", sprich mein Kanister besitzt nicht den Index 2, sondern jedes mal aufs neue 0, 1, oder 2?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 22.01.14 23:06 
Nein.

Wie hast du pbx_kanister.Image zugewiesen? Auch aus der hindernisse Liste?
Hagato Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mi 22.01.14 23:07 
Nein, direkt im Form hab ich eine Picturebox wo das Image bereits geladen ist.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 22.01.14 23:18 
Ok dann ist zumindest klar das der Vergleich im if nie true sein kann. Es sind 2 verschiedene Image Instanzen auch wenn es das gleiche Bild ist.

Ich würde, wie gesagt vorschlagen, nicht zu vergleichen sondern in einem Boolean mir merken ob das Bild in der Liste enthalten ist oder nicht.
Ungefähr so

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
Boolean containsKanister = true;

...

int Index = m_hindernisse.Next(0, hindernisse.Count);
if ((index == 2) && (containsKanister))
{
   hindernisse.RemoveAt(index);
   containsKanister = false;
}
Hagato Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Mi 22.01.14 23:32 
Ok klingt eigentlich gut, aber..
Ich habe noch einige andere Operationen damit geschrieben wo ich mein vergleichsImage mit PictureBoxen vergleiche. Dort funktioniert zwar auch noch nichts aber der Code ist da.. ^^

Habe versucht mein VergleichsImage so: pbx_kanister.Image = Image.FromFile("Bilder\\kanister.png"); zu beladen, leider ohne Erfolg.

Ansätze oder Ideen wie dies funktionieren könnte?

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 22.01.14 23:54 
ausblenden C#-Quelltext
1:
pbx_kanister.Image = hindernisse[2];					


Und nebenbei, da gerade bei mir ein Groschen fällt, du meintest nicht eine ImageList wie in deinem ersten Beitrag sondern eine List<Image>, oder? Es gibt eine spezielle ImageList Klasse (die dir jetzt gerade aber nicht hilft).
Hagato Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 23.01.14 00:03 
Hm das mit dem vergleichen funktioniert immer noch nicht, aber mir ist auch eine Alternative gekommen. Gibt ja .Tag (wo ich den Namen, der Bilder verwenden kann oder?).
Könnte das funktionieren wenn ich den Namen der Bilder überprüfe mit .Tag? Bzw wie?

Ja List<Image> hindernisse = new List<Image>(); hab ich.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 23.01.14 00:12 
Verstehe gerade nicht was du wie vorhast. Aber ein string kann man sauber vergleichen. Und den im Tag von PictureBox oder Image ablegen geht natürlich auch.
Hagato Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 23.01.14 00:14 
Anstatt die Images der PictureBoxen zu vergleichen, will ich die Pictureboxen mit Tag vergleichen.
Hagato Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 23.01.14 19:59 
Habs jetzt anders gelöst, und nach einer Nachtschicht und einigen Stunden funktioniert endlich alles! :)