Kann die Variable nicht ansprechen!

Topia

Mitglied
Hallo, arbeite erst seit ein paar Wochen an CSharp udn ich komme an einer Stelle nicht weiter.
Habe irg ein Problem damit Variablem aus andere OBjekten anzusprechen sprich ein Button soll z.b wie (unten ) graphPath2.AddEllipse(5, 5, 200, 100); koordinaten ändern.


Code:
 private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            Graphics grfx2 = e.Graphics;
            grfx2.Clear(System.Drawing.SystemColors.Control);


            Pen pen2 = new Pen(Color.Red);
            grfx2.DrawLine(pen2, 10, 5, 6, 5);



            GraphicsPath graphPath2 = new GraphicsPath();
            graphPath2.AddEllipse(5, 5, 200, 100);

            SolidBrush brush22 = new SolidBrush(Color.Orange);

            grfx2.FillEllipse(brush22, 5, 5, 200, 100);

            //Draw graphics path to screen.
            e.Graphics.DrawPath(pen2, graphPath2);

        }
        
        private void button1_Click(object sender, EventArgs e)
        {
             //hier wollte ich gerne die x,y coordinaten ändern des ellipse
            
        }


Mein hauptsächliches Problem ist wieso zeigt er die Variable nicht an wenn ich z.b in dem Button graphPath2 eingebe bei anderen Objekten wie ein andere Button dort zeigt er es an :mad::mad: Ich hofe ihr versteht was ich meine :) Das Problem habe ich oft bestimmt ist es ganz simpel zu erklären nur komm ich irg nicht dahinter. Wie sieht das aus von woher kann man fremde Variablen ansprechen


Sry der Thread befindet sich auch in sonstige Sprachen hatte C# erst nicht gefunden.
 
Ja das ist einfach zu erklären: graphPath2 und grfx2 usw. sind lokale Variablen, das heißt, du kannst sie nur in der Methode ansprechen, in der du sie deklariert hast. Probiers mal so:

Code:
Graphics grfx2;
GraphicsPath graphPath2;

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            grfx2 = e.Graphics;
            grfx2.Clear(System.Drawing.SystemColors.Control);


            Pen pen2 = new Pen(Color.Red);
            grfx2.DrawLine(pen2, 10, 5, 6, 5);



            graphPath2 = new GraphicsPath();
            graphPath2.AddEllipse(5, 5, 200, 100);

            SolidBrush brush22 = new SolidBrush(Color.Orange);

            grfx2.FillEllipse(brush22, 5, 5, 200, 100);

            //Draw graphics path to screen.
            e.Graphics.DrawPath(pen2, graphPath2);

        }
        
        private void button1_Click(object sender, EventArgs e)
        {
             //hier wollte ich gerne die x,y coordinaten ändern des ellipse
            
        }

Ob der Code jetzt das tut, was er tun soll, weiß ich nicht, aber zumindest kannst du jetzt die Variablen ansprechen.
 
Danke, ich konnte jetzt die Variablen ansprechen nur dann kam die Fehlermeldung wenn ich auf den Button klicke

"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
Das Programm sagt ich soll ;

Erstellen Sie mit dem New-Schlüsselwort eine Instanz.
Sie haben möglicherweise versucht, ein Objekt zu verwenden, ohne eine Instanz des Objekts bereitzustellen. Ändern Sie zum Beispiel Dim CustomerTable As DataTable in Dim CustomerTable As New DataTable.

Fügen Sie einen Codeblock hinzu, der den Code auf NULL-Verweise prüft.
Prüfen Sie programmgesteuert, ob eine Funktion NULL (in Visual Basic: Nothing ) anstelle einer Objektinstanz zurückgibt.

Visual Basic-Benutzer finden weitere Informationen unter Nothing (Visual Basic).

C#-Benutzer finden weitere Informationen unter null (C#-Referenz).

Fangen Sie NullReferenceException explizit in einer Try...Catch....Finally-Anweisung ab.
Eine Try…Catch…Finally-Anweisung kann den Code auf bestimmte Ausnahmetypen prüfen, angefangen von sehr spezifischen bis hin zu sehr allgemeinen Ausnahmen.

Visual Basic-Benutzer finden weitere Informationen unter Try...Catch...Finally-Anweisung (Visual Basic).

C#-Benutzer finden weitere Informationen unter try-catch-finally (C#-Referenz).


Aber ich weiss nicht wie ich das umsetzen soll

Ich wiess woran das liegt, die Variablen die ich darüber eingefügt habe wie du gesagt hast das sind neue Variablen die sich aber in keiner weise auf den code im Panel1 beziehen wie kann ich das ändern Da steht nämlich GraphicsPath graphPath2; wird nie verwendet

Code:
   Graphics grfx2;
        GraphicsPath graphPath2;
        


        private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            
            
            

            Graphics grfx2 = e.Graphics;
            grfx2.Clear(System.Drawing.SystemColors.Control);


            Pen pen2 = new Pen(Color.Red);
            grfx2.DrawLine(pen2, 10, 5, 6, 5);



            GraphicsPath graphPath2 = new GraphicsPath();
            graphPath2.AddEllipse(5, 5, 200, 100);

            SolidBrush brush22 = new SolidBrush(Color.Orange);

            grfx2.FillEllipse(brush22, 5, 5, 200, 100);

            //Draw graphics path to screen.
            e.Graphics.DrawPath(pen2, graphPath2);

            

        }

        private void button1_Click(object sender, EventArgs e)
        {
           
            graphPath2.AddEllipse(10, 20, 200, 100);
            
            

        }


graphPath sind lokale Variablen gibt es auch Globale
 
Zuletzt bearbeitet:
Hallo Topia

Du musst die beiden Variablen Graphics grfx2 und GraphicsPath graphPath2 irgendwo instanzieren.
Z.B. ersetzte:


Code:
Graphics grfx2;
GraphicsPath graphPath2;

mit

Code:
Graphics grfx2 = new Graphics();
GraphicsPath graphPath2 = new GraphicsPath();


Globale Variablen gibt es in CSharp nicht, zumindest wäre mir das neu.

Grüsse,

Tecla
 
Ich habe sie doch schon intanziert ium eigentlichen hauptprogramm. Das kann doch nicht sos chwer sein ich möchte einfach nur auf die grfx2.FillEllipse(brush22, 5, 5, 200, 100);
zugreifen können um die werte zu ändenr mit einem Button_click
 
anderer vorschlag ausgehend von deinem ersten Code:
Code:
int elX=5;
int elY=5;
int elWidth=200;
int elHeight=100;

private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
        ...
        grfx2.FillEllipse(brush22, elX, elY, elWidth, elHeight);
        ...
}

private void button1_Click(object sender, EventArgs e)
{
        elX=10;
        elY=20;
        panel1.Invalidate(); //bescheid geben zum neuzeichnen
}
 
Danke Spyke!! Hat geklappt nur mal jetzt so en generelle Frage das kann doch keine Lösung für alles sein mit welchen Mitteln kann man den variablen etc .. mit andere Komunizieren ich glaub da gabs noch so ne methode mit der Parameterübergabe
 
Es gibt verschiedene Wege.

Du könntest dir auch z.B. eine eigene Klasse anlegen die das zeichnen übernimmt und der du nur das Graphics Object aus dem Paint Ereignis übergibst.
Und über das Button Ereignis änderst du die Eigenschaft wieder ähnlichen meinem Vorschlag.

Oder du legst dir direkt nen Ellipse Objekt (Klasse/Struct) an mit dem du arbeitest und dessen Werte bekommt das Graphics Objekt.

...
 
Es muss doch eien möglichkeit geben das andere objekte button1.....button2, klassen miteinander kommunuizieren können also sprich deren variablen benutzen. Wie gehts das kann mir das irgend jemand erklären :confused::confused:

und das hätt ich noch ne kleine frage wenn ich so ne klasse erezuge
dann sagt er mir es gibt bereits einen einstiegspunkt Void main ()

Code:
  public class GetIPAddress
        {
            private static void Main()
            {
                // Hostnamen und IP-Adresse abrufen.
                string hostName = Dns.GetHostName();

                // Die erste passende IP-Adresse abrufen.
                string ipAddress = Dns.GetHostByName(hostName).AddressList[0].ToString();


                
                
            }





        }

Das Beispiel mit der IP Abfrage ista uch wieder sowas jetzt möchte ich mit einem Button den string auf ein label schreiben nur wenn ich vom Button den string ipAdress nehmen möchte ""nicht im Kontext vorhanden"..
 
Zuletzt bearbeitet:
Zurück