none
"System.NullReferenceException RRS feed

  • Frage

  •  

    Moin, ich habe hier ein C++/CLI Projekt, mit Windows-Forms

    Damit ich nun von der main() Klasse der Anwendung.cpp auf die Form1.h zugreifen kann und dort Labels, Textboxen usw. editieren, habe ich dieses hier eingefügt


     

    Form1 ^frm;
    Form1 ^mainform = dynamic_cast <Form1 ^> (frm);
    

     

     

    Darunter ein Testbefehl, um zu probieren ob er nun den Text des Labels ändern kann. Beim eingeben des Befehls, zeigt mir der IntelliSense label1 und so weiter an.

     

     

    mainform->label1->Text = "Aller Anfang ist Schwer...";

     

     

    Wenn ich das Programm aber nun im Debug-Modus starte, passiert erstmal nichts... das Label was eigentlich geändert werden sollte bleibt so wie es ist, nur beim schließen des Programms folgenden Fehler aus

     

     

    Eine nicht behandelte Ausnahme des Typs "System.NullReferenceException" ist in Echolot_GUI.exe aufgetreten.
    
    Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

     

     

     

    Mir ist klar, das ich das Label auch in Form1.h ändern könnte, aber ich will es so machen.

     

    Hier nochmal die ganze Anwendung.cpp:

    // Anwendung.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    #include "Form1.h"
    
    using namespace Anwendung;
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	
    // Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 
    
    // Hauptfenster erstellen und ausführen
    Application::Run(gcnew Form1());
    	
    
    //Option zum verarbeiten von Form1, vortlaufend mainform genannt.
    Form1 ^frm;
    Form1 ^mainform = dynamic_cast <Form1 ^> (frm);
    
    
    mainform->label1->Text = "Aller Anfang ist Schwer..."
    
    
    
    
    return 0;
    
    }

     

     

    Mit freundlichen Grüßen und in der Hoffnung das ihr mir helfen könnt:

    Run-time

    Sonntag, 28. März 2010 18:20

Antworten

  • Hi Run-Time!

    > ist C# nun ganz anders als C++? Weil dann mache ich weiter CLI, dort
    > kann man nämlich noch notfalls C++ Code dazwischen basteln wovon ich
    > dann in C# nicht ausgehe.

    Ich rate Dir drigend davon ab C++/CLI und normaler C/C++ zu mischen,
    wenn Du nicht 100000%ig genau weisst, warum Du das tust.

    Mach lieber C#. Es ist für einen C++-Entwickler eingetlich relativ
    leicht zu lernen.

    Jochen Kalmbach (MVP VC++)
    Dienstag, 30. März 2010 11:03

Alle Antworten

  • Hallo Run-Time!

    > Form1 ^frm;
    > Form1 ^mainform = dynamic_cast <Form1 ^> (frm);

    Und wer setzt "frm"?


    > Application::Run(gcnew Form1());

    In dieser Zeile läuft Dein Programm. Und diese Zeile kehrt nicht zurück,
    so lange der Dialog offen ist.

    > //Option zum verarbeiten von Form1, vortlaufend mainform genannt.
    > Form1 ^frm;
    > Form1 ^mainform = dynamic_cast <Form1 ^> (frm);
    > mainform->label1->Text = "Aller Anfang ist Schwer..."

    mainform ist "null", deshalb gibt es beim beenden der Fehler.

    > Mit freundlichen Grüßen und in der Hoffnung das ihr mir helfen könnt:

    Ich persönlich Rate Dir, Dich nicht unglücklich zu machen.
    Lies bitte dies hier:
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/

    Jochen Kalmbach (MVP VC++)
    Sonntag, 28. März 2010 18:48
  • Das habe ich schon gelesen, zweimal sogar und habe das MFC ausprobiert und bin zu dem Schluss gekommen, dass es für mich irgendwie viel schwieriger zu verstehen ist als dieses CLI hier, mit den C++ Konsolenanwendungen habe ich mich schon beschäftigt und nun wollte ich gerne das CLI lernen.

     

     

    Achso, du meinst, er bleibt bei der Zeile hängen?    Application::Run(gcnew Form1());

    Das heißt ich muss das in die Form1.h schreiben, in eine extra Klasse oder Funktion?

    Sonntag, 28. März 2010 19:42
  • Hallo Run-Time!

    > Das heißt ich muss das in die Form1.h schreiben, in eine extra Klasse
    > oder Funktion?

    WAS willst Du denn WANN ausführen?

    Mein Tipp: Mach bitte C#, das erspart uns und Dir jede Menge Frust ;)

    Jochen Kalmbach (MVP VC++)
    Sonntag, 28. März 2010 20:13
  • mein Ziel eigentliches Ziel ist es eine C++ Konsolenanwendung in ein Fenster zu bekommen, da will ich die sachen die in einer Konsole ausgegeben werden, in eine Text-, bzw. RichTextBox schreiben, also z.B statt cout << "irgendwas" << endl; dann TextBox->Text += "irgendwas";

     

    Das ist nun ein recht komplexes Programm, was so unter CLI auch läuft, habe es mal einfach so als CLI Konsolenanwendung kompiliert.

    Nun auch noch C# zu lernen, was wahrscheinlich besser ist wie du schon sagtest und dann auch noch das Programm zu übersetzen? :/

    Dann probiere ich lieber C++/CLI weiter, oder ist das ganz einfach? Das alles abzuändern?

    Sonntag, 28. März 2010 20:43
  • Hallo Run-Time!

    Du hast meine Frage nicht ganz beantwortet...

    Was willst Du *WANN* ausführen...

    Jochen Kalmbach (MVP VC++)
    Montag, 29. März 2010 05:24
  • Hallo, nun habe ich verstanden was du meinst, ein Teil soll bei dem öffnen der Form geladen werden, das kommt also in Die Form1_Load, den anderen Teil, mache ich wenn ich auf Start drücke, also in b_start_Click

     

    Nun mache ich das erstmal so, den auslagern kann ich die Dinge hinterher immernoch.

     

    EDIT: Ein Prob habe ich noch, nämlich muss ich eine Datei öffnen, habe dieses hier ausgekramt:

     

    System::Diagnostic::Process::Start("pfad"); 

     

    voher hatte ich das hier stehen:

     

    pFile = fopen(filepath, "r"); 

     

    Das ist jedoch nicht mehr so gut zu gebrauchen, ich müsste umkonvertieren und so weiter, deshalb wollte ich nun fragen wir ich mit dem Process::Start daoben umgehe, ich brauche es hierfür:

     

      if ( feof( pFile ) )  // Wenn im Ende des Files angekommen...
            {
                fseek( pFile, 0, SEEK_SET ); // ..springe zum Anfang der Datei
    
    }
    
     ip[ 0 ] = '\0'; // '\0' == Ende der Zeichenkette
    
            fgets( ip, 64, pFile ); // Lies 64 Zeichen vom Stream in ip
    
            ip[ 63 ] = '\0'; // Ende der Zeichenkette...
    
            if ( ip[ strlen( ip ) - 1 ] == '\n' )  // Selbsterklärend, strlen gibt die Länge der Zeichenkette aus
                ip[ strlen( ip ) - 1 ] = '\0';

     

    Diesen Code habe ich mir mal aus alten Funktionen zusammengebastelt, ich habe das Gefühl, das Process::Start mir nicht hilft, weil es Dateien nu öffnet wie z.B.

     

    Kann einer mir verraten welche Funktion ich zum öffnen verwenden muss? Sodass das oben damit auch funktioniert?

       // Start Internet Explorer. Defaults to the home page.
    
    Process::Start( "IExplore.exe" );

    Quelle: http://msdn.microsoft.com/de-de/library/53ezey2s%28VS.80%29.aspx

    Montag, 29. März 2010 11:44
  • Process::Start öffnet keine Datei. Es startet ein Programm.

    fopen ist CRT Code. Du bastelst hier aber mit C++/CLI herum.
    Lies noch mal:
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/

    Wenn Du ene Datei mit C++/CLI lesen willst solltest Du eher Sie System::IO::File Klasse benutzen.
    http://msdn.microsoft.com/en-us/library/system.io.file.aspx


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Dienstag, 30. März 2010 07:15
    Moderator
  • Hi, habe das Problem nun schon mit dem Streamreader der System::IO Klassse lösen können

     

    ist C# nun ganz anders als C++? Weil dann mache ich weiter CLI, dort kann man nämlich noch notfalls C++ Code dazwischen basteln wovon ich dann in C# nicht ausgehe.

    Dienstag, 30. März 2010 10:20
  • Hi Run-Time!

    > ist C# nun ganz anders als C++? Weil dann mache ich weiter CLI, dort
    > kann man nämlich noch notfalls C++ Code dazwischen basteln wovon ich
    > dann in C# nicht ausgehe.

    Ich rate Dir drigend davon ab C++/CLI und normaler C/C++ zu mischen,
    wenn Du nicht 100000%ig genau weisst, warum Du das tust.

    Mach lieber C#. Es ist für einen C++-Entwickler eingetlich relativ
    leicht zu lernen.

    Jochen Kalmbach (MVP VC++)
    Dienstag, 30. März 2010 11:03
  • Für das Programm hier, habe ich insgesammt 5 Funktionen, mit je ca. 90 Zeilen, diese alle  in C# umzuschreiben ist verdammt mühseelig, wenn ich bei CLI die Sachen nur anpassen muss und den C++ Code verwenden kann.

     

    EDIT:

    Habe meine Meinung geändert, ich probiere es, habe ja VS2008 Pro, daher kann ich es nebenbei in die Projektmappe machen :)

    Dienstag, 30. März 2010 12:05