Unzulässiger Aufruf einer nicht statischen Memberfunktion???



  • Hi Leute,

    ich muss ein Programm schreiben und komme nicht weiter:

    Ich habe 2 Fenster: ein Variablenfenster(mit Startbutton) und ein Ausgabefenster(mit Stopbutton)

    Im Variablenfenster sollen Werte eingegeben werden, danach werden diese eingelesen und das Variablenfenster unsichtbar gemacht. (mit Klick auf den Startbutton)
    Ich hab dafür im Mom diesen Befehl:

    Variablenfenster::Hide();
    

    Nun ist natürlich das Ausgabefenster im Vordergrund. Der User klickt irgendwann auf stop, was die (Endlos-) Schleife abbricht und danach soll das Variablenfenster (mit den vorher eingegebenen Werten!) wieder erscheinen.
    Ich wollte dafür

    Variablenfenster::Show();
    

    nutzen. (Variablenfenster.h ist als Header im Ausgabefenster eingebunden)

    Aber der Compiler meldet folgenden Fehler:

    "error C2352: 'System::Windows::Forms::Control::Show': Unzulässiger Aufruf einer nicht statischen Memberfunktion"
    😕

    Ich nutze Visual C++ 2005 Express Edition (falls ihr diese Info benötigt) und ich bin für jede Hilfe dankbar. (hab schon viel ausprobiert aber nichts hat geholfen)



  • Show() ist nicht statisch, benötigt also ein 'this'-Objekt, auf das es losgelassen werden soll (das Fenster, das du anzeigen willst).



  • Aber this ist doch das aktuelle Fenster? (in diesem Fall das Ausgabefenster)

    Variablenfenster::Show();
    

    ist im Ausgabefenster.

    Damit würde ich (mit this) doch dann wieder das Ausgabefenster aufrufen, nicht das Variablenfenster!? Ich möchte aber doch das Variablenfenster wieder sichtbar machen...

    wie kann ich das dann realisieren?



  • Was spricht hier dagegen?

    Button "Erstellen"

    private: System::Void erstellen_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				 VariWindows =  gcnew VariablenFenster;
    				 VariWindows->Show();
    			 }
    

    Button "Ausblenden"

    private: System::Void ausblenden_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				  VariWindows->Hide();
    			 }
    

    Button "Einblenden"

    private: System::Void einblenden_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				VariWindows->Show();
    			 }
    

    Der Konstruktorcode

    public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    			VariablenFenster^  VariWindows;
    


  • nun ja wenn ich in die Ausgabe die Eingabe einbinde und in die Eingabe die Ausgabe, dann mekert der Compiler, warum weiß ich auch nicht, wenn du mir das noch löst dann übernehme ich deine Methode (hab ich nämlich so ähnlich schon ausprobiert) 😃



  • Gib Fehlermeldung.



  • @ Exit:

    Du willst aus Form1 eine weitere Form (Form2) aufrufen?
    Form2 soll angezeugt werden, während Form1 ausgeblendet wird. Durch Button-Klick in Form2 soll Form1 wieder aktiv/angezeigt werden und Form2 geschlossen werden??
    Hab ich das so richtig verstanden??

    Wenn ja, dann ist dein Problem, dass du ne Instanz von Form1 und Form2 hast und die Instanzen wissen voneinander nix!!!! Bzw. Instanz von Form1 kennt zwar Instanz von Form2 (wird ja von Form1 aufgerufen), aber anders rum eben nicht! Also entweder musst du ne Referenz von Form1 an Form2 mitgeben, oder anders lösen (ShowDialog vllt.)



  • also ich erkläre nochmal alles, dann wird mein Problem (hoffentlich) klar:
    (ich kürze funktioniert mit funzt ab)

    Ich habe zwei Formen: Form1 (= Ausgabe) und Form2 (= Eingabe) jeweils zwei unterschiedliche Fenster

    Eingabeform hat:
    - Variableneingabe in Felder (funzt)
    - Startbutton
    - Beenden-Button (funzt)

    sieht als Code (gekürzt) so aus:

    namespace //... (Standard, keine hinzugefügt)
    
    //Components etc. (Buttons etc.)
    
    void Load{
        //...
        }
    
    void Beendenbutton_click {
        Application::Exit(); //funktioniert
        }
    
    void Startbutton_click {
        //test der variablen und einlesen (in entsprechende int,float etc. Variablen (funzt))
    
        //Funktionsaufruf (Funktion in Ausgabeform)
        Ausgabefenster::Funktion(Parameter); //parameter sind die ausgelesenen Werte, funktioniert NICHT!
    
        //Fenster wird unsichtbar gemacht
        Variablenfenster::Hide();
        //funzt
        }
    

    Form2 also die Ausgabeform hat:
    - Koordinatensystem (wird angezeigt)
    - Stop-Button

    #include "Variablenfenster.h" //also das Eingabefenster
    
    namespace //normal
    
    //variablen (die ich benötige)
    bool weiter = true; //unter anderem
    
    //Components schenk ich mir wieder
    
    void Funktion(parameter){
        //Rechnung
        do{
            //...
        }while (weiter);
    
        weiter = true; //am Ende wird weiter wieder true gesetzt damit das Programm neu gestartet werden kann
        }
    
    void Ausgabefenster_Load(){
        }
    
    void Ausgabefenster_Paint(){
        //mein Koordinatensystem (funzt)
        }
    
    void stopbutton_click(){
        weiter = false; //bricht die Endlosschleife in Funktion ab
        Variablenfenster::Show(); /*Hide soll rückgängig gemacht werden und das Eingabefenster soll 
        (mit den vorher eingegebenen Variablen in den TextBoxen!) wieder erscheinen*/
        }
    
    void Ausgabefenster_Shown(){
        //Variablenfenster öffnen
        Variablenfenster^ fenster_var = gcnew Variablenfenster;
        fenster_var->ShowDialog();
        //funzt, fenster erscheint
        }
    

    von main wird zuerst das Ausgabefenster geladen und danach über Ausgabefenster_Shown() das Variablenfenster angezeigt.

    sieht danach so aus: http://www.imagehack.eu/de/uploads/9a992438c1.jpg
    (in der Simulation soll ein Planet um 2 Sonnen kreisen, aber das ist ja nicht Diskussion hier)

    wenn jetzt die Simulation gestartet wird, soll das Variablenfenster verschwinden, damit man das hintere Fenster sieht. Wenn der User auf stop drückt, wird die Simulation angehalten und es soll das Variablenfenster wieder erscheinen. (mit WERTEN!!)

    mein Problem:
    - Variablenfenster verschwindet, taucht aber nicht wieder auf (mit Stop-Button soll es wieder da sein)
    - Funktion kann nicht aufgerufen werden weil der Header nicht drin ist
    - wenn der header doch drin ist, kommt die Fehlermeldung (s.u.)

    fehlermeldungen @ Doug_HH: http://www.imagehack.eu/uploads/a31f0b288b.jpg
    (kein einziger dieser Fehler tritt ohne das #include "Ausgabefenster.h" (im Eingabefenster) auf, dafür der oben erwähnte Fehler)

    Danke für Eure Geduld mit mir 😃



  • </Exit> schrieb:

    Aber this ist doch das aktuelle Fenster? (in diesem Fall das Ausgabefenster)

    Variablenfenster::Show();
    

    ist im Ausgabefenster.

    Damit würde ich (mit this) doch dann wieder das Ausgabefenster aufrufen, nicht das Variablenfenster!? Ich möchte aber doch das Variablenfenster wieder sichtbar machen...

    Ich meinte nicht, daß du this->Show() aufrufen solltest, sondern daß du ein Variablenfenster benötigst, dessen Show()-Methode du dann aufrufen kannst (lass mich raten, der Hide()-Aufruf ist in einer Variablenfenster-Methode und klappt deshalb problemlos).



  • Hi Exit!

    Einrücken kannst mit der Leertaste oder dem Button unterm Eingabefenster "4 Leerzeichen".
    Der Code hier ist doch in Ordnung, oder?

    void Ausgabefenster_Shown(){ 
        //Variablenfenster öffnen 
        Variablenfenster^ fenster_var = gcnew Variablenfenster; 
        fenster_var->ShowDialog(); 
        //funzt, fenster erscheint 
    }
    

    Dein Problem ist, dass er die vorher eingegebenen Daten nicht anzeigt? Richtig?
    Was spricht dagegen beim Klick auf Starten im Variablenfenster diese 5 Daten an deine Ausgabeform zu übergeben?? Dann kannst du durch nen neuen Konstruktor (der diese 5 Daten dann wieder von der ausgabeform übergeben bekommt) für dein Variablenfenster diese wieder "zurückgeben".
    Und du kannst dann beim Klick auf Starten das erste Variablenfenster schliessen (this->Close()), ansonsten bleibt es im Speicher, obwohl es nimmer verwendet wird.

    Wär jetzt mal so meine Idee... Ist vllt. nicht unbedingt die schönste Programmierart, würde aber funktionieren! 😉



  • Mal eine andere Frage.. funktioniert die Simulation der Planeten schon? Das würde mich mal interessieren, wie das aussieht..
    Würdest du vielleicht den kompletten Source zeigen? bzw als pn.. ich will nix kopieren oder so 😉 mich interessiert die Berechnung der Bahn...



  • @ Machine: ich weiß es nicht, weil ich die Funktion noch nicht aufrufen kann...
    aber ich kanns dir schicken wenn es funzt, ich kann dir sogar meine ganze Facharbeit schicken wenn's dich interessiert...

    zu meinem Problem:
    - das mit dem Speichern hab ich mir auch schon überleg, aber das wär dann die "quick and dirty" variante

    @ Cstoll zu dem Variablenfenster: ja das klappt problemlos, aber wenn ich mein Variablenfenster global mache, mekert wieder mein Compiler
    also

    Variablenfenster^ fenster_var = gcnew Variablenfenster;
    

    global (oben in den code)

    und dann in den Funktionen nur noch mit fenster_var arbeiten (meinst du doch jetzt?)
    wie gesagt da streikt der Compiler... ich muss das doch einfach nach den namespaces bei den variablen global definiern oder bin ich da jetzt falsch?

    Habe jetzt die Leerzeichen angeglichen, im Internet-Explorer ging's. Der Code ist jetzt lesbarer 😉



  • @ Machine: ich weiß es nicht, weil ich die Funktion noch nicht aufrufen kann...

    Kann mir denken warum, du willst von Variablenfenster aus auf deine Funktion zugreifen, die (inline) in Ausgabefenster.h drinne steht!! Ich tippe zudem, dass diese Funktion in Ausgabfenster.h dazu noch private ist?



  • Ändere bitte...

    void stopbutton_click()
    { 
       weiter = false; //bricht die Endlosschleife in Funktion ab 
       Variablenfenster::Show(); /*Hide soll rückgängig gemacht werden und das Eingabefenster soll(mit den vorher eingegebenen Variablen in den TextBoxen!) wieder erscheinen*/ 
    }
    

    in...

    void stopbutton_click()
    { 
        weiter = false; //bricht die Endlosschleife in Funktion ab 
        Variablenfenster->Show(); /*Hide soll rückgängig gemacht werden und das Eingabefenster soll (mit den vorher eingegebenen Variablen in den TextBoxen!) wieder erscheinen*/ 
    }
    


  • @ NewtonsLaw: ja sie ist im Ausgabefenster.h aber sie ist public, damit sollte ich doch auf sie zugreifen können von außen oder? Bzw. was muss ich ändern damit ich es kann...

    @Doug_HH: Danke,
    - aber: error C2143: Syntaxfehler: Es fehlt ';' vor '->' sagt mein Compiler dazu...
    - habe exakt (!!) deinen ersten Vorschlag übernommen: error C3845: Nur statische Datenmember können innerhalb einer Verweisklasse oder eines Werttyps initialisiert werden.



  • Hast Du 3 Formen
    Form1, Form2 und Ausgabeform?
    Ich baue das grad nach um Dir zu helfen, aber mir fehlt nun eine Form, nämlich die Ausgabeform.



  • error C2143: Syntaxfehler: Es fehlt ';' vor '->' sagt mein Compiler dazu...

    Ist die Variable, die vor -> steht deklariert und definiert ?
    Zeig bitte mal die Zeile , auf die sich der Compilerfehler bezieht .



  • @ Doug_HH: Danke sehr nett von dir...
    Ich habe 2 Forms: Form1 alias Zeichenfenster und Form2 alias Variablenfenster (keine 3 Forms)

    @ Knuddlbaer: Variablenfenster ist gar keine Variable, so heißt meine Form und die Zeile:

    Variablenfenster->Show();
    

    bei

    Variablenfenster::Show();
    

    kommt kein Fehler (zumindest nicht hier) ^^



  • 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) noch

    Variablenfenster^ 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?


Anmelden zum Antworten