Autor Beitrag
exillin
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 20.10.10 18:10 
Moin, habe hier ein kleines Problem, wo ich ein bissle Hilfe bräuchte.

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

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 20.10.10 18:48 
hier mal ein paar codeschnipsel (finde leider keine codeklammern zu Darstellung hier)

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 21.10.10 10:12 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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.