Eigenschaften von Steuerelemente in Form2 ändern
-
Hi!
Ich bin neu hier bei www.c-plusplus.net und muss erst mal sagen:
Super Forum!
Hab hier schon einige Fragen beantwortet bekommen.Zu mir:
Ich bin noch ziemlicher Newbie, was C++ angeht.
Ich hab mir vor 2 Wochen "Microsoft Visual C++ 2005 Express Edition" runtergeladen und programmiere jetzt damit.Zu meinem Problem:
Ich hab eine Windows-Form-Anwendung mit 2 Formularen erstellt und will jetzt aus dem Code von Form1 heraus (z.B. beim Drücken eines Buttons) eine Eigenschaft eines Steuerelements auf Form2 verändern (z.B. textBox->Enabled = false).Also ich habe schon „Form2.h“ included, auf Form2 ein Label erstellt und auf Form1 einen Button, der Form2 anzeigt:
Form2^ formneu = gcnew Form2();
formneu->Show();…funktioniert auch. Dann hab ich versucht:
formneu->label1->Text ="hallo";
Aber dann kommt der Fehler:
„error C2248: "Form2öffnen::Form2::label1": Kein Zugriff auf private Member, dessen Deklaration in der Form2öffnen::Form2-Klasse erfolgte.“Ich hoffe, Ihr versteht, was mein Problem ist und könnt mir helfen…
-
Man sollte nie direkt auf irgendwelche "internen" Controls von einem anderen Form zugreifen. Ich sage "man sollte", da es und sehr unschönes Design ist.
Das IMHO beste ist in dem entsprechenden Form ein public-property zu machen, welches dann die geünschte Aktion durchführt. Vom Form1 aus wird nun dieses Property angesprochen und im Form2 wird es dann intern auf das entsprechende Control weitergeleitet.
Somit hat man eine klar definierte Schnittstelle zwischen den Controls und ich kann das Form beliebige Verändern ohne auswirkungen auf andere Code-Stellen zu haben.
-
Hast Du bei der gelegenheit einen Tipp, wie ich die Implementierung des Properties in die .cpp auslagern kann (ohne das über eine zweite funktion zu lösen) ?
-
Jochen Kalmbach schrieb:
Das IMHO beste ist in dem entsprechenden Form ein public-property zu machen, welches dann die geünschte Aktion durchführt. Vom Form1 aus wird nun dieses Property angesprochen und im Form2 wird es dann intern auf das entsprechende Control weitergeleitet.
Ich verstehe das so:
Ich deklariere eine public-Variable z.B vom Typ 'bool'(um bei meinem Bsp. von oben zu bleiben) und weise ihr in Form1 einen Wert zu. In Form2 lese ich dann diese Variable aus und ändere die Eigenschaft, richtig?Dann hab ich die Frage:
An welcher Stelle in meinem Code muss ich die Variable deklarieren, damit ich sie auch in Form2 verwenden kann.
-
Nein,
die Variable erstellst Du als private und erstellst daraus ein property:
ref class A { private: System::String ^ m_eigenschaft; property System::String ^ eigenschaft { System::String ^ get(){return m_eigenschaft;} void set(System::String ^ t){m_eigenschaft = t;} } }; A a; a.eigenschaft = "Hallo Welt";
Eventuell macht es sinn bei get ein const zurück zu geben (wo wäre sonst der vorteil ?) , ich hab es aber nie probiert.
-
Sorry, wenn meine Fragen nerven (Newbie halt ), aber wo muss ich das in den Code schreiben.
Kannst Du mir evtl. mal den Code von beiden Header-Dateien schreiben?
Wäre echt super nett!Vielleich trotzdem nochmal die Frage:
An welcher Stelle in meinem Code muss ich eine Variable deklarieren, damit ich sie auch in Form2 verwenden kann.
Das brauche ich nämlich trotzdem für was anderes...
-
Such Dir mal die Stelle in Deinem Buch, die sich mit Klassen und Objekten beschäftigt und lies dann ein wenig über public und private .
Ansonsten fällt mir nur ein: Die Deklaration der Variable sollte im Header innerhalb der Klasse stehen und die Definition (und somit deklaration) des Properties ebenfalls innerhalb der Klasse im Header (ich weiß nicht wie ich beim property definition und deklaration trennen kann).
Eventuell verstehe ich auch Deine Frage nicht.
-
In deinem "Form2.h" machst Du folgendes ganz ans Ende der Klasse rein:
public: property bool MyBoolProperty { bool get() { return this->label1->Enabled; } void set(bool val) { this->label1->Enabled = val; } }
Dann kannst Du direkt vom Form1 auf dieses Property einer Form2-Instanzu zugreifen.
-
Hi noch mal!
Eine Frage hab ich aber immer noch:
Wie kann ich eine globale Variable deklarieren? Also eine Variable, die ich in jeder Form verwenden kann.Ich stell mir das irgendwie so vor:
//Form1.h public: int Name_der_Variable; //Form2.h Name_des_Projekts::Name_der_Form::Name_der_Variablen = 7;
Dann kommt aber der Fehler: „error C2597: Ungültiger Verweis auf nicht-statischen Member“.
Habt ihr da 'ne Idee???
-
ref class Globals sealed abstract { public: static String ^MyGlobalVariable; };
Und zugreifen z.B. via:
Console::WriteLine(Globals::MyGlobalVariable);
PS: Aber wenn man globale Variablen hat, dann ist i.d.R. irgendwas am Design schief...
-
ja,
die globale Variable als solche ansprechen und nicht der Form zuweisen. Am besten keine globalen Variablen verwenden (und sich mit dem Thema sichtbarkeitsbereiche auseinander setzen).
Zudem: Bitte nicht das extern vergessen wenns schon global sein muss und vorweg: Mit managed Klassen geht keine globale Variable, hier musst Du ein wenig den Gedankenweg eines Singelton folen. (statische Variable in eine Klasse legen, die Du als solche verwenden kannst).
-
Jochen Kalmbach schrieb:
ref class Globals sealed abstract { public: static String ^MyGlobalVariable; };
...hab ich in mein Programm in Form1 eingebunden. Kann in Form1 auch die Variable auslesen und editieren.
Aber wenn ich in Form2 schreibe:
Console::WriteLine(Globals::MyGlobalVariable);
...dann kommt:
"error C2653: 'Globals': Keine Klasse oder Namespace"
-
Vllt dafür sorgen, das die Klasse Globals auch überall bekannt ist ?
Wo hast Du denn Globals deklariert ?
-
Knuddlbaer schrieb:
Vllt dafür sorgen, das die Klasse Globals auch überall bekannt ist ?
Wo hast Du denn Globals deklariert ?
In Form1.h:
#pragma region Windows Form Designer generated code void InitializeComponent(void) { ...} ref class Globals sealed abstract { public: static String ^MyGlobalVariable; }; #pragma endregion ...
Falsch?
-
ja, so ist es auch nur in Form1 sichtbar bzw. Du müsstest Form1.h in Form2.h includieren.
Evnetuell wäre es sinvoller, die Klasse in einen eigenen Header zu packen und diesen in Form1.h UND Form2.h zu includieren (oder in die stdafx.h, womit die Deklaration auch überall sichtbar wäre, die stdafx.h wird ja automatisch beim Anlegen von Klassen includiert).
Hinzu kommt noch, das die Klasse als <unbekannt, vermutlich private> in Form1 liegt. Du müsstest also mit
Form1::Globals darauf zugriefen, sofern diese dann public wird. Nimm die Deklaration aus der Form raus.
Wenn Du dann noch ein
ref struct Globals ... daraus machst, kannst Du Dir das public innerhalb der Klasse sogar sparen.