Unzulässiger Aufruf einer nicht statischen Memberfunktion???
-
Na da wäre das Problem doch schon gefunden.
Bitte mal im Buch Klassen ,Objekte und Instanzen ansehen. Kurz:
Variablenfenster ist der Name der Klasse. Über die Klasse kannst Du nur statische Methoden und Eigenschaften verwenden. Show ist aber an eine Instanz gebunden - Du musst also erst einmal eine Instanz anlegen:
Variablenfenster ^dlg = gcnew Variablenfenster; dlg->Show();
-
ok Danke,
ich habe aber 2 Funktionen die das Fenster aufrufen...
private: System::Void stopbutton_Click(System::Object^ sender, System::EventArgs^ e) { weiter = false; MessageBox::Show("Stop!"); //x fenster_var->Show(); //fenster_var hier (noch) nicht bekannt } private: System::Void Zeichenfenster_Shown(System::Object^ sender, System::EventArgs^ e) { //Variablenfenster öffnen Variablenfenster^ fenster_var = gcnew Variablenfenster; fenster_var->ShowDialog(); }
Wie bzw. WO kann ich das fenster_var definieren, sodass beide Funktionen dasselbe fenster_var kennen?
Wenn ich jetzt bei der ersten Funktion (beim x) nochVariablenfenster^ fenster_var = gcnew Variablenfenster;
einfüge, kommt zwar ein neues Fenster, aber meine Variablen sind gelöscht...
Kann ich fenster_var irgendwie global verfügbar machen?
-
Mach doch einfach nen Klassenmember in der aufrufenden Form und verwende diese ^^
-
Ja kannst Du, gleich unter dem Konstruktor
public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } //Eigener Code VariablenFenster^ VariWindows
-
ok hab ich Programm lässt sich damit kompilieren und starten, aber bricht sofort nach dem start ab.
Fehlermeldung:
"Eine nicht behandelte Ausnahme des Typs "System.ArgumentException" ist in System.Windows.Forms.dll aufgetreten.
Zusätzliche Informationen: Das Formular showDialog hat versucht, ein ungültiges Formular als Besitzer festzulegen. Formulare können nicht sich selbst oder ihre Besitzer besitzen."
-
Und was ist da nun unklar ?
-
ähm... ALLES?
wieso bricht er jetzt schon wieder ab? Ich mein ich habs ganz genau so wie Doug_HH gesagt hat (nur noch ein ; dahinter ^^)
und wieso besitzt das Formular sich selbst?
-
Du müsstest schon mal vernünftige Informationen Posten. Die Ausnahme sagt Dir an sich alles was Du wissen musst. Wenn Du damit nicht klar kommst, zeigt die Codezeile, die diese Ausnahme auslöst.
Kristallkugel und Ratespiele bringen Dich nicht weiter. Du kannst auch gerne erst mal ein wenig über den Fehlertext nachdenken und gezielt fragen. Das bringt Dich beim Programmieren wirklich weiter.
-
vielleicht habt ihr es noch nicht gemerkt... aber das versuche ich diesen ganzen threat schon!
was meinst du was ich schon alles ausprobiert hab, ich renn doch nicht gleich ins Forum wenns nicht gleich klappt. Aber wenn es dann ewig nicht klappt, kann man sich schon mal nach Hilfe umschaun.
Meine 2 probs vom anfang des Theats haben immer noch kein ergebnis
Codezeile:
public: Zeichenfenster(void) { InitializeComponent(); } //Variablenfenster global Variablenfenster^ fenster_var;
und ich denke es ist die nach //Variablenfenster global und was soll daran nicht stimmen??
-
Naja, wenn man sich absichtlich doof stellt wird das auch nix.
Wenn Du die Software debuggst und eine Exception fliegt, bleibt der Compiler exakt an der Stelle, die den Fehler verursacht hat, stehen. (Zumal es nicht wirklich viele Zeilen geben dürfte, in den Dein Dialog mit ShowDialog angezeigt wird).
Und genau diese Zeile solltest Du Posten wenn Du mit der Meldung der Exception nichts anfangen kannst. -> Wenn Du damit nicht klar kommst, zeigt die Codezeile, die diese Ausnahme auslöst.
Denkst Du hier hat jemand eine Kristallkugel und kann sehen was Du da vor Dir her codest ?
-
Hi </Exit>,
heißt die Form die Du aufrufen möchtest, Variablenfenster oder Form2?
Du musst den Namen der Form angeben.
Wenn Du eine Form "Variablenfenster" an irgendeiner Stelle in der Klasse neu vereinbarst, und dann eine neue Form mit gcnew dynamisch erstellst und aufrufst.Also so…
VariablenFenster^ VariWindow = gcnew VariablenFenster; VariWindow->ShowDialog();
Man kann auch die selbe Form nochmals dynamisch erstellen, aber es ist nicht die gleiche Form wie oben.
Es handelt sich aber dabei um die Form2.VariablenFenster^ FensterZwei = gcnew VariablenFenster; FensterZwei->ShowDialog();
Also musst Du die Form Global vereinbaren.
Du kannst die Form aber ruhig „private“ vereinbaren.
Hat was mit der Datenkapselung zutun.Jetzt gebe ich Dir den Code bis zum Konstruktor.
#pragma once #include "VariablenFenster.h" namespace Fenster { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Zusammenfassung für Form1 /// /// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch /// die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern, /// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt. /// Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen /// arbeiten, die diesem Formular zugewiesen sind. /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // } private: System::Windows::Forms::Timer^ timer1; private: System::Windows::Forms::Timer^ timer2; VariablenFenster^ VariWindow;
Gruß Doug_HH
-
thx, jetzt hab ich verstanden welche Zeile gemeint is... (ja mit showdialog gibt's nur eine)
aber die hilft (mir zumindest) nicht wirklich weiter:
private: System::Void Zeichenfenster_Shown(System::Object^ sender, System::EventArgs^ e) { //Variablenfenster öffnen fenster_var->ShowDialog(); }
Die Zeile aus der Fehlermeldung ("Formulare können nicht sich selbst oder ihre Besitzer besitzen") verstehe ich aber immer noch nicht. Das Formular öffnet sich ja nur, wieso besitzt es sich jetzt? Und wie umgehe ich sowas?
@Doug_HH:
also ich muss das Variablenfenster einmal öffnen damit es offen ist...
Wenn der User auf Start klickt verschwindet es, damit man im Hintergrund die Zeichnung sieht. Wenn das beendet ist, soll das Variablenfenster wieder (mit Werten!) erscheinen...
Soviel zum Hintergrund. Ich habe mir gedacht, ich verstecke das Fenster nur, so sollten die Werte erhalten bleiben, danach wird es (irgendwann) wieder sichtbar gemacht und hat immer noch die selben Werte drin...ich brauche jetzt die Variable des Variablenfensters (fenster_var) zweimal bzw. dreimal:
- um das Fenster am Anfang zu öffnen (ausgehend vom Zeichenfenster)
- um das Fenster zu verstecken (ausgehend vom Variablenfenster selbst)
- um es wieder sichtbar zu machen (ausgehend vom Zeichenfenster)das in der Mitte ist nicht das Problem... aber für die anderen brauche ich DAS SELBE Fenster und nicht wieder das Fenster neu erstellt (sonst sind ja keine Werte mehr drin)
(Form1/Form2 habe ich übrigens umbenannt in Zeichenfenster und Variablenfenster, die gibt's also nicht mehr)
-
Hier saug Dir das mal runter.
Damit verstehst Du das bestimmt.
Wenn nicht, kriegen wir das schon hin.http://www.rb-softarticle.com/Fenster.zip
Gruß Doug_HH
-
WOW, thx big THX.... DANKE DANKE!
na endlich, also was nur gefehlt hat war:
//Variablenfenster öffnen fenster_var = gcnew Variablenfenster; fenster_var->ShowDialog();
Zeile zwei habe ich nicht geschrieben, weil ich dachte, das wäre mit dem globalen Variablenfenster schon geschehen, also mit:
//Variablenfenster global Variablenfenster^ fenster_var;
Tja, so kann man aneinander vorbeireden!!! Nochmal danke an alle die geholfen haben und Danke für eure Geduld mit mir! Thx!
Es funktioniert jetzt auch mit den eingegebenen Werten. Wohoooooo!