[C++] Labels außerhalb der Form1 Klasse ändern

Die "klasse" besitzt doch aber überhaupt kein "label1".

Ich habe die Form1 jetzt mal um die Funktion erweitert:
PHP:
	public : System::Void changeLabel1(System::String ^text) {
				 this->label1->Text = text;
			 }

und den Button verändert:
PHP:
System::Void klasse::button1click(System::Object^  sender, System::EventArgs^  e)
{
	Form1::label1->Text = "Hi";
	changeLabel1("Text");

	//Um sicherzusein, dass der Klick auch ausgeführt wird
	System::Windows::Forms::MessageBox::Show(label1->Text);
}

Erstaunlicherweise wird in der MessageBox wirklich das zuvor gesetzte "Text" ausgegeben. Aber es wird in der Form nicht angezeigt.
Wenn ich wirklich nur das label in meiner Klasse anspreche, wie spreche ich dann das andere an?
 
Die "klasse" besitzt doch aber überhaupt kein "label1".

Doch, du erbst von Form1 und diese Klasse hat einen Member label1, daher wird der weitervererbt.

Erstaunlicherweise wird in der MessageBox wirklich das zuvor gesetzte "Text" ausgegeben. Aber es wird in der Form nicht angezeigt.
Wenn ich wirklich nur das label in meiner Klasse anspreche, wie spreche ich dann das andere an?


Das ist überhaupt nicht erstaunlich. Denn wie gesagt, label1 in deiner Klasse ist eine andere Instanz von System::Windows::Forms::Label als label1 deiner Instanz von Form1. Es sind zwei unterschiedliche Instanzen von Klassen. Du musst einen Zeiger auf die Instanz von Form1 haben, die angezeigt wird. Grundsätzlich liefert dir sender die Möglichkeit an diese Instanz zu kommen, wenn du alles entsprechend castest (Vorsicht: Dabei immer try<->catch zur "Validierung" des Casts verwenden)
 
Das hört sich gut an, könntest du bitte noch ein kurzes Beispiel geben, wie ich an die Instanz von Form1 mithilfe des sender objects komme?
 
Du prüfst zuerst ob sender in System::Windows::Forms::Button^ gecastet werden kann. Anschliessend prüfst du ob der Button bei Parent nicht den nullptr hat. Falls dem so ist versuchst ob du diesen Parent von System::Windows::Forms::Control nach Form1 casten kannst.

Prüfen kannst du das über try und das catchen einer InvalidCastException exception.
 
Ich weiß zwar jetzt genausoviel wie vorher, aber ich habe es anders in den Griff bekommen.
Du hast mir die Augen geöffnet, denn eigentlich enthält ja die "klasse" jetzt die komplette Form.
Also einfach in der Mainfunktion:

PHP:
	klasse ^k = gcnew klasse();
	k->button1->Click += gcnew System::EventHandler(k, &klasse::button1click);
	Application::Run(k);

Funktioniert wunderbar ^^
Vielen dank für die Hilfe.
 
Ja, das ist so, Ich bin davon ausgegangen, dass das einen tieferen Sinn hat dass das zwei unterschiedliche Instanzen sein müssen ;).

A propos:
Jetzt ist dein Setup identisch wie wenn du von vornherein ein Windows Forms Projekt ausgewählt hättest ;)
 
Ist mir nach dem schreiben des Posts auch aufgefallen, aber so gefällt es mir besser.

Ich habe nur ein Buch zur Einführung in Visual C++ gelesen und da wird sowas garnicht behandelt ...
 
Du musst einen Zeiger auf die Instanz von Form1 haben, die angezeigt wird. Grundsätzlich liefert dir sender die Möglichkeit an diese Instanz zu kommen, wenn du alles entsprechend castest (Vorsicht: Dabei immer try<->catch zur "Validierung" des Casts verwenden)

Mit try catch würde ich nicht prüfen.
Auch wenn hier Fehler eigentlich nicht auftretten sollten, würde es das Programm doch eher verlangsamen, sollte dies der Fall sein und in einem größerem Umfang.

In C# gibts dafür zum Beispiel den "is" (oder auch "as") Operator, den müsste es in der C++ Version doch auch geben oder?
 
Zurück