Autor Beitrag
didiwerdau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 2000
C# 2008 Express Edition
BeitragVerfasst: Mo 16.03.09 14:58 
Hallo zusammen,

Bin gerade etwas ratlos, wie ich auf die Werte einer Klasse zugreifen soll.

Zum momentanen Aufbau:

Mein Proggi ist ein Windows-Form, wobei "Form1" das Hauptprogrammfenster ist.
zusätzlich habe ich eine Klasse Optionen in einer extra Datei.
Diese wird in Form1 instanziiert.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public classOptionen geladene_Optionen;

private void Form1_Load(object sender, EventArgs e)
        {
            // letzte CSV laden 
            try  // Optionen laden
            {
                geladene_Optionen = new classOptionen(Getaf.ApplicationPath() + "\\config.cfg");
                geladene_Optionen.Optionen_laden();
            }
            catch
            {

            }

        }


hier klappt der Zugriff wunderbar.
Über einen Menüpunkt "Optionen" öffne ich eine zweite Form und übergebe dieser Form1 als aufrufendes Form.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
public partial class Optionen : Form
    {
        Form aufrufendeForm; //in der Variable wird die über den Konstruktor übergebene Form gespeichert (Hier Form1) um hier die aufrufende Form bekannt zu machen, damit daten zur aufrufenden Form übertragen werden können.
        public Optionen(Form f) //Konstruktor erhält aufrufende Form (Form1) und speichert diese in einer Variablen
        {
            InitializeComponent();
            aufrufendeForm = f; //speichern der aufrufenden Form in Variable
            
        }
    }


leider kann ich nicht auf die public-Variable "geladene_Optionen" zugreifen.
Wenn ich hier mit new eine neue Instanz erstelle hat diese ja nicht die Werte aus Form1, oder? Wie realisiere ich hier den Zugriff auf die Optionen-Klasse?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Console.Beep()
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 43

Win XP, Ubuntu 8.10
C# (VS 2008 Exp) C++ (VS 2008 Exp)
BeitragVerfasst: Mo 16.03.09 15:41 
Du hast in der Klasse "Optionen" einen kleinen Fehler drinne.
Die Lösung findest du in deinen Kommentaren der Klasse "Optionen".
Tipp: achte auf deine Klassennamen^^

_________________
Ihr zweifelt an der Existenz der If-Schleife??? Ihr müsst nur fest daran glauben!!!
didiwerdau Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 2000
C# 2008 Express Edition
BeitragVerfasst: Mo 16.03.09 15:47 
Danke für die Antwort. Leider sehe ich die Lösung nicht.

Vielleicht ist das ganze aber auch ein Missverständnis mit den Namen.

Die Klasse Optionen, die oben in Quelltext steht, ist die Form, die über den Optionen-Button aufgerufen werden soll und zum Einstellen der Optionen dienen soll. Diese Einstellungen sollen dann in der Klasse classOtionen in Properties übergeben werden. Die Klasse macht noch nicht viel und sieht so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
class classOptionen
    {
        public classOptionen(string Optionsdatei)
        {

        }

        public void Optionen_laden()
        {

        }
    }


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Console.Beep()
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 43

Win XP, Ubuntu 8.10
C# (VS 2008 Exp) C++ (VS 2008 Exp)
BeitragVerfasst: Mo 16.03.09 16:26 
Bitte den Teil anschauen
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
Form aufrufendeForm; 
//in der Variable wird die über den Konstruktor übergebene Form gespeichert (Hier Form1) um hier die aufrufende Form bekannt zu machen, damit daten zur aufrufenden Form übertragen werden können.      
  
public Optionen(Form f) 
//Konstruktor erhält aufrufende Form (Form1) und speichert diese in einer Variablen


Hast du auch wirklich geguckt? Heißt die eine Form vom ersten Codeschnippsel "Form1"???
Wenn ja hast du bei der Klasse "Optionen" die falsche Klasse.

_________________
Ihr zweifelt an der Existenz der If-Schleife??? Ihr müsst nur fest daran glauben!!!
didiwerdau Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 2000
C# 2008 Express Edition
BeitragVerfasst: Mo 16.03.09 16:52 
Also ich verstehe es irgendwie nicht.

beim Aufruf der Form Optionen übergebe ich doch Form1, falls du das meinst.
Dazu verwende ich den Aufruf:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
private void optionenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Optionen Optionen_einstellen = new Optionen(this); //Formular Instanziieren und aufrufendes Formular mit übergeben.
            Optionen_einstellen.StartPosition = FormStartPosition.CenterScreen;
            Optionen_einstellen.ShowDialog(); // Formular für neue Verarbeitung anzeigen.
        }


Das soll ja aber nur das Formular zum Bearbeiten der Optionen aufrufen. Die Klasse classOptionen, die während der gesamten Programmlaufzeit die Einstellungen zur Verfügung stellen soll, soll davon unabhängig sein.
Mein Ziel ist es von der Form "Optionen" auf eine Instanz von "classOptionen" zuzugreifen dies gelingt mir aber nicht.

Vielleicht kannst du mir meinen Fehler etwas genauer aufzeigen, da ich nicht weiß, was du meinst. Bin noch ziemlicher Anfänger auf dem Gebiet.

Kann es manchmal sein, dass ich da wieder über irgendwelche Properties arbeiten muß?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: Mo 16.03.09 17:03 
ausblenden C#-Quelltext
1:
2:
public Optionen(Form f)
{//.....}


Du musst dir ein Objekt der Klasse Form1 übergeben lassen und es auch als Form1-Variable speichern um auf Form1-spezifische Variablen/Funktionen zugreifen zu können.
Du nimmst es da aber nur als Objekt der Klasse Form (von der Form1 ja abgeleitet ist, deshalb meckert der Compiler nicht).
didiwerdau Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 2000
C# 2008 Express Edition
BeitragVerfasst: Di 17.03.09 08:42 
Achso, danke. Hatte es so, wie es war aus nem Buch übernommen.

Ist die Vorgehensweise so eigentlich in Ordnung oder sollte man so ein Programm anders strukturieren?
Bin, wie gesagt, noch ganz am Anfang von C# und bin mir über den Aufbau eines Windows-Programmes noch ziemlich unsicher.
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: Di 17.03.09 10:32 
user profile icondidiwerdau hat folgendes geschrieben Zum zitierten Posting springen:
Ist die Vorgehensweise so eigentlich in Ordnung oder sollte man so ein Programm anders strukturieren?

Mach es lieber nicht so. Eine aufgerufene Klasse, also auch ein Formular, sollte möglichst nichts über den Aufrufer wissen, vor allem keine Einzelheiten über die Controls (die sind bewusst als private deklariert). Die Kommunikation findet grundsätzlich über eine "Schnittstelle" statt (damit ist nicht der Begriff interface von C# gemeint), nämlich über fest definierte Eigenschaften. Wenn Maßnahmen von einem Formular ausgelöst und im anderen Formular ausgeführt werden sollen, werden dafür Delegates verwendet und übergeben.

Das Thema wird immer wieder besprochen. Benutze die Suche z.B. nach "Kommunikation Formulare" u.ä.

Gruß Jürgen
didiwerdau Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67

Win 2000
C# 2008 Express Edition
BeitragVerfasst: Di 17.03.09 16:02 
oh, da muß ich mich erstmal rein lesen. Die vorgehensweise wird mir im Moment noch nicht so richtig klar.

Danke aber für den Tipp.