hallo leute. bin grad dran, die elementaren sachen einer windows applikation zum checken. möchte jetzt ein kleines snake programmieren, und dazu ein panel beim instanzieren als parameter der klasse Snake übergeben.
Snake s = new Snake(this.panel1);
die klasse Snake schaut so aus:
namespace Snake
{
public class Snake
{
public Snake(System.Windows.Forms.Panel pan1)
{
this.pan = pan1;
}
}
}
compiler bringt folgende fehlermeldung:
error CS0236: A field initializer cannot reference the nonstatic field, method, or property ‘panel1’
herausgefunden habe ich, dass dieser fehler besagt, dass die variable nicht initialisiert ist zum zeitpunkt der instanzierung. aber wie mach ich das bei einem panel?
TIA, mfg, malcolm
Wo wir sind herrscht Chaos. Aber wir können ja nicht überall sein...
kleine richtigstellung: wenn ich das " this." beim instanzieren weglasse, kommt obige fehlermeldung. mit "this.": CS0027: keyword is not available in current context.
Wo wir sind herrscht Chaos. Aber wir können ja nicht überall sein...
Hi Malcolm,
Zeig mal den Code um die obere Code-Zeile. Man sieht gar nicht wo das aufgerufen wird. Wahrscheinlich in der Main-Methode oder? Und die befindet sich in der Snake-Klasse?
Aus statischen Methoden kann man ohne Instanz nicht auf Instanz-Variablen zugreifen. "this" bezeichnet die aktuelle Instanz, in einer statischen Methode gibt es keine Instanz.
public class Snake : Form {
public Panel panel1;
public static void Main() {
// Geht nicht, da eine Snake-Instanz
// für den Zugriff auf panel1 benötigt wird.
panel1 = new Panel();
// Das funktioniert, Zugriff erfolgt über die Snake-Instanz.
// (ist aber trotzdem Unsinn.)
Snake snake = new Snake();
snake.panel1 = new Panel();
}
}
Warum muss das Panel im Konstruktor übergeben werden? Normalerweise gehört sowas zum Innenleben einer Klasse und wird nicht nach außen gegeben.
public class Snake : Form {
private Panel panel1;
public Snake() {
this.panel1 = new Panel();
}
public static void Main() {
// Snake erzeugen, panel1 wird im Konstruktor erzeugt.
Snake snake = new Snake();
}
}
Gruss
Pulpapex
Wahrscheinlich sieht der Code so aus:
public class Irgendwas : Form {
Panel panel1;
Snake s = new Snake(this.panel1);
//...
}
Das heißt, du initialisierst die Variable s direkt bei der Deklaration. Dabei darfst du aber nicht auf andere Instanzvariablen zugreifen (hier panel1). Wenn du das möchtest, musst du die Initialisierung in den Konstruktor verschieben.
public class Irgendwas : Form {
Panel panel1;
Snake s;
public Irgendwas() {
InitializeComponent();
s = new Snake(this.panel1);
}
//...
}
MfG VizOne
P.S.: Pulpaplex Aussagen darüber, dass man das Panel aber eigentlich nicht nach außen weitergeben sollte, stimme ich vollkommen zu!
ahhh.. das ergibt sinn. vielen dank, scheint zum funktionieren
Wo wir sind herrscht Chaos. Aber wir können ja nicht überall sein...
Hallo malcolm,
ich vermute, die Zeile
Snake s = new Snake (this.panel1);
steht in eine Static-Methode (oder direkt in der Klasse) und von dort hast zu keinen Zugriff auf die Instanzvariable panel1, weil die ja immer zu einem bestimmten Objekt gehört.
Wenn du die Zeile z.B. in den (Objekt-)Konstruktor deines Forms schreibst, sollte es gehen.
HTH
herbivore
PS: Cool, da haben sich ja drei gleichbedeutende Antworten überschnitten. Leider bin ich nur dritter, schüfts.