Benutzer mit den meisten Antworten
"System.NullReferenceException

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
- Verschoben Martin RichterModerator Freitag, 4. Juni 2010 15:50 (aus:Visual C++)
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++)- Als Antwort markiert Martin RichterModerator Mittwoch, 23. Juni 2010 11:13
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++)- Bearbeitet Robert BreitenhoferModerator Montag, 29. März 2010 10:08 Hyperlink als Hyperlink
-
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?
-
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?
-
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
-
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 -
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.
-
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++)- Als Antwort markiert Martin RichterModerator Mittwoch, 23. Juni 2010 11:13
-
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 :)