Entwickler-Ecke

Basistechnologien - Objekt in Methode auf globales Objekt linken?


exillin - Mi 20.10.10 18:10
Titel: Objekt in Methode auf globales Objekt linken?
Moin, habe hier ein kleines Problem, wo ich ein bissle Hilfe bräuchte.

habe globale Variablen definiert in der public partial class Form1 : Form


C#-Quelltext
1:
2:
private vtkRenderer Renderer = null;
private vtkImageActor ImageActor = null;


weiterhin erschaffe ich in einer methode auch objekte: vtkImageActor iactor = new vtkImageActor();
Zum Ende der Methode lege ich noch das Methodenobjekt noch auf die globale Variable


C#-Quelltext
1:
this.ImageActor = iactor;                    


Soweit sogut, wenn ich jetzt aber auf "ImageActor" zugreifen möchte z.B. bei einem Buttonklick zugreifen will, kommt immer die Fehlermeldung, dass ich erst ein Objekt erzeugen muss, obwohl ich dies doch schon erzeugt habe und auf die globale Variable gelegt habe??

mfg

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Th69 - Mi 20.10.10 18:19

Kriegst du einen Compiler- oder einen Laufzeitfehler?
Und wird diese Methode denn auch vorher aufgerufen, z.B. im Konstruktor?
Ansonsten zeige mal etwas Code.


exillin - Mi 20.10.10 18:48

hier mal ein paar codeschnipsel (finde leider keine codeklammern zu Darstellung hier)


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private vtkPlane Plane = null;

.
.
.

public static void RenderImage(string Filename)
        {

            vtkPlane plane = new vtkPlane();
            plane.SetOrigin(50000);
            plane.SetNormal(100);

            //Update global variables
        
            this.Plane = plane;
       }

 private void btnRender_Click(object sender, EventArgs e)
        {
             string FileName = pictureBox1.ImageLocation;
            RenderImage(FileName);
        }

   private void tsButtonCutter_Click(object sender, EventArgs e)
        {
            string FileName = pictureBox1.ImageLocation;
            this.Plane.SetOrigin(50000);
            // Befehl zum Neurendern des Bildes
        }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Ralf Jansen - Mi 20.10.10 18:55

Die RenderImage Methode ist statisch. Heißt sie hat keinen Zugriff auf Felder die einer speziellen Instanz von Form1 gehören, wie zum Beispiel Plane. Entweder Plane wird auch statisch oder RenderImage darf nicht statisch sein. Letzteres ist wahrscheinlich richtig.

Edit: Oder RenderImage erzeugt nur ein vtkPlane und liefert diese zurück so das die Zuweisung zu Plane ausserhalb erfolgt. Dann kann RenderImage statisch bleiben und Plane eine Instanzvariable.


Yogu - Mi 20.10.10 19:04

Weiterhin musst du sicherstellen, dass der Benutzer erst dann auf tsButtonCutter klicken kann, wenn er vorher auf btnRender geklickt hat, denn sonst kann auf das Feld Plane nicht fehlerfrei zugegriffen werden, du würdest eine NullReferenceException erhalten. Um das zu verhindern, könntest du in der Methode tsButotnCutter_Click prüfen, ob Plane null ist und, wenn ja, RenderImage aufrufen.

Die C-Sharp-Code-Klammern sind <span class="inlineSyntax">{PROTECTTAG5c6a2c76193b267bd182220de9144a23}</span>. Deine Beiträge kannst du bearbeiten, indem du rechts oben auf user defined image klickst.


exillin - Do 21.10.10 09:35

wow super, jetzt klappt es! Vielen Dank für die Hilfe!
bloß wie kann ich jetzt die globalen Variablen auch in anderen Klassendatein nutzen, die ich dem Projekt hinzugefügt habe?
Liegt es daran, dass ich das ganze in public partial class Form1 : Form definiert habe? Aber woanders gehts ja auch nicht?!


mfg


Ralf Jansen - Do 21.10.10 10:12


C#-Quelltext
1:
Liegt es daran, dass ich das ganze in public partial class Form1 : Form definiert habe? Aber woanders gehts ja auch nicht?!                    


Dir geht es um das Plane Feld?

A.) Du müsstest die erst mal sichtbar machen. Jetzt ist die ja noch rein privat. Um ein privates Feld zu veröffentlichen benutzt man üblicherweise eine Property.
B.) Plane gehört jeweils zu einer bestimmten Instanz von Form1. Dort wo du auf Plane zugreifen willst muss dir also die konkrete Form1 Instanz bekannt sein.


Yogu - Do 21.10.10 18:05

Es gibt in C# keine globalen Variablen. Jedes Feld ist entweder einer Klasse (statisches Feld) oder einem Objekt (Instanzfeld, nicht statisch) zugeordnet.

Die Frage ist, wohin das Feld Plane eigentlich gehört. Ist es eine Eigenschaft eines Formulars? Dann musst du es nur öffentlich machen (oder eine Eigenschaften deklarieren). Gehört es allgemein zur Klasse Form1, solltest du das Feld statisch machen (static), sodass einfach über Form1.Plane darauf zugegriffen werden kann. Du könntest auch eine andere Klasse erstellen, die das Objekt beinhaltet, z.B. wenn es überhaupt nichts mit dem Formular zu tun hat.