Von Form2 auf Form1 zugreifen: Nix passiert.



  • Hi!

    Cooles Forum erstmal, ich hab von hier schon einiges an Info rausgeholt.
    Nun habe ich aber leider ein Problem wo ich nicht mehr weiter komme:

    Ich schaff es nicht von meinem Formular "Search" aus auf ein Label (public) in Form1 zuzugreifen.
    Es Kompiliert fehlerlos,
    erzeugt keine Runtime-Errors,
    bewirkt aber nichts.
    Das label1 bleibt unverändert.

    #include <vcl.h>
    #pragma hdrstop
    #include "stdafx.h"
    
    using namespace ListViewDieZweite;
    
    void Search::button1_Click(System::Object *  sender, System::EventArgs *  e)
    {
    	Form1 * MyForm1 = new Form1();
    	MyForm1->label1->Text = "Gruß aus Form2";
    
    }
    

    meine stdafx.h:

    // stdafx.h: Includedatei für Standardsystem-Includedateien
    // oder häufig verwendete, projektspezifische Includedateien,
    // die nur selten geändert werden.
    #pragma once
    
    #define WIN32_LEAN_AND_MEAN		// Selten verwendete Teile der Windows-Header nicht einbinden
    // C RunTime-Headerdateien
    
    #include "Form1.h"
    #include "ComPort.h"
    #include "Settings.h"
    #include "ini_Commands.h"
    #include "listviewcolumnsorter.h"
    #include "Search.h"
    
    #include <stdlib.h>
    #include <tchar.h>
    #include <iostream>
    #include <string.h>
    #include <vcclr.h> 
    #include <string.h>
    
    // TODO: Verweisen Sie hier auf zusätzliche Header, die Ihr Programm erfordert
    

    Form1.h:

    //...
    public: System::Windows::Forms::Label *  label1;
    //...
    

    Hat jemand eine Idee warum meine Grüße ins Daten-Nirvana geschickt werden?

    Vielen Dank fürs Durchlesen

    Gruß

    pAT



  • Ja weil Du die falsche Instanz von Form1 verwendest.

    Du legst eine neue Instanz an und änderst dort den Wert. Füge mal Deiner Zeile noch ein Form1->Show(); hinzu und Dir geht ein Licht auf.

    Tip: Grundlagen lesen: Klassen, Instanzen und Objekte.

    Abgesehen davon, das Dein Quellcode sich so nicht Übersetzen lässt.



  • Ah, danke!

    Ich hab schon versucht Zeiger zu übergeben. Klappt auch ganz gut.
    Aber ich hab keinen Schimmer wie ich "Search" klarmachen soll, dass es docht ein label1 gibt...

    "Search" Wird aufgerufen:

    Search * Form = new Search(this); 
    Form->Show();
    

    Search.h:

    public __gc class Search : public System::Windows::Forms::Form
    {
    public: 
    	//Search(void)
    	Search(Form *f)
    	{
    		InitializeComponent();
    		this->MyForm1 = f;
    	}
    
             //...
    
    	public: const static Form *  MyForm1;
             // ...
             //...
    
    Form1 * Momo = MyForm1;       //<- Fehler
    	Momo->label1->Text = "lala";
    

    d:\...\ListViewDieZweite\Search.cpp(12): error C2440: 'Initialisierung': 'const System::Windows::Forms::Form __gc *' kann nicht in 'ListViewDieZweite::Form1 __gc *' konvertiert werden



  • Ich würde mal tippen, das Search nichts von Form1 weiss.

    Hast Du denn den Header includiert ? (Du arbeitest mit VS 2003 ?)



  • ja, Microsoft Visual Studio .NET 2003

    alle Header stehn in stdafx.h (siehe Post1), jede .cpp ruft sie auf...



  • Sorry, mein Fehler.

    Du musst System::Windows::Forms nach Form1 casten. Du kommst automatisch von der abgeleiteten Klasse zur Basisklasse aber nicht umgekehrt.



  • JAA! Es funktioniert!

    Vielen herzlichen Dank!!

    Für alle Mit-Noobs:

    void Search::button1_Click(System::Object *  sender, System::EventArgs *  e)
    {	
    	Form1 * MyForm1 = static_cast<Form1*>(FormPointer);
    	MyForm1->label1->Text = "Grüße aus Search";
    }
    

    Header:

    public: System::Windows::Forms::Form * FormPointer;
    

Anmelden zum Antworten