Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo liebe Community,

ich arbeite seit kurzem berufsschulbedingt mit C#.
Ich schreibe momentan an einem TextAdventure in einer WindowsFormsApplication.

Ich bin leider nicht sehr tief in der Materie, habe eine Klasse(Raum) definiert und auch eine Klasse(Spieler)
für einige Aktionen in Methoden, die ich durchführe/aufrufe muss ich allerdings bereits auf das Objekt(Spieler1) aus der Klasse(Spieler) zugreifen.

Jetzt mein Problem: Solange ich an dem Programm schreibe sind die Objekte ja noch nicht erzeugt, ich kann aber Beispielsweise mein Programm nicht testen, da noch weiterhin Fehler existieren. Zu diesen Fehlern gehört auch die Meldung "Spieler1" existiert in diesem Kontext nicht.
Logisch, weil das Objekt erst mit dem Klick auf den Startbutton erzeugt wird und daher nicht existiert, wenn das Programm nicht läuft.
Mache ich da irgendwas falsch, wenn ich das Objekt in Methoden verwende?
Kann ich anderweitig auf Eigenschaften des Objektes zugreifen?

Und wie sieht das aus, wenn ich Methoden einer Klasse in einem WindowsForm-Objekts verwenden will.

Also den return-Wert einer Methode in einem Textfeld angeben möchte?

private void tb_name_TextChanged(object sender, EventArgs e)
        {
            //Textfeld indem der Name des Raums angezeigt werden soll.
            this.tb_name.Text = Spieler1.position();                         // <--- Hierauf verweist der Fehler
        }

Severity    Code       Description
Error       CS0103    The name 'Spieler1' does not exist in the current context

 

Zweite Frage zu gleichem Programm:
Ich erzeuge Gebiete, die der Spieler1 betreten kann und erstelle dafür eine Klasse(Room). Visual Studio meckert jetzt herum, wenn ich in anderen Methoden irgendwelche Variablen also Typ Room initialisiere. Muss ich das irgendwie anders machen?

public class Spieler
    {
        //Klasseneigenschaften
        public string name;
        public int age;
        Room position;    // <--- Hierauf verweist der Fehler
		//...
		//...
	}

Severity    Code       Description
Error        CS0246    The type or namespace name 'Room' could not be found (are you missing a using directive or an assembly reference?) 

 

Geschrieben

Ja, ich muss mich da noch reinarbeiten. Habe bereits ein paar blöde Fehler gefunden.

Sag mal, kann ich eine Variable eines Objektes über einen Button abrufen und diesen alt Text in einer Textbox anzeigen lassen?
Ich habe es so geschrieben. Weiß auch, das die Textbox darauf reagiert, wenn ich da nur Text ausgebe, also einen string.

Jetzt will ich aber die Variable "name" des Objekts "Spieler1" ausgeben.
Muss ich dafür eine Methode erstellen oder kann ich darauf einfach so zugreifen?

private void bt_char_Click(object sender, EventArgs e)
        {
            //Mit dem Klick auf diesen Knopf soll später der Spieler seinen Namen ausgeben können.
            this.tb_main.Text = "Name: " + Spieler1.name;
        }

 

Geschrieben
vor einer Stunde schrieb LittleBrother:

Logisch, weil das Objekt erst mit dem Klick auf den Startbutton erzeugt wird und daher nicht existiert, wenn das Programm nicht läuft. 
 

Deine Schlussfolgerung bezüglich der Ursache für diese Fehlermeldung ist falsch.

Das Problem ist nicht, dass das Objekt der Klasse Spieler namens Spieler1 noch nicht erzeugt ist, sondern dass der Bezeichner (sozusagen der Variablenname) Spieler1 an dieser Stelle unbekannt ist.

Jeder Bezeichner hat einen Gültigkeitsbereich. Und nur in diesem Bereich ist er verfügbar. Leider hast du nicht gezeigt, wie und wo du Spieler1 deklariert hat. Aber vermutlich ist es irgendeine Methode einer Form-Klasse. In diesem Fall erstreckt sich der Gültigkeitsbereich dieses Bezeichner auch nur auf diese Methode. In anderen Methoden derselben oder anderer Form-Klassen ist Spieler1 nicht verfügbar.

Wo in deinem Code "Spieler Spieler1;" stehen sollten, das ist Gegenstand des objektorientierten Designs.

Geschrieben

Ah, jetzt wo du es sagst.:D

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void tb_name_TextChanged(object sender, EventArgs e)
        {
            //Textfeld indem der Name des Raums angezeigt werden soll, indem sich der Spieler zur Zeit befindet.
            this.tb_name.Text = Spieler1.position();
        }

        private void bt_start_Click(object sender, EventArgs e)
        {
            //Hier folgt die Charaktererstellung
            Spieler Spieler1 = new Spieler();
        }
}

 

Geschrieben
Am 16.12.2015 at 17:15 schrieb LittleBrother:

Ah, jetzt wo du es sagst.:D


public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void tb_name_TextChanged(object sender, EventArgs e)
        {
            //Textfeld indem der Name des Raums angezeigt werden soll, indem sich der Spieler zur Zeit befindet.
            this.tb_name.Text = Spieler1.position();
        }

        private void bt_start_Click(object sender, EventArgs e)
        {
            //Hier folgt die Charaktererstellung
            Spieler Spieler1 = new Spieler();
        }
}

 

 

Vielen Dank für eure Tipps.
Ich habe meine Probleme jetzt erstmal gelöst.

Ich habe den Spieler in die Programmklasse verschoben, in dessen Methoden er und seine Methoden immer wieder aufgerufen werden.

Ich arbeite grade an einer Texteingabe über eine Textbox, verstehe grade nicht, wieso ich die Enter Taste da nicht benutzen kann. Ich verwende vermutlich einfach die falsche Textbox oder sowas. Ich muss mich da nochmal einlesen.

Geschrieben

Was meinst du mit "du kannst die Enter Taste nicht benutzen"? Willst du eine mehrzeilige Eingabe? Oder willst du, wenn du auf Enter drückst, eine Aktion ausführen?

Ersteres kannst du bewerkstelligen, indem du die Eigenschaft Multiline der TextBox auf true setzt.

Für letzteres musst du auf das Event OnKeyDown der TextBox hören und - wenn die Enter Taste gedrückt wurde - deine Methode aufrufen.

Hilft das weiter?

Geschrieben
Zitat

Hallo liebe Community,

ich arbeite seit kurzem berufsschulbedingt mit C#.
Ich schreibe momentan an einem TextAdventure in einer WindowsFormsApplication.

Kleiner Tip am Rande: Lass die Finger von Winforms! Damit versaut man sich das Verständnis von Programmierung. Dort gibt es nur schlechte bis gar keine saubere Trennung zwischen Applikations- und Darstellungslogik, bzw. wird man auch nicht zu einer solchen angehalten. WinForms ist so ziemlich das gruseligste, was MS zuwege gebracht hat. Das Pendant WebForms ist da keinen deut besser. Damals ritt so ein seltsamer Dämon die Leute und zwang sie zu komischen Abstraktionen. Vorallem besessen waren die JAVA-Programmierer ... ich schweife ab...

Also: Guck Dir lieber WPF an, das ist zumindest etwas besser designed! MVVM kann Dir auch in anderen Kontexten begegnen.

  • 2 Wochen später...
Geschrieben
Am 18.12.2015 um 16:13 schrieb arlegermi:

Was meinst du mit "du kannst die Enter Taste nicht benutzen"? Willst du eine mehrzeilige Eingabe? Oder willst du, wenn du auf Enter drückst, eine Aktion ausführen?

Ersteres kannst du bewerkstelligen, indem du die Eigenschaft Multiline der TextBox auf true setzt.

Für letzteres musst du auf das Event OnKeyDown der TextBox hören und - wenn die Enter Taste gedrückt wurde - deine Methode aufrufen.

Hilft das weiter?

Letzteres suchte ich :) Danke für deine Antwort.
"Nicht benutzen" damit meine ich, das eben dieser bekannte Windows-Sound kommt, wenn man mit dem Tastendruck nichts anfangen kann.
Ich hatte das falsche Event verwendet, damit funktionierte es dann natürlich nicht so, wie ich es geplant hatte.
Ich schaue mir jetzt mal das OnKeyDown Event an.

Meine Testeingaben hatten auch schon im Vorhinein funktioniert. Zumindest vom Code her, stand nur an der falschen Stelle und ich hatte keine Schleife eingebaut, die auf eine Eingabe wartete, sodass die Eingabe zu schnell vorbei war und damit die Variable nicht belegt.
 

Am 20.12.2015 um 14:24 schrieb lilith2k3:

Kleiner Tip am Rande: Lass die Finger von Winforms! Damit versaut man sich das Verständnis von Programmierung. Dort gibt es nur schlechte bis gar keine saubere Trennung zwischen Applikations- und Darstellungslogik, bzw. wird man auch nicht zu einer solchen angehalten. WinForms ist so ziemlich das gruseligste, was MS zuwege gebracht hat. Das Pendant WebForms ist da keinen deut besser. Damals ritt so ein seltsamer Dämon die Leute und zwang sie zu komischen Abstraktionen. Vorallem besessen waren die JAVA-Programmierer ... ich schweife ab...

Also: Guck Dir lieber WPF an, das ist zumindest etwas besser designed! MVVM kann Dir auch in anderen Kontexten begegnen.

Dein Tipp hilft mir leider nicht weiter, wenn ich mich mit WindowsFormsApplication berufsschulbedingt beschäftigen muss. Es ist meine Aufgabe ein WindowsFormsApplication TextAdventure zu erstellen. Auch wenn andere Wege sicher programmiertechnisch weiser sind, bin ich gezwungen diesen Weg zu nehmen.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...