Laden...

Panel als Parameter

Erstellt von malcolm vor 19 Jahren Letzter Beitrag vor 19 Jahren 2.579 Views
M
malcolm Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren
Panel als Parameter

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...

M
malcolm Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren

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...

P
939 Beiträge seit 2003
vor 19 Jahren

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

1.373 Beiträge seit 2004
vor 19 Jahren

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!

M
malcolm Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren
ahhhh...

ahhh.. das ergibt sinn. vielen dank, scheint zum funktionieren

Wo wir sind herrscht Chaos. Aber wir können ja nicht überall sein...

49.485 Beiträge seit 2005
vor 19 Jahren

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.