Hi,
bin noch c# Anfänger und arbeite gerade das Buch "c# von Kopf bis fuß"
durch. Ich bin jetzt angelangt bei dem ersten Workshop es geht um eine
Hunderennbahn. Ich habe folgendes Problem.
Dieser Code steht in meinem Formular Form1.cs:
private void button1_Click(object sender, EventArgs e)
{
if (label2.Text == "Tim")
{
if ( (Gamer[0].WetteAbgeben((int)numericUpDown1.Value,
(int)numericUpDown2.Value)) == true)
{
spiel.MeinTextbox = textBox1;
spiel.BeschreibungAbrufen();
}
else
MessageBox.Show("Spieler hat nicht genug Geld");
}
else if (label2.Text == "Tom")
...........
ich rufe die methode "wetteabgeben" auf und übergebe zwei int werte :
Dieser Code steht in einer anderen Klasse "Spieler.cs":
public bool WetteAbgeben(int betrag, int hund)
{
//Setzt eine Wette und speichert sie in MeineWette
//Liefert true, wenn der Spieler genug Geld hat
if (betrag > 0 && betrag >= 5)
{
Meinewette = new Wette() { Betrag = betrag, Hund = hund,
Wetter = this };
return true;
}
else return false;
}
diese beiden int Werte sollten eigentlich in "Betrag" und "Hund"
eingetragen werden aber nach dieser anweisung sind sie beide immer noch
null auch der Parameter "Wetter" ist danach auf null
So schlecht zu sagen, das Problem liegt glaube ich in der Klasse Wette.
> if (betrag > 0 && betrag >= 5)
Warum überprüfst du betrag auf auf grösser 0? Wenn er grösser/gleich 5
ist ist auch grösser 0 ;-)
> if ( (Gamer[0].WetteAbgeben((int)numericUpDown1.Value,> (int)numericUpDown2.Value)) == true)
Der klassische Anfängerfehler.
Das "== true" weglassen, da die Funktion WetteAbgeben ja schon einen
boolschen Ausdruck zurückliefert, den brauchst du nicht nochmal zu
überprüfen.
Was du damit eigentlich ist sagt ist
mal ne andere frage ich habe im Form1.cs diesen button hier:
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
Gamer[0].LabelAktualisieren();
Gamer[0].Meinewette.BeschreibungAbrufen();
}
mir gehts es um die methode "BeschreibungAbrufen()" in der Klasse
Wette.cs
public string BeschreibungAbrufen()
{
//Liefert einen String der den Wetter den gesetzten Betrag
//und den gewetteten Hund angibt ("tim wettet 8 € auf Hund
4").
//Ist der Betrag null, wurde nicht gewettet ("Tim hat nicht
gewettet");
if (Wetter.Meinewette.Betrag == 0)
{
return Wetter.MeinTextbox.Text = Wetter.Name + " hat
nicht gewettet";
}
else
{
return Wetter.MeinTextbox.Text = Wetter.Name + " wettet
" + Wetter.Meinewette.Betrag + " € auf Hund" + Wetter.Meinewette.Hund;
}
}
diese Methode sollte dafür sorgen das beim Starten des Programms die
if-Anweisung ausgeführt wird weil ja noch nicht gewettet wurde aber in
der Textbox steht gar nichts warum erkennt das Programm nicht das in
Betrag im Moment noch eine 0 drin steht?
dabei sollen diese Anweisungen
Gamer[0].Meinewette.BeschreibungAbrufen();
Gamer[1].Meinewette.BeschreibungAbrufen();
Gamer[2].Meinewette.BeschreibungAbrufen();
Auf dem Formular diesen text hier einfügen "Spielername hat noch nicht
gewettet" also z.B. Gamer[0] => "Tim hat noch nicht gewettet"
die Methode "BeschreibungAbrufen()" in der Klasse "Wette.cs"
sieht so aus:
1
publicstringBeschreibungAbrufen()
2
{
3
//Liefert einen String der den Wetter den gesetzten Betrag
4
//und den gewetteten Hund angibt ("tim wettet 8 € auf Hund 4").
5
//Ist der Betrag null, wurde nicht gewettet ("Tim hat nicht gewettet");
6
7
if(Wetter.Meinewette.Betrag==0)
8
{
9
returnWetter.MeinTextbox.Text=Wetter.Name+" hat nicht gewettet";
10
}
11
else
12
{
13
returnWetter.MeinTextbox.Text=Wetter.Name+" wettet "+Wetter.Meinewette.Betrag+" € auf Hund"+Wetter.Meinewette.Hund;
14
}
15
}
es tut sich aber gar nichts im Formular in der Textbox obwohl Betrag ja
noch null ist der Button "wettet" wurde noch nicht betätigt und somit
müsste da noch 0 drinstehen irgendjemand ne idee?
Ich weiß echt grad nicht was du willst... so vielleicht?
1
publicstringBeschreibungAbrufen(){
2
if(Wetter.Meinewette.Betrag==0){
3
Wetter.MeinTextbox.Text=Wetter.Name+" hat nicht gewettet";
4
returnWetter.Name+" hat nicht gewettet";
5
}
6
// ...
7
}
Das setzt jetzt zum einen den Text in der "MeinTextbox" auf "... hat
nicht gewettet" und gibt danach diesen string zusätzlich noch zurück.
Für eine normale Zuweisung an eine Variable brauchst du kein "return".
Genauso wie dus hier ja auch gemacht hast:
nö geht leider immer noch nicht alles im Programm läuft bis auf diesen
scheiss ich könnte kotzen ich will nur die variable "Betrag" für jeden
Gamer abfragen und dann einen string an die zugehörige textbox senden
ungefähr so:
Genau,
Wetter.Meinewette hast du beim Programmstart auf NULL festgelegt, damit
existiert Wetter.Meinewette.Betrag gar nicht, also kann sie auch nicht 0
sein, daher die Fehlermeldung.
Du musst überprüfen ub das Objekt null ist bevor auf auf die Eigenschaft
zugreifst, also muss die if Abfrage in deinen Screenshop so laufen:
1
if (Wetter.Meinewette == null || Wetter.Meinewette.Betrag == 0)
das buch is eigentlich nicht schlecht nur nach ein paar wenigen kapiteln
kommt das erste große projekt wo auch sachen drankommen die nicht im
buch erklärt wurden da musste ich ds inet zu rate ziehen für den
workshop gibts eben keine musterlösung aber jetzt sitz ich schon solange
an der dran das will ich unbedingt rauskriegen :-)
Da kann gar nicht funktionieren, lass die Hilfsvariablen weg, sondern
gib den String zurück. Und die Textbox hat in der Klasse nichts
verloren.
z.B. so:
ja das mit der textbox stimmt die hat da wirklich nix zu suchen aber ich
hab mal gedebuggt fogendes passiert:
wenn in der initialisierung Meinewette=null ist
kommt der fehler schon beim aufruf der methode
ich weiß das in der methode die Gui textbox nicht hätte beschrieben
werden sollen aber in dem workshop ging es eben darum von anderen
klassen diesen spagat zu der Gui Klasse Form1.cs zu machen und ja ich
weiß dafür is OOB Pragrammieren eigentlich net gedacht bitte nicht
gleich auf den deckel hauen ich bin nur froh das es jetzt geht.
wenns noch interessiert habe es durch debuggen rausbekommen als aller
erstes ist diese Initialisierung nicht falsch "Meinewette = null"
aber bevor man methoden mit dieser instanz aufrufen kann ist diese
anweisung entscheidend:
Gamer[s].Meinewette = new Wette();
ich habe immer noch die gleiche abfrage in der methode
if (Wetter.Meinewette.Betrag == 0)
nur nach der methode wetteabgeben sind die gamer und damit auch wetter
erst vorhanden und initialisiert und erst jetzt kann ich den betrag
abfragen also gute nacht ich bin k.o. :-)