C# Variable an andere Klasse übergeben

KingJoshii1000

Lieutenant
Registriert
Apr. 2010
Beiträge
879
Hallo,
ich würde deine ein Programm erstellen, welches 2 Random Zahlen ausgibt, die man dann zusammenrechnen muss.
Also jweils für die Variable "x" und "y" soll eine Zufallszahl generiert und angezeigt werden. Diese beiden Variablen sollen dann Zusammen Variable "z" ergeben. Der Benutzer soll dann die beiden Zahlen zusammenrechnen und in Textbox1 eingeben. Soweit erstmal meine Idee. Das Problem jetzt nur ist, dass die Zahlen für "x" und "y" in der Klasse cmdJa generiert werden, jedoch soll eine andere Klasse die Variablen auch kennen. Weiß jemand wie ich das anstelle?
Ich hoffe ich habe mich nicht zu kompliziert ausgedrückt :D
Bin noch C# Anfänger daher nehmt mir es nicht übel, wenn ich manches relativ umständlich geschrieben habe, was viel leichter geht. :)
Mit freundlichen Grüßen
Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Flaminator_Reloaded
{
    public partial class Form2 : Form
    {
        Random r = new Random();
        //Form1 frm1 = new Form1();
        int a = 1;
        public Form2()
        {
            InitializeComponent();
            label1.Text = "Du hast 5 Sekunden Zeit folgende" + "\n" + "         Zahlen auszurechnen." + "\n" + "            Alles Verstanden?";
            label2.Visible = false;
            label3.Visible = false;
            label4.Visible = false;
            textBox1.Visible = false;

        }

        private void cmdJa_Click(object sender, EventArgs e)
        {
            int z = a + 1;
            if (z == 2)
            {
                cmdJa_NewPoint();
            }
            label1.Text = "                   Viel Spass ;)";
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = true;
            textBox1.Visible = true;
            cmdJa.Visible = false;
            cmdNein.Visible = false;
            timer1.Enabled = true;
            int x = r.Next(1000, 9999);
            int y = r.Next(1000, 9999);
            int b = x;
            int c = y; 
            label2.Text = x + "\n";
            label3.Text = y + "\n";
        }
        private void cmdJa_NewPoint()
        {
            cmdJa.Location = new Point(cmdJa.Location.X + 50,
            cmdJa.Location.Y - 27);
        }
        private void cmdNein_Click(object sender, EventArgs e)
        {
            this.Close();
            //frm1.Close();
        }

        private void label2_Click(object sender, EventArgs e)
        {
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            this.Close();

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
        }
    }
}
 
Erstell die Variable als Klassenvariable, initialisieren kannst du im Konstruktor.

Mit deiner Methode Click kannst du diese Variablen die der Klasse zugeordnet sind auch zugreifen und bearbeiten.
 
Zuletzt bearbeitet:
Du erstellst x und y als lokale Variablen der Methode cmdJa_Click. D. h., die Variablen existieren außerhalb dieser Methode nicht.
Wird die Methode aufgerufen, werden sie an der Stelle erst generiert, wo int x bzw. int y steht. Wird die Methode beendet, werden die Variablen gelöscht.

Um x und y dauerhaft vorzuhalten und auch für andere Klassen und Methoden zur Verfügung zu stellen, gibt es mehrere Möglichkeiten:

1) Globale Variablen
Schreibst du die Variablen in die Klasse aber außerhalb der Methoden, dann kann jede Methode in dieser Klasse auf sie lesend und schreiben zugreifen.

2) Value Object (VO)
Ein VO ist ein ganz normales Objekt, wie jedes andere auch. Allerdings wird es hauptsächlich darauf beschränkt, Daten zu speichern. Außer Wertebereichsprüfungen in den Settern gibt es in so einem Objekt normalerweise keine Logik, die sich mit dem Programmablauf beschäftigt.


Ganz zu Anfang ist es ok, globale Variablen zu verwenden. Sie sind schnell programmiert und in so kleinen Programmen leidet die Übersichtlichkeit nicht darunter.
Später solltest du dann auf VOs wechseln, wobei die bei gerade mal zwei Attributen so was wie Kanonenkugeln auf Spatzen darstellen.
 
Hallo,
wie erstelle ich den eine Globale Variable?
Schreibe ich die Zeile "int b = r.Next(1, 7);" unter "int a = 1;" bekomm ich den Fehler
Fehler 1 Ein Feldinitialisierer kann nicht auf das nicht statische Feld bzw. die nicht statische Methode oder Eigenschaft "Flaminator_Reloaded.Form2.r" verweisen.
 
Zuletzt bearbeitet:
Globale Variablen sind zu 99% der falsche Ansatz vor allem in größeren Programmen.

Richtig ist so:

Es gibt eine "Überklasse", die die zwei anderen Klassen "verwaltet". Diese instanziert auch die beiden anderen Klassen und macht sie bekannt. Wenn jetzt eine Klasse etwas von der anderen Klasse braucht, kann sie einfach darauf zugreife - fertig. Oder, eine Klasse kann möglicherweise als Unterklasse der anderen gesehen werden, dann käme man weiterhin mit nur 2 aus. Jedenfalls:

< ich bin die Überklasse >

Klasse1 k1 = new Klasse1();
Klasse2 k2 = new Klasse2();

k1.setAndereKlasse(k2);
k2.setAndereKlasse(k1);

k1.generiereZufallszeug();
returnwert=k1.getBerechnetesZufallszeug();

k2.doSomething(returnwert);

etc. pp. ich glaub es wird klar.
 
KingJoshii1000 schrieb:
Schreibe ich die Zeile "int b = r.Next(1, 7);" unter "int a = 1;" bekomm ich den Fehler
Fehler 1 Ein Feldinitialisierer kann nicht auf das nicht statische Feld bzw. die nicht statische Methode oder Eigenschaft "Flaminator_Reloaded.Form2.r" verweisen.
Du kannst eine Instanzvariable nicht mit einer anderen Instanzvariable initialisieren. Du musst das im Konstruktor machen:
Code:
        private Random r = new Random();
        private int a = 1;
        private int b;

        public Form2()
        {
            b = r.Next(1, 7);
            ...
        }
Mach' dich auch mal zum Thema Zugriffsmodifizierer schlau.
 
Hallo, erstmal vielen Dank für die Antworten ;)
Das klappt nun Super.
Eine Frage habe ich dennoch, unzwar möchte ich ja, dass der User die beiden Random Zahlen addiert und mit einem drücken auf Enter abschickt. Nun ist meine Frage, wie setze ich das am besten um?
Ich dachte an "if(TextBox1.Text == D). D ist hierbei die Variable die sich aus B + C zusammensetzt.
Nun das geht leider nicht :(.
Jemand eine Idee?
MFG
 
TextBox1.Text hat den Datentyp String und x, y und z haben Integer (int). Logischerweise geht ein direkter Vergleich mit String und Integer nicht. Du musst einen der Werte vorher in ein anderen Typ ändern. Die Int32-Klasse hat eine passende Methode, um Strings in int zu konvertieren.

Siehe auch:
http://msdn.microsoft.com/de-de/library/vstudio/bb397679.aspx
und
http://msdn.microsoft.com/de-de/library/vstudio/system.int32.aspx

(Speicher dir gleich den Link zur MSDN ab! Das Ding ist eine wunderbare Referenz, die fast keine Fragen unbeantwortet lässt.)
 
Zuletzt bearbeitet:
Zurück
Oben