Problem: Instanz ansprechen



  • Einige von euch werden meinen vorigen Thread bereits verfolgt haben. Mein Problem liegt darin, dass ich nicht wirklich verstehe, wie ich mit Instanzen umzugehen habe.

    Hier noch einmal einige Ausschnitte:

    Form1.h

    #pragma once
    
    #include "eigeneFunktionen.h"
    
    namespace IPSender 
    {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    		}
    
    	private:
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    /************************************************************************/
    
    	public:
    
    		   void Form1::textbox1ändern (String ^text) 
    			{
    			Form1::textBox1->AppendText (text);
    			return;
    			}
    
    		   void Form1::textbox2ändern (String ^text)
    			{
    			textBox2->AppendText (text);
    			return;
    			}
    ...
    ...
    	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) /* <-- Ab hier IP Senden */
    			 {				  
    				eigeneFunktionen^ funkinstanz = gcnew eigeneFunktionen();
    				funkinstanz->eigeneFunktionen::start();
    				return;
    			 }
    

    eigeneFunktionen.h

    /*** Eigene Funktionen Header */
    
    #pragma once
    
    namespace IPSender
    {
    	public ref class eigeneFunktionen
    	{
    
    		public:	 
    
    			 bool lokaleIPfinden (void);
    			 void externeIPfinden(char *);
    			 void ping (char*);
    			 void *sound (void*);
    			 char *umwandeln(System::String^ str);
    			 void start ();
    
    	 };	
    }
    

    eigeneFunktionen.cpp

    /*********************************************************************************/
    /***************************** eigene Funktionen *********************************/
    /*********************************************************************************/
    
    #include "stdafx.h"
    #include "eigeneFunktionen.h"
    #include "Form1.h"
    
    using namespace IPSender;
    
    void* dummy;
    int x;
    ...
    ...
    ...
    /* IP SENDER starten */
    void eigeneFunktionen::start ()
    {
    				 Form1^ form;
    
    				 form->textbox1ändern ("textbox1ändern");
    				 this->lokaleIPfinden ();
                                     ...
                                     ...
    

    Starte ich nun das erstellte CHAOS im Debug Modus, erhalte ich nach dem drücken des BUTTON1 folgenden Fehler:

    An unhandled exception of type 'System.NullReferenceException'
    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    

    ...und zwar hier (Form1.h)...

    void Form1::textbox1ändern (String ^text) 
    			{
    			Form1::textBox1->AppendText (text); <-----
    			return;
    			}
    

    Könnte mir das jemand näher erklären?



  • this->textBox1->Text += text;
    


  • Das hilft leider auch nicht.



  • Die Diagnose für dein Problem ist recht einfach, und die Tatsache, dass du es wirklich nicht sehen kannst, bestätigt deine eigene Aussage. Ich finde es jedoch toll, wie du hartnäckig dran bleibst, denn wenn du es einmal auf diese Art und Weise gelernt hast, vergisst du es bestimmt nicht mehr. Die Funktion, in welcher der Fehler auftritt, ist nicht das Problem. Es ist der Kontext, in welchem sie aufgerufen wird:

    /* IP SENDER starten */
    void eigeneFunktionen::start ()
    {
                     Form1^ form;
                     // diagnosed. Hier ist der Fehler.
                     form->textbox1ändern ("textbox1ändern");
                     this->lokaleIPfinden ();
                                     ...
                                     ...
    

    Was ist hier das Problem? Du siehst es vermutlich nicht, was auch nicht weiter erstaunt, ist doch nichts da - doch genau das ist auch das Problem. Es fehlt etwas, nämlich die Initialisierung von Form1^ form . Du deklarierst eine Referenz auf eine Form1 -Instanz, initialisierst sie aber nicht. Dein Aufruf textbox1ändern geht ins Nichts, darum die NullReferenceException . Die Lösung sieht so aus:

    /* IP SENDER starten */
    void eigeneFunktionen::start ()
    {
                     Form1^ form;
                     // fixed.
                     form = gcnew Form1;
                     form->textbox1ändern ("textbox1ändern");
                     this->lokaleIPfinden ();
                                     ...
                                     ...
    

    Ausgehend von deinen bisherigen Problemen und dem mir hier vorliegenden Code wage ich die Prognose, dass diese Form nicht angezeigt werden wird. Falls dies der Fall sein sollte, musst du sie noch über form->Show(); dazu anweisen.



  • mmh ... das kommt mir bekannt vor. Nur wollte ich die Instanz ansprechen welche - wie ich bereits gelernt habe - im Hauptprogramm erzeugt wird. Also KEINE neue Instanz von Form1 erstellen.





  • Was möchtest du mir damit sagen?



  • Hier mal ein wenig Code:

    eigeneFunktionen.h

    #pragma once
    
    namespace IPSender 
    {
    	ref class Form1;
    
    	public ref class eigeneFunktionen 
    	{ 
    	public:
    		void start (Form1^ form); 
    	};    
    }
    

    eigeneFunktionen.cpp

    #include "stdafx.h" 
    #include "eigeneFunktionen.h"
    #include "Form1.h"
    
    using namespace IPSender; 
    
    void eigeneFunktionen::start (Form1^ form) 
    { 
    	form->textbox1ändern ("textbox1ändern"); 
    }
    

    Ausschnitt aus Form1.h:

    #pragma once
    #include "eigeneFunktionen.h"
    
    namespace IPSender
    {
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    		// ...
    
    	public:
    		void Form1::textbox1ändern (String ^text) 
    		{ 
    			textBox1->AppendText (text); 
    		} 
    
    		void Form1::textbox2ändern (String ^text) 
    		{ 
    			textBox2->AppendText (text); 
    		} 
    
    	private:
    		System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
    		{
    			eigeneFunktionen^ funkinstanz = gcnew eigeneFunktionen(); 
    			funkinstanz->start(this);
    		}
    	};
    }
    

    Ev. hilft Dir das.
    Simon



  • Aha ... das klappt. Nun aber zum verstehen.

    In der Form1, was passiert da? Eine Referenz auf die Klasse Form1? Somit ist Form1 dann nicht mehr unbekannt. Das war genau das was ich einfach nicht verstanden habe an deinen vorigen Beispielen.

    Danke dir, und natürlich euch auch. 🙂



  • In der Form1, was passiert da? Eine Referenz auf die Klasse Form1? Somit ist Form1 dann nicht mehr unbekannt. Das war genau das was ich einfach nicht verstanden habe an deinen vorigen Beispielen.

    Sorry, ich verstehe deine Frage nicht.

    Poste doch den Codeausschnitt den Du nicht verstehst. Ev. schreibe fragen direkt in den Quelltext.

    Simon



  • #pragma once
    
    namespace IPSender
    {
        ref class Form1; <--------- hier???
    
        public ref class eigeneFunktionen
        {
        public:
            void start (Form1^ form);
        };    
    }
    



Anmelden zum Antworten