Autor Beitrag
aequitas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP Pro; Win 7 Pro
Delphi
BeitragVerfasst: Sa 03.08.13 17:30 
Hey,

ich habe ein Verständnisproblem. Ich lege mir eine Klasse in einem C# - Projekt an.
Anschließend möchte ich ein neues Objekt per Klick auf einen Button erstellen und
mit einem Klick auf einen weiteren Button mit dem Objekt arbeiten. Allerdings erscheint
folgender Fehler:

Der Name 'person1' ist im aktuellen Kontext nicht vorhanden.

Der kleine Beispiel-Code:

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:
namespace Test1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Person person1 = new Person();
            person1.SetName("Armin");
            textBox1.Text = person1.name;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            person1.SetName("Bernd");     // ->Fehler
            textBox1.Text = person1.name; // ->Fehler
        }
    }
}


Die Klasse "Person" besitzt nur das Feld "name" und kann mit "SetName" gesetzt werden.

Wie muss ich nun vorgehen, dass die Klasse "global" verfügbar ist und nicht nur in
der "Button1"-Methode?

Danke euch schonmal :)

Gruß

Moderiert von user profile iconTh69: Code formatiert (Kommentare eingefügt), damit der Code syntaktisch korrekt ist
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 03.08.13 18:03 
Hallo aequitas,

(Klassen-)Membervariable ist das Stichwort, also außerhalb der Methode in der Klasse selbst deklarieren:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private Person person1;

    private void button1_Click(object sender, EventArgs e)
    {
        person1 = new Person();
        person1.SetName("Armin");
        textBox1.Text = person1.name;
    }

    // ...
}

Und nun überlege dir noch, was du tun mußt, um den Fehlerfall abzufangen, daß der Anwender zuerst den "Button2" klickt.
aequitas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP Pro; Win 7 Pro
Delphi
BeitragVerfasst: Sa 03.08.13 18:43 
Wunderbar, genau das, was ich wissen wollte. :-)
Ich hatte es vorher in der Form1()-Methode versucht, aber dann schaue ich mir
nochmal die Struktur der Dateien an.

Vielen Dank

P.S. die Abfrage, die du meinst, lautet vermutlich dann

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
if (person1 != null)
{
  person1.SetName("Bernd");
  textBox1.Text = person1.name;
}


Grüße
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Sa 03.08.13 19:25 
Das würde helfen aber überleg die auch ob das so überhaupt Sinn macht. Wieso sind Armin und Bernd überhaupt die gleiche Person Instanz? Bei OOP verhält es sich meist genauso wie im richtigen Leben wenn du 2 Personen darstellen willst sollten es vermutlich in der Anwendung auch 2 Instanzen der Person Klasse sein.
aequitas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16

Win XP Pro; Win 7 Pro
Delphi
BeitragVerfasst: So 04.08.13 10:16 
Da hast du schon recht, mir ging es aber weniger um den Sinn und die Umsetzung in OOP.
Ich wollte nur von verschiedenen Methoden aus, auf eine Klasse (bzw. eher Instanz) zugreifen.

OOP habe ich über JAVA gelernt, nun schaue ich mir C# an, da mir die IDE, die Formular-Erstellung und auch sonst das ganze Modell besser gefällt. Zudem habe ich zum Schluss eine EXE-Datei, die einfacher zu handhaben ist.

Eine Konsolenanwendung aus nur einer Datei ist noch klar für mich, aber da die Formular-Anwendungen teilweise aus mehreren Dateien usw. bestehen, steig ich noch nicht 100%ig durch, was wo hinkommt.

Gruß

Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet: unnötige Zeilenumbrüche entfernt.