C# Klassenprobleme

Hallo,

Vorgeschichte:
Ich habe mit Visual C# eine kleine Windowsanwendung erstellt.
Die Windows-Form wird durch die Klasse Form1 definiert.
Sie enthält unter anderem die public Methode write() um Text in einer Textbox auszugeben.

Zusätzlich habe ich eine weitere Klasse im selben Namespace erstellt,
welche bei Bedarf beliebig oft instanziert werden soll.
Diese Objekte sollen dann, mit Hilfe der write() Methode diverse Meldungen auf der Form ausgeben.

Soweit so gut, dachte ich mir.
Solang die Methode Public ist sollte ich ja problemlos darauf zugreifen können.
Wenn ich aber nun im Code der anderen Klasse auf Form1.write() zugreifen möchte erhalte ich die Fehlermeldung:

Code:
Für das nicht statische Feld, die Methode oder die Eigenschaft "WindowsFormsApplication1.Form1.write(string)" ist ein Objektverweis erforderlich.

Ist Form1. kein Objektverweis? Oder heißt das Form-Objekt anders als seine Klasse, wenn ja: wie?

PS: erstellt wird sie mit Application.Run(new Form1());

Gruß
 
Hallo,
woher kommt eigentlich die Unart, dann einige lieber ihren Programmcode beschreiben, statt diesen zu posten.
Durch deinen Post muss man sich mühselig durchlesen um halbwegs nachzuvollziehen, wie dein Code aufgebaut ist.
Würdest du den Code posten, sähe man sofort, wie deine Klasse strukturiert ist und könnte dir auf dem ersten Blick weiterhelfen.


Zu deiner Fehlermeldung:
Form1 ist dein Formular, dies ist weiterhin eine Klasse, vom dem du beliebig viele Objekte erzeugen kannst und entsprechend viele Formulare/Fenster auf dem Monitor bekommst.

Um nun auf _das_ Form1 zuzugreifen, also auf das Form1 welches beim Start (main Methode) initialisiert wird, musst du das Objekt in einer static Variablen hinterlegen.

Möglich wäre auch das Singleton-Pattern für Form1, je nach Anwendungsbedarf. Empfehlenswert wäre es, wenn es pro Anwendung nur 1 Form1 geben würde.
 
Original von Elderan
woher kommt eigentlich die Unart, dann einige lieber ihren Programmcode

Nunja ich halt es für sinnvoller das Wesentliche zu umreißen, als 300 Zeilen Code zu posten.
Eigentlich hätte ich das Problem auch in einem Satz erklären können, aber irgendwie neige ich dazu es auszubreiten :)

edit: Danke, jetz gehts ;-)
 
Hallo,
du solltest ja auch nicht den gesamten Code posten, sondern nur das wesentliche.

Sieht in etwa so aus:
Code:
//andere class
public class andereClass {
 //...
  public void methode() {
        Form1.write(); //Hier der Fehler
  }
}

//Form1 
public class Form1 {
  //...
   public void nochneMethode() {
      //erstelle ganze viele andereClass
     andereClass obj = new andereClass();
     obj.methode();
   }

  public void write() {
   //Meine Methode
  }
}
 
Solange du die Klasse Form1 nicht in deiner zweiten Klasse instanzierst, kannst du ja nicht auf die Objektmethode write zugreifen.
Wie Elderan schon sagte sollte man jedoch nur 1 Form pro Application instanzieren.
Ist zwar ne unschöne Lösung aber du könntest deine Objektmethode write zu einer Klassenmethode umschreiben.
Danach ist es dir erlaubt in deiner neuen Klasse per Punktoperator die Methode aufzurufen und einen beliebigen String zu übergeben.

mfg

//EDIT
Hmm zu spät
Könntest du bitte deinen Lösungsweg posten ;)
 
Ich habe es folgendermaßen gemacht:

Von Visual Studio generierter Code:
Code:
static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

Meine Änderung:
Code:
static class Program
    {
        public static Form1 frm;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(frm = new Form1());
        }
    }

Dann kann ich aus einer anderen Klasse mit Program.frm.methode() darauf zugreifen.
 
Hallo,
Mögliche Lösungen, die etwas schöner sind:
1:
Code:
//andere class
public class andereClass {
 //...
  public void methode(Form1 form) {
        form.write(); //Hier _war_ der Fehler
  }
}

//Form1 
public class Form1 {
  //...
   public void nochneMethode() {
      //erstelle ganze viele andereClass
     andereClass obj = new andereClass();
     obj.methode(this);
   }

  public void write() {
   //Meine Methode
  }
}

2:
Code:
//andere class
public class andereClass {
 //...
  public void methode() {
        Form1.form1.write();
  }
}

//Form1 
public class Form1 {
   public static Form1 form1;

   public Form1() {
     form1 = this;  
 }

  //...
   public void nochneMethode() {
      //erstelle ganze viele andereClass
     andereClass obj = new andereClass();
     obj.methode();
   }

  public void write() {
   //Meine Methode
  }
}


Oder sonst wie bereits gesagt Singleton (ein Pattern das man sich unbedingt angucken sollte).

Was man genau nimmt, hängt von 'andereClass' ab.
Aber eine untrennliche Verquickung von zwei Klassen ist meistens nicht so schön und nicht unbedingt Ziel der objektorientierten Programmierung (Wiederverwendung von Code).
 
Zurück
Oben