Laden...

[gelöst] Wo Objekt aus eigener Klasse erstellen, sodass man von überall darauf zugreifen kann.

Erstellt von t0rben vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.505 Views
T
t0rben Themenstarter:in
19 Beiträge seit 2015
vor 9 Jahren
[gelöst] Wo Objekt aus eigener Klasse erstellen, sodass man von überall darauf zugreifen kann.

Hallo,

ich habe folgendes Problem:
Ich weiß leider nicht wo ich in einer Windows Forms Anwendung ein Objekt aus meiner eigenen Klasse erstellen muss, sodass ich in allen "Unterprozeduren", wie z.B.:
Commandbutton1_Click, etc. darauf zugreifen kann.

Wenn ich in der gleichen "Prozedur?" das Objekt erstelle, kann ich auch darauf zugreifen:


public void cmd_senden_Click(object sender, EventArgs e)
        {

            liste meineliste;
            meineliste = new liste("1234");

            meineliste.setedv("4321");

        }

Meine Klasse ist derzeit so aufgebaut:


public class liste
    {
        string edv;
        public liste(string _edv)
        {
            edv = _edv;

        }

        public string getedv()
        {
            return edv;
        }

        public void setedv(string __edv)
        {
            edv = __edv;
        }
    }

Wenn ich jetzt aber einen weiteren Button einfüge und auf die Liste zugreifen möchte, z.B. um diese auszulesen...

public void cmd_get_Click(object sender, EventArgs e)
        {
            label1.Text = meineliste.getedv();

        }

Bekomme ich folgende Fehlermeldung:

Fehlermeldung:
Fehler 1 Der Name 'meineliste' ist im aktuellen Kontext nicht vorhanden. C:\Users\Torben\Desktop\Bestellprogramm\Bestellung1\Bestellung1\Form1.cs 34 27 Bestellung1

Wie oder wo muss ich die Objekte erstellen, dass das möglich ist?

Vielen Dank im Vorraus!

Torben

189 Beiträge seit 2014
vor 9 Jahren

Hallo t0rben,

erstmal herzlich wilkommen im Forum!

Also die Methoden(!) liegen ja ihrerseits in einer Klasse - vermutlich in der gleichen?!
Dann müsstest du die Definition der Liste aus der Methode in die Klasse ziehen.
Zu den Feldern deine Klasse "liste" noch ein Wort:
Gewöhne dir lieber gleich von Anfang an an, diese "private" zu machen und nur Propteries "puplic" zu setzen.
EDIT: Sorry habe zu flüchtig hingesehen! Der Grundgedanke ist richtig. Doch statt zwei Methoden "get..." und "set..." zu schreiben, verwende bitte Properties.

Gruß
Ezio

T
t0rben Themenstarter:in
19 Beiträge seit 2015
vor 9 Jahren

Hallo Ezio,
danke fürs Willkommenheißen und für deine schnelle Antwort!

Also die Methoden(!) liegen ja ihrerseits in einer Klasse - vermutlich in der gleichen?!

Die Methoden mit "cmd_" vorne sind werden beim Button-Click aufgerufen.
Die liegen in der Klasse bzw. im Objekt Form1.

Die Methoden mit "set" und "get" liegen in der Klasse Liste.

Dann müsstest du die Definition der Liste aus der Methode in die Klasse ziehen.

In welche Klasse genau? Ich würde jetzt vermuten in die "Program"

Habe dort an zwei Einfügepositionen ausprobiert:

Position 1:

static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
            liste meineliste;
            meineliste = new liste("0123");
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }  

Fehlermeldung:
Fehler 1 Ungültiges Token "=" in Klasse, Struktur oder Schnittstellenmemberdeklaration. C:\Users\Torben\Desktop\Bestellprogramm\Bestellung1\Bestellung1\Program.cs 19 24 Bestellung1
Fehler 2 Die Methode muss einen Rückgabetyp besitzen. C:\Users\Torben\Desktop\Bestellprogramm\Bestellung1\Bestellung1\Program.cs 19 30 Bestellung1
Fehler 3 Typ erwartet. C:\Users\Torben\Desktop\Bestellprogramm\Bestellung1\Bestellung1\Program.cs 19 36 Bestellung1

Position 2:

static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            liste meineliste;
            meineliste = new liste("0123");
        }
    }  
}

Fehlermeldung:
Fehler 1 Der Name 'meineliste' ist im aktuellen Kontext nicht vorhanden. C:\Users\Torben\Desktop\Bestellprogramm\Bestellung1\Bestellung1\Form1.cs 29 13 Bestellung1
Fehler 2 Der Name 'meineliste' ist im aktuellen Kontext nicht vorhanden. C:\Users\Torben\Desktop\Bestellprogramm\Bestellung1\Bestellung1\Form1.cs 35 27 Bestellung1

Viele Dank schonmal!
Gruß Torben
P.S.: Habe mal den Projektmappen-Explorer als Bild im Anhang hochgeladen.

/edit zu public /private
Danke, sobald das generelle Zugreifen funktioniert, werde ich das ändern!

189 Beiträge seit 2014
vor 9 Jahren

Hallo t0rben,

war die falsche Klasse. 😉
Nochmal Schritt für Schritt:
Dein Problem spielt sich alles in deiner Klasse Form1 ab.
Dort hast du die beiden Methoden, richtig?
In dieser Klasse möchtest du ein Objekt, das für diese gesamte Klasse gültig ist instanziieren.
Vom Prinzip her so:


public class Form1
{
    private liste myList;

    public Form1()
    {
        myList = new liste();
    }

    public void Button1_Click(){...}
 ....
}

So und dass mit der Property ist folgendes:
Du kannst deine Methoden "get" und "set" zusammenfassen:


public class liste
{
    private string edv;

    public string EDV
    {
        get
        {
            return edv;
        }
         set
        {
            edv = value;
        }
    }
}

Ezio

J
251 Beiträge seit 2012
vor 9 Jahren

Hallo,

Nehmen wir mal diese Klasse von Dir als Beispiel:

public class liste
    {
        string edv;
        public liste(string _edv)
        {
            edv = _edv;

        }

        public string getedv()
        {
            return edv;
        }

        public void setedv(string __edv)
        {
            edv = __edv;
        }
    }

Die Get/Set-Methode von edv wäre eign. besser als Eigenschaft alias Property definiert.

Aber schauen wir uns _edv an. Du hast jenes als privates Feld in der Klasse deklariert und somit ist es global in allen Methoden der Klasse "im Kontext vorhanden".

Gültigkeitsbereich der Variablen
Zugriffsmodifizierer

T
t0rben Themenstarter:in
19 Beiträge seit 2015
vor 9 Jahren

Dankeschön!! Hat funktioniert. 😃