Form2->close und Form1->visible



  • Hallo liebe Leute.

    Ich habe ein Problem, welches ich bis jetzt nicht lösen konnte. Ich benutze mehrere Forms in meinem Projekt und möchte beim schließen von Form2 Form1 wieder sichtbar machen. Mein Problem liegt darin, das ich nicht weiß, wie ich auf Form1 (Visible = true) zugreifen kann?
    Die Forumsuche zeigt, das mehrere Leute Probleme mit Visible oder Hide haben. Jedoch konnte ich die dort gebrachten Beispiele nicht zum Laufen bekommen.
    Vielleicht kann jemand ein Beispiel von Anfang bis Ende erstellen (vielleicht auch für die FAQ), welches sich diesem Problem annimmt.

    Vielen Dank!

    Gruß



  • Zeigmal den relevante Code.
    Ich vermute einfach mal Du musst der Form2 die Form1 übergeben (kannst Du dann noch mit einem Interface entkoppeln, aber prinzipiell...).

    Simon



  • Hallo.

    Ich habe versucht, das Beispiel hier hier für mein Vorhaben anzupassen, komme aber in dem zweiten Post, erstes Beispielfenster (Form1.h) nicht weiter, da ich nicht weiß, wo ich das genau in meiner druckvorlage.h hinsetzen muss? Ein entsprechender #include der jeweils anderen Datei ist in beiden .cpp´s enthalten.

    Form1.cpp
    druckvorlage ^druckvorlage1 = gcnew druckvorlage();
    druckvorlage1->Woher::set("hauptseite");
    druckvorlage1->Show();
    
    druckvorlage.h
    public ref class druckvorlage : public System::Windows::Forms::Form 
    { 
       System::Windows::Forms::Form ^ m_parent; 
    public: 
       druckvorlage(System::Windows::Forms::Form ^ MyParent) 
       { 
           m_parent = MyParent; 
       ...
    

    und

    System::Void druckvorlage::druckvorlage_FormClosing(System::Object^  sender, System::EventArgs^  e)
    {
        my_parent->Show();
        this->Close();
    }
    

    Fehlermeldung:
    Kein geeigneter Standardkonstruktor verfügbar.

    Bei diesem Posting von vor ein paar Tagen wird leider die Lösung vorenthalten?!

    Gruß



  • Hallo.

    Fehler gefunden:

    Ich habe vergessen, dem Konstruktor den "Namen" zu übergeben. Es muss natürlich

    druckvorlage ^druckvorlage1 = gcnew druckvorlage(this);
    

    lauten!

    Jetzt taucht aber ein neues Problem auf:
    Das Form "druckvorlage" beinhaltet momentan nur einen Button. Schliesse ich nun das Fenster kommt folgende Fehlermeldung:

    Zusätzliche Informationen: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement button1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    Gruß



  • 1. Erstelle ein Projekt mit dem Namen "tstBsp".
    2. Lege auf die Form1 einen Button.
    3. Erzeuge dafür ein Click-Event per Doppelklick auf Button1.
    4. Passe den Code für das Klick-Event bitte wie in diesem Beispiel an...

    Form1.h

    #pragma once
    
    namespace tstBsp {
    
    	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.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Button^  button1;
    	protected: 
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->SuspendLayout();
    			// 
    			// button1
    			// 
    			this->button1->Location = System::Drawing::Point(119, 87);
    			this->button1->Name = L"button1";
    			this->button1->Size = System::Drawing::Size(75, 23);
    			this->button1->TabIndex = 0;
    			this->button1->Text = L"button1";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 264);
    			this->Controls->Add(this->button1);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e);
    	};
    }
    

    tstBsp.cpp

    // tstBsp.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    #include "Form1.h"
    #include "Form2.h"
    
    using namespace tstBsp;
    
    [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());
    	return 0;
    }
    
    System::Void Form1::button1_Click(System::Object^  sender, System::EventArgs^  e)
    {
    		this->Visible::set(false);
    		Form2^ _newForm = gcnew Form2();
    		_newForm->Show(this);
    
    }
    

    1. Erstelle für die Form2.h, die Du auch dem Projekt noch zufügen musst, das FormClosing-Event

    Passe bitte wieder diesen Code diesem Beispiel an...

    Form2.h

    #pragma once
    
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    
    namespace tstBsp {
    
    	/// <summary>
    	/// Zusammenfassung für Form2
    	///
    	/// 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 Form2 : public System::Windows::Forms::Form
    	{
    	public:
    		Form2(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form2()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->SuspendLayout();
    			// 
    			// Form2
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(284, 264);
    			this->Name = L"Form2";
    			this->Text = L"Form2";
    			this->FormClosing += gcnew System::Windows::Forms::FormClosingEventHandler(this, &Form2::Form2_FormClosing);
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    private: System::Void Form2_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e);
    	};
    }
    

    Und nun noch die Form2.cpp

    Form2.cpp

    #include "StdAfx.h"
    #include "Form2.h"
    #include "Form1.h"
    
    using namespace tstBsp;
    
    System::Void Form2::Form2_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) 
    			 {
    				Form1^ f = (Form1^)this->Owner;
    				f->Visible::set(true);
    			 }
    

    Das war's.

    Habe den ganzen Code gepostet, damit man das besser nachvollziehen kann.

    Hier nochmal das Projekt als Download...

    http://www.hbdes.com/tstBsp.rar

    Gruß,

    Doug_HH



  • Hallo.

    Vielen Dank für eure Hilfe. Es funktioniert jetzt alles so wie es soll!

    Danke!

    Gruß


Anmelden zum Antworten