Autor Beitrag
bobbie3003
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 26.02.10 23:43 
Hi,

ich bin noch c# Anfänger und mache gerade das Buch "C# von Kopf bis fuß" durch. Ich komme bei dem Workshop 1 das hunderennen falls das jemand schon kennt nicht weiter
(code ist angehängt).

Das was mir noch am meisten Probleme macht ist das Zugreifen auf methoden und variablen von anderen Klassen und diese Fehlermeldung hier:

"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

Erstellen Sie eine Objektinstanz mit dem Schlüsselwort new.

Ich hab auch keine Ahnung wie ich am Ende des Rennens am besten die Aktualisierung durchführe für die Radiobuttons sprich der Geldbetrag muss aktualisiert werden wer gewonnen und wer verloren hat.

Wäre auch dankbar für tips wie man es einfacher hätte machen können, ich hatte an manchen Stellen das Gefühl etwas doppelt gemoppelt zu machen.

vielen dank im voraus
Einloggen, um Attachments anzusehen!
bobbie3003 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 27.02.10 16:18 
ok ich habe nochmal von vorne angefangen und jetzt klappt es schon besser aber jetzt trat das nächste Problem auf:
in meiner Initialisierung steht folgendes in Klasse "Form1.cs" :

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:
 public partial class Form1 : Form
    {
        Windhund[] hunde = new Windhund[4];
        Spieler[] Gamer = new Spieler[3];   
        Wette spiel = new Wette();
        
        public Form1()
        {
            InitializeComponent();

            Gamer[0] = new Spieler { Name = "Tim", Geld = 50, Meinewette = null, MeinRadiobutton = radioButton1, MeinTextbox = textBox1, MeinLabel = label2};
            Gamer[1] = new Spieler { Name = "Tom", Geld = 75, Meinewette = null, MeinRadiobutton = radioButton2, MeinTextbox = textBox2, MeinLabel = label2 };
            Gamer[2] = new Spieler { Name = "Jan", Geld = 45, Meinewette = null, MeinRadiobutton = radioButton3, MeinTextbox = textBox3, MeinLabel = label2 };

            Gamer[0].LabelAktualisieren();
            Gamer[1].LabelAktualisieren();
            Gamer[2].LabelAktualisieren();

            Gamer[0].Meinewette.BeschreibungAbrufen();
            Gamer[1].Meinewette.BeschreibungAbrufen();
            Gamer[2].Meinewette.BeschreibungAbrufen();
            
        }


dabei sollen diese Anweisungen

ausblenden C#-Quelltext
1:
2:
3:
            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:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
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; 
            }                                
        }

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?

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 27.02.10 17:03 
Ohne den Rest des Codes zu kennen: Wieso übergibst Du bei der Erzeugung der Spieler (im ersten Quelltext Zeilen 11-13) als "Meinewette" den Wert null und nicht spiel?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bobbie3003 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 27.02.10 17:12 
naja im buch hieß es beim initilisieren der spieler objekte "Meinewette" mit 0 zu initialisieren und danach sofort Labelaktualisieren
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 27.02.10 17:40 
Wo soll denn dann aber Gamer[0].Meinewette mit Inhalt gefüllt werden? Probier doch mal aus, ob's klappt. Ein bisschen experimentieren gehört auch zum programmieren dazu :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 27.02.10 18:21 
Hallo und noch :welcome:

Außerdem (neben den von Christian genannten Punkten) vermischst du die Klassen:

Ein Spieler enthält eine Wette. Die "Beschreibung abrufen" ist eine Methode der Wette-Klasse. Wie kann sie etwas über den Wetter kennen?

Das Formular enthält u.a. Spieler und TextBoxen. Der Wetter darf nichts über die TextBox des Formulars wissen.

Du musst erheblich genauer darauf achten, dass "abhängige" Klassen keinerlei Informationen haben dürfen über die "übergeordneten" Klassen. Besser wäre etwas wie:
ausblenden C#-Quelltext
1:
Gamer[0].BeschreibungAbrufen();					

In der Spieler-Klasse hast du Zugriff auf MeineWette, kannst diesen Wert also auch in den Rückgabewert einbauen.

Solange die Wette null ist, kann sie keinen Wert angeben. Das ist etwas anderes als der Wettbetrag 0.

Nebenbei: Solche Initialisierungen passen besser in das Form.Load-Ereignis. Wenn BeschreibungAbrufen einen String zurückliefert, sollte der auch als Ergebnis benutzt werden. Ich halte so etwas für besser (BeschreibungAbrufen als Teil von Spieler):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public string BeschreibungAbrufen() {
   string result;
   if (Meinewette == null)
      result = Name + " hat noch nicht gewettet";
   else
      result = Name + " wettet " + Meinewette.Betrag.ToString() 
                                 + " € auf Hund " + Meinewette.Hund; 
   return result;
}

Es wird dann so aufgerufen:
ausblenden C#-Quelltext
1:
textBox2 = Gamer[2].BeschreibungAbrufen();					


Ich gebe zu, dass ich mir das "vorgegebene" Konzept nicht angeschaut habe. Sollte die Vermischung der Klassen und Controls dort so stehen, wäre das ein miserables Konzept. Aber vielleicht helfen meine Hinweise trotzdem.

Jürgen
bobbie3003 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 27.02.10 18:31 
hi danke für die antwort aber bei deinem lösungsvorschlag kommt derselbe fehler den ich die ganze zeit schon bekomme (siehe screen)

PS: ach ja dein Vorschlag mit Gamer[0].BeschreibungAbrufen(); funktioniert leider nicht weil die methode nicht in der Spieler Klasse drin ist sondern in der Wette Klasse also muss ich über einen umweg an sie rankommen
Gamer[0].Meinewette.BeschreibungAbrufen();

ich will doch nur den inhalt der variablen "Betrag" für jeden einzelnen Gamer abfragen und wenn der null ist soll eben dieser string
"spielername hat nicht gewettet" an die zugehörige textbox auf dem formular erscheinen AAAAAAAAAAAA :-)

acuh das hier bringt denselben fehler:

Gamer[0].MeinTextbox.Text = Gamer[0].Meinewette.BeschreibungAbrufen();
Gamer[1].MeinTextbox.Text = Gamer[1].Meinewette.BeschreibungAbrufen();
Gamer[2].MeinTextbox.Text = Gamer[2].Meinewette.BeschreibungAbrufen();
Einloggen, um Attachments anzusehen!
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 27.02.10 18:47 
1. "derselbe Fehler": Ich habe bisher nichts von diesem Fehler gelesen.

2. Den Text hättest du wirklich als Zitat bringen können, statt als winziges Bildchen:
Zitat:
NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt


3. Sowohl Christian als auch ich haben darauf hingewiesen, dass es einen Unterschied macht, ob eine Wette auf null gesetzt ist (wie bei deinem Spieler-Konstruktor) oder einen Betrag 0 enthält (wie in deiner Abfrage):
ausblenden C#-Quelltext
1:
if (Wetter.Meinewette.Betrag == 0)					

An dieser Stelle ist Meinewette noch auf null gesetzt und kann keinen Betrag liefern; deshalb gibt es die Exception. Der richtige Weg steckt in meinem Vorschlag für BeschreibungAbrufen.

4.
user profile iconbobbie3003 hat folgendes geschrieben Zum zitierten Posting springen:
... ach ja dein Vorschlag mit Gamer[0].BeschreibungAbrufen(); funktioniert leider nicht weil die methode nicht in der Spieler Klasse drin ist sondern in der Wette Klasse

Ich habe ja ausdrücklich gesagt, dass es besser ist, diese Methode in die Spieler-Klasse zu legen. Dann brauchst du auch keinen Umweg.

5.
user profile iconbobbie3003 hat folgendes geschrieben Zum zitierten Posting springen:
acuh das hier bringt denselben fehler:
Gamer[0].MeinTextbox.Text = Gamer[0].Meinewette.BeschreibungAbrufen();

Natürlich, weil sich in deiner Version von BeschreibungAbrufen nichts geändert hat. Außerdem werden hier weiterhin die verschiedenen Klassen vermischt. Ich will den Text im Formular ändern und vom Spieler holen.

Vorschlag: Löse dich von der Vorlage. Bau ein vernünftiges Konzept und beachte die Trennung der Klassen.

Jürgen
bobbie3003 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 27.02.10 19:05 
ach so ein forum ist das hier hmm ok kann mir mal jemand nen link schicken wie ich mein profil hier wieder löschen kann.

es ist nicht so das ich einfach mal unfertigen code hier reingestellt habe und gesagt habe "na los hier macht mal" ich hab mich damit auseinandergesetzt und bin wie gesagt noch c# anfänger.

stattdessen werde ich hier zitiert und krieg andauernd zu hören "nö du hast unrecht" und dann tut ihr noch so schockiert "omg so doch net" was soll der käse?

gehört ihr zu der sorte die auf jeden *mist*en der weniger weiß als sie

echt arm sowas
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 27.02.10 19:14 
user profile iconbobbie3003 hat folgendes geschrieben Zum zitierten Posting springen:
es ist nicht so das ich einfach mal unfertigen code hier reingestellt habe und gesagt habe "na los hier macht mal" ich hab mich damit auseinandergesetzt und bin wie gesagt noch c# anfänger.

Und wir haben versucht, Dir zu helfen. Wenn Du Dich als derart beratungsresistent erweist, dann ist das nun wirklich nicht unser Problem.

user profile iconbobbie3003 hat folgendes geschrieben Zum zitierten Posting springen:
stattdessen werde ich hier zitiert

Skandalös :roll:

user profile iconbobbie3003 hat folgendes geschrieben Zum zitierten Posting springen:
und krieg andauernd zu hören "nö du hast unrecht" und dann tut ihr noch so schockiert "omg so doch net" was soll der käse?

So ein Unsinn, JüTho beschreibt Dir ausführlich, was falsch ist (und wenn nichts falsch wäre, wärst Du ja wohl kaum hier, oder?) und bekommt dann von Dir sowas zu hören?

Dann erzähl doch mal, was Du von uns erwartest? Was wäre denn eine Antwort, die Dir genehm ist?

user profile iconbobbie3003 hat folgendes geschrieben Zum zitierten Posting springen:
gehört ihr zu der sorte die auf jeden *mist*en der weniger weiß als sie

echt arm sowas
Ich glaube, Du bist zu unreif für dieses Forum.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bobbie3003 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 27.02.10 19:16 
tja da haste wohl recht also schick mir einfach nen link dann lösch ich mein profil und das wars dann
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 27.02.10 19:17 
Schicke eine Nachricht ans Team (in der Sidebar der Link "Kontakt zum Team" in den Quicklinks) und es wird sich sicherlich ein Administrator finden, der Deinen Account löscht.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.