Autor Beitrag
Yankyy02
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: So 24.07.11 20:19 
Ich werfe mal ein freundliches Hallo in die Runde und bedanke mich schonmal für eure Antworten!

Habe folgendes Problem ---->

Ich habe mir in einer Methode ein Bitmap-Array erstellt und dieses mit Bild-Ressourcen gefüllt!
Die Methode liefert ein zufälliges Bitmap durch ein Random-Objekt zurück!
(Insgesamt sind 45 Bitmaps enthalten)

Im Hauptformular habe ich 6 pictureBox elemente die durch die Methode gefüllt werden!

Mein Problem ist das ich nicht möchte das ein Bild doppelt vorkommt!

Jedoch egal wie ich die pictureBox Elemente miteinander vergleich es kommt immer wieder mal vor das
ein Bild doppelt ist!!

Hier ein Code Ausschnitt:
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:
25:
        private void timer2_Tick(object sender, EventArgs e)
        {
            
            do
            {
                pbZahl2.Image = LottoKugeln.KugelGenerieren();
            }
            while (pbZahl1.Image.Equals(pbZahl2.Image));
         
            toolStripProgressBar1.Value += 20;
            timer2.Stop();
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            do
            {
                pbZahl3.Image = LottoKugeln.KugelGenerieren();
            }
            while (pbZahl3.Image.Equals(pbZahl2.Image) && (pbZahl3.Image.Equals(pbZahl1.Image)));
            
            toolStripProgressBar1.Value += 20;
            timer3.Stop();

        }

Vielen Dank schonmal für eure Antworten! Ich hoffe jemand kann mir einen Tipp geben was ich falsch mache
bzw. übersehe!!

MfG

Yankyy02

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Raorkon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 86
Erhaltene Danke: 1



BeitragVerfasst: So 24.07.11 21:16 
Hallo erstmal,

wenn du einen Code hier darstellen willst dann nutz die option "Entwurf" dafür. Damit läßt sich der Code leichter lesen.

Zu deinen Problem:

ich würde die Images bzw. die Namen in einer Klassenvariablen speichern und beim füllen deiner Pictureboxen in dieser Klassenvar die Images/Namen prüfen bzw. speichern.

Für diesen Beitrag haben gedankt: Yankyy02
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4800
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 25.07.11 08:56 
Hallo Yankyy02,

es ist ein "logischer" Fehler in deinem Code: anstatt && mußt du || zum Vergleichen benutzen.

Und viel besser wäre es jedoch, wenn du die Lottozahlen in einem int-Array ablegen würdest (dann ist der Vergleich auch einfacher) und du dann einfach nur mittels des Index auf das Image-Array zugreifst, um die Lottozahlenbilder anzuzeigen (Stichwort: Trennung von GUI und Logik).
Und 6 Timer-Instanzen benötigst du eigentlich auch nicht. Solange du keine Animation anzeigen willst, kannst du sogar auf Timer verzichten und die 6 Lottozahlen einmalig erzeugen.

Für diesen Beitrag haben gedankt: Yankyy02
Yankyy02 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Mo 25.07.11 10:07 
Servus Th69!

Danke für deine Antwort! Die Timer benutze ich daß ich die Kugeln in der Form in gewissen
Abständen anzeige! Aber ist es nicht so das bei der oder (||) Verknüpfung nur ein ausdruck
wahr sein muss damit die Do-Schleife verlassen wird?!

Komisch ist daß immer nur die 4. Zahl die gleiche ist wie die 1. alle anderen sind immer unterschiedlich!

Wie meinst du das mit den Index vergleichen?? Ich habe ein Bitmap Array folgendermasen erstellt!

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Bitmap[] Kugeln = new Bitmap[45];

Kugeln[0] = WinFormsApplication.Properties.Ressources.K1.png;
Kugeln[1] = WinFormsApplication.Properties.Ressources.K2.png;
Kugeln[2] = WinFormsApplication.Properties.Ressources.K3.png;
Kugeln[3] = WinFormsApplication.Properties.Ressources.K4.png;
..........
Kugeln[44] = WinFormsApplication.Properties.Ressources.K45.png;

dazu sollte ich jetzt noch zusätzlich ein int Array anlegen oder wie??

Könntest du mir dann sagen wie ich den Vergleich machen soll?
Beziehungsweise einen Tipp (Anhaltspunkt)?!

Vielen Dank für deine Mühe!!

MfG

Yankyy02

Moderiert von user profile iconKha: C#-Tags hinzugefügt
Dr. Hallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: Mo 25.07.11 13:22 
Hi,Bitmap hat eine Tag Eigenschaft wo du dir merken kannst, welche Kugel schon generiert wurde. Also immer wenn Du eine neue Kugel generierts setzt Du Tag z.B. auf Kugel[x].Tag = 1. Bevor Du eine neue Kugel generierts, prüfst Du Kugel[x].Tag == 1 ?.Vor der nächsten Ziehung must Du alle Tag Eigenschaften wieder zurrücksetzen. vg.

Für diesen Beitrag haben gedankt: Yankyy02
Yankyy02 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Mo 25.07.11 13:30 
Servus Dr. Hallo!
Vielen Dank für den Tipp! Werd ich heute nach der Arbeit testen und
dann berichten obs gefunzt hatt!!

Danke nochmal!!

MfG

Yankyy02
Yankyy02 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Mo 25.07.11 18:05 
Hy @ all nochmals!

Ich raf's einfach nicht! Habs mit der || Verknüpfung probiert ohne Erfolg!
Und daß mit der Tag eigenschaft versteh ich nicht wie ich das im Code einbauen
sollte!!

Die Timer deshalb weil die Kugeln in gewissen Abständen erscheinen sollen!!

Das Bitmap Array wird in einer Methode erstellt genau so wie ein Random Objekt!
Wie gesagt die Methode liefert ein Bitmap zurück so muss ich die Methode im
Tick ereigniss einfach nur aufrufen und der Image Eigenschaft der pictureBox
zuweisen!

Warum kann ich nicht einfach die schleife verwenden um mir mit der Methode solange
eine neue Kugel generieren lassen bis die Image(Kugel.png) nicht mehr die selbe ist
wie in einer anderen pictureBox?

Hier die Methode!

public static Bitmap KugelGenerieren()
{
Random r = new Random();
Bitmap[] Kugeln = new Bitmap[45];
Kugeln[0] = WindowsFormsApplication1.Properties.Resources.K1;
Kugeln[1] = WindowsFormsApplication1.Properties.Resources.K2;
Kugeln[2] = WindowsFormsApplication1.Properties.Resources.K3;
Kugeln[3] = WindowsFormsApplication1.Properties.Resources.K4;
Kugeln[4] = WindowsFormsApplication1.Properties.Resources.K5;
Kugeln[5] = WindowsFormsApplication1.Properties.Resources.K6;
Kugeln[6] = WindowsFormsApplication1.Properties.Resources.K7;
Kugeln[7] = WindowsFormsApplication1.Properties.Resources.K8;
Kugeln[8] = WindowsFormsApplication1.Properties.Resources.K9;
...............
Kugeln[40] = WindowsFormsApplication1.Properties.Resources.K41;
Kugeln[41] = WindowsFormsApplication1.Properties.Resources.K42;
Kugeln[42] = WindowsFormsApplication1.Properties.Resources.K43;
Kugeln[43] = WindowsFormsApplication1.Properties.Resources.K44;
Kugeln[44] = WindowsFormsApplication1.Properties.Resources.K45;

return Kugeln[r.Next(0, 45)];
}

Um dann so mit den Timern jede pictureBox zu füllen

private void timer3_Tick(object sender, EventArgs e)
{
do
{
pbZahl3.Image = LottoKugeln.KugelGenerieren();

}
while (pbZahl3.Image.Equals(pbZahl2.Image) || (pbZahl3.Image.Equals(pbZahl1.Image)));

toolStripProgressBar1.Value += 20;
timer3.Stop();

}
Jemand noch einen Tipp für mich?!

Vielen Dank!
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Mo 25.07.11 21:00 
Hi,

naja, das mit dem eqals klappt so nicht, da Du jedes mal, wenn Du eine Resource abfragst, ein NEUES Objekt zurückbekommst. Also wird dieses Objekt (zumindest bei einem Bitmap-Objekt) nie equals sein.
Und in Deiner Methode "KugelGenerieren" rufst Du halt immer die Resourcen neu ab...

Also entweder erzeugst Du das Bitmap[] nur einmal und fragst durch den Rand-Wert das Bitmap ab (-> wenn Index gleich, dann bekommst Du auch das gleiche Objekt), Du vergleichst die Rohdaten der Bitmaps miteinander, oder Du speicherst Dir, wie schon user profile iconDr. Hallo gesagt hat, den Namen des Bitmaps einfach als Tag des Bitmaps (was wahrscheinlich das beste und schnellste wäre).
Das würde dann so aussehen (habe sie mal etwas gekürzt)
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public static Bitmap KugelGenerieren()
{
  Random r = new Random();
  string randBitmapName = string.Format("K{0}", r.Next(145));
  Bitmap randBitmap = Properties.Resources.ResourceManager.GetObject(randBitmapName) as Bitmap;
  if (randBitmap == null)
    throw new InvalidOperationException("Requested Bitmap not found in Resources");
  randBitmap.Tag = randBitmapName;
  return randBitmap;
}
Und der timer3_Tick-Handler dann irgendwie so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
private void timer3_Tick(object sender, EventArgs e) 

  Bitmap randomBitmap = null;
  do
  {
    randomBitmap = LottoKugeln.KugelGenerieren();
  }
  while ((string)randomBitmap.Tag == (string)pbZahl1.Image.Tag || (string)randomBitmap.Tag == (string)pbZahl2.Image.Tag);
  pbZahl3.Image = randomBitmap;
  timer3.Stop(); 
}
Das Random-Objekt sollte eigentlich auch nur 1 Mal erzeugt wreden.
LG,

Für diesen Beitrag haben gedankt: Yankyy02
Yankyy02 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Di 26.07.11 19:31 
Servus Trashkid2000

Jep dein Vorschlag hatt wunderbar funktioniert!! :lol:

Besten Dank nochmal dafür!! :beer:

Ich hab jetzt nur noch 2 kurze Fragen!

No1 Wie fügt ihr den Quelltext(Code) so gut ein?!
No2 Programmiert Ihr schon so lange und habt jede menge Erfahrung oder
wie schaft Ihr es euch so ein Problem kurz anzuschauen und sofort
einen passenden Code zu haben!?

Den wenn ich daß mit "Bitmap randBitmap = Properties.Resources.ResourceManager.GetObject(randBitmapName) as Bitmap;"
mache dann brauch ich ja gar kein Array mehr!

Nicht lachen aber ich hab mir einige Bücher gekauft (C#2010 Von Kopf bis Fuss, Einstieg in C#2010 und Das umfassende Handbuch)
aber irgendwie schaff ich es nicht so recht das gelesene("erlente") richtig einzusetzen!

Wäre noch für Ratschläge/Vorschläge wie Ihr es geschaft habt so gut zu werden sehr dankbar!!

Vielen Dank nochmal jeden einzelnen der sich meiner angenommen hatt!!

MfG

Yankyy02
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4800
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 26.07.11 19:50 
Hallo Yankyy02,

zu 1. dafür gibt es unter "Bereiche" die Auswahl für C# (alternativ per Hand [ cs ] ... [ /cs ] um den Code herum schreiben - ohne die Leerzeichen(!))
(ich wollte deinen Beitrag schon nachträglich editieren, aber das Entfernen der Color-Tags war mir dann doch zuviel Arbeit - es wäre schön, wenn du deinen Beitrag dahingehend noch mal editieren würdest, danke.)

zu 2. kurz und knapp: ja ;-)

Für diesen Beitrag haben gedankt: Yankyy02
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Di 26.07.11 21:39 
Hallo,
schön, dass es Dir geholfen hat!

Also zu 1.) hat ja schon user profile iconTh69 geschrieben, wie das geht.
Zu 2.) Naja, ich persönich programmiere nun seit ca. 2 Jahren in C#. Würde mich eher im Feld der fortgeschrittenen Programmierer sehen. Programmierung ist halt ein sehr breites Feld. Habe davor in Delphi programmiert.
Mit den Büchern: das ist alles schön und gut, aber ich vertrete die Meinung, dass man Programmierung nur durch Praxis erlernt. Und nicht durch Theorie. Theoretisch kann ich auch vieles...
Muss aber auch zugeben, dass ich hier keinen Code poste, ohne ihn vorher getestet zu haben :oops:
Aber dadurch lernt man auch 'ne Menge, da man sich immer mit neuen Themen beschäftigt.
Und so ist es wenigstens gewisss, dass der Code auch funzt.

Ansonsten: Immer wieder entdeckerfreundlich sein (z.B. mal schauen, was Dir IntelliSense so anbietet), oder einfach mal googlen wie man z.B. die Methode "KugelGenerieren" besser machen könnte, ohne 45x was zu schreiben.
Aber zugegeben, das birgt natürlich auch Gefahren. Denn wenn Du die Properties.Resources abfragst, kannst Du Dir sicher sein, dass die abgefragte Resource existiert (weil die Klasse immer neu generiert wird). Bei meiner Methode bekommst Du eine Exception, wenn eine Resource nicht vorhanden ist.
Soviel erstmal,

Für diesen Beitrag haben gedankt: Yankyy02
Yankyy02 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 138
Erhaltene Danke: 21

Win 11 x64
C# (VS 2022 - Rider)
BeitragVerfasst: Di 26.07.11 21:57 
Danke für euer Feedback!

Hoffe man liest sich mal wieder!!

Und wer weis in 2 - 3 Jahren kann ja ich auch euch mal helfen!! :P

MfG

Yankyy02