Variablenzugriff in zweites Formular
-
Hallo!
Ich habe heute zum ersten mal ein zweites Formular in einem Projekt (in CB5) erstellt. Jetzt meine Frage auf die ich in der Hilfe leider keine Antwort gefunden habe:
Wie kann ich auf Variablen von einem ins andere Formular zugreifen? Auf Objektfelder ist es ja einfach (z.B. Form2->Label1->caption)...
Hoffe ihr lacht mich für die einfache Frage nicht aus

Danke schon mal, Liebe Grüße aus Hessen
-
Hallo,
mit der Suchfunktion würdest du aber etwas finden

Dein Problem kannst du mit Klassenvariablen lösen. Du musst diese nur als "public" deklarieren. Ist zwar nicht die schönste Variante, aber es funktioniert.
Gruß Skay
-
Hallo
schau in die FAQ
mit Set/Get ist es besser wie mit PublicMfG
Klaus
-
Skay schrieb:
mit der Suchfunktion würdest du aber etwas finden

Wieso nimmst du ihm dann jede Motivation die Suchfunktion zu benutzen?
Skay schrieb:
Du musst diese nur als "public" deklarieren. Ist zwar nicht die schönste Variante, aber es funktioniert.
Jeder der das verwendet sollte man standrechtlich erschiessen! Und diejenigen die so nen scheiss nem Anfänger empfehlen sollte man langsam zu Tode quälen!
Gründe für diese Aussage stehen in der FAQ.
*michjetztberuhigengeh*
-junix
-
Diskurs zum FAQ-Artikel "Public-Variablen sind böse": http://www.c-plusplus.net/forum/viewtopic.php?t=82945
-junix
-
???
ich mach das immer so:
im Quelltext des ersten formulars:int i;im Quelltext des zweiten formulars:
extern int i;*ahnungslos frag* Hat das zufällig was mit public zu tun?
-
Das sind globale Variablen. Das ist noch fast schlimmer als Public-Variablen...
Hier mal ein paar Threads zu:
http://www.c-plusplus.net/forum/viewtopic.php?t=68139&highlight=global+schlecht
http://www.c-plusplus.net/forum/viewtopic.php?t=36817&postdays=0&postorder=asc&highlight=global+schlecht&start=0
http://www.c-plusplus.net/forum/viewtopic.php?t=68142&postdays=0&postorder=asc&highlight=global+schlecht&start=0Das Problem an glob. Variablen ist die unkontrollierte Zugreifbarkeit sowie - noch schlimmer - die Abhängigkeiten unter den verschiedenen Modulen (Units) die du dir damit ins Haus holst...
-junix
-
ach junix... weißte, ist mir jetzt auch klar, wieso eure quelltexte immer pübertrieben lang sind... weil ihr zig funktionen dazu schreiben mpüsst, nur damit ihr keine public-variablen habt... als programmierer muss man halt etwas aufpassen, was man an einigen dingen verändert, aber nein, statt es sich sogar einfach zu machen und public-variablen zu verwenden schreibt ihr alles in private und müsst klassenspezifische funktionen verwenden um drauf zuzugreifen. ich versteh dieses unsinnige zeugs nicht. private ist nur für dinge, die klassenintern gesteuert werden oder wo patu nichts anderes drauf zugreifen darf...
Um die hier gestellte Frage zu beantworten:
Du hast z.B. 2 Formulare, Form1 und Form2. Diese liegen in Unit1.cpp/Unti2.cpp.
Zuerst musst du in die Unit1.cpp, nachdem Form2 erstellt wurde folgendes eintragen (oben unter #include "Unit1.h"): #include "Unit2.h". Dannn unter TForm1* Form1;, schreibst du: TForm2* Form2;. Nun kannst du mit Form2->Label1->Caption auf das Label1 (Wenn es in Form2 vorhanden ist) zugreifen.
-
Wow, ihr seit ja echt fix mit dem antworten...
@Windoof: Das ich weiß wie man auf Labels, etc. in fremden Forms zugreift hab ich ja geschrieben, mir ging es um Variablen.
@all: Danke für die Infos, ich denke mal für ein kleines Progrämmchen wie ich es schreibe könnte ich ruhig globale Variablen benutzen, allerdings bin ich ja am lernen und will es mir dann auch gleich vernünftig angewöhnen.
Wie läuft das denn mit Funktionen (hab eine call by value in meiner Unit 1) wenn ich diese aus der Unit 2 heraus ansprechen möchte?
-
@Wîndoof: Du bist auch der letzte von dem ich erwarten würde, dass er das versteht was ich geschrieben habe. Denn das würde ja voraussetzen, dass du
a) liest was ich geschrieben habe
b) verstehst was ich geschrieben habe
c) über dein Trotzköpfchen springen müsstest...@Nick--HR: richtig... für kleine Progrämmchen offenbart sich der Vorteil der beschriebenen Regeln nicht. Erst bei grösseren Projekten merkt man, welche Vorteile aus der Einhaltung erwachsen.
Zu deiner Einstellung "ich wills ja auch gleich vernünftig lernen" kann ich nur gratulieren. Da könnten sich andere ne Scheibe von abschneiden (o;Well now. Was deine Funktionen betrifft, müsstest du mir nochmals genau erklären was du genau meinst. Was für eine Variable willst du by Value übergeben?
-
Nick--HR schrieb:
@Windoof: Das ich weiß wie man auf Labels, etc. in fremden Forms zugreift hab ich ja geschrieben, mir ging es um Variablen.
Die Variable oder Funktion sollte in der Klasse TForm1 deklariert sein, dann kannst du auf diese, sofern die unit1.h eingebunden ist, zugreifen. Das läuft nicht nur mit Labels und anderen Komponenten, sondern mit allen Variablen, Funktionen, etc. die in deiner Form gespeichert sind. Nicht aber die, die einfach global in unit1.cpp gespeichert sind. Das und nichts anderes wollte ich dir damit rüberbringen.
@junix: 1. Ich habe deinen Text gelesen, 2. ich habe ihn verstanden, 3. ich gehe davon aus, dass in diesem forum hier niemand mit einem großprojekt kommen wird. Man kann sicherlich ein Hello-World-Programm in Beachtung aller deiner Richtlinien schreiben, aber das wird dann wohl länger, langsamer und komplexer sein als das ganz einfache. In riesigen Projekten, klar, da sollte man die Regeln beachten, da gebe ich dir vollkommen recht, aber bei solchen Sachen wie hier... naja.
MfG Windoof
-
Es geht hier nicht um Komplexität oder Perfomance, sondern um die SICHERHEIT! Man soll sein Interface eben nur so definieren, das ein Benutzer keinen DIREKTEN Zugriff auf die Variablen hat. Alles andere erachte ich als Design-Problem.
Und das Schreiben viele Autoren. Scott Meyers wäre zB einer davon

-
Windoof schrieb:
Nick--HR schrieb:
@Windoof: Das ich weiß wie man auf Labels, etc. in fremden Forms zugreift hab ich ja geschrieben, mir ging es um Variablen.
Die Variable oder Funktion sollte in der Klasse TForm1 deklariert sein,
Falsch.
Windoof schrieb:
Nicht aber die, die einfach global in unit1.cpp gespeichert sind.
Falsch.
Windoof schrieb:
3. ich gehe davon aus, dass in diesem forum hier niemand mit einem großprojekt kommen wird.
Es geht nicht um grossprojekte sondern darum - wies Nick geschrieben hat - etwas sauber zu lernen. Wie gesagt: Die schmutzigen Hacks lernt man von alleine. Selten aber "wie mans richtig macht". Ausserdem spricht nichts dagegen auch im kleinen sauber zu arbeiten. Denn
Windoof schrieb:
aber das wird dann [wenn man das Hello-World nach den diversen designregeln schreibt]wohl länger
Hier verweise ich gerne auf die Aussage von Solarisduke: Wieviel Zeit verbringt der Programmierer mit Tippen in einem Projekt? 3%?
Nicht der Entwickler sollte es möglichst bequem haben sondern das Produkt sollte robust, wartbar und möglichst wiederverwendbar sein...Windoof schrieb:
langsamer
Wieso?
Windoof schrieb:
und komplexer sein
Wieso? Weil weniger globale abhängigkeiten zwischen den Modulen bestehen die nicht durch Funktionsaufrufe dokumentiert sind?
-junix
-
[quote="junix"]
Windoof schrieb:
Nick--HR schrieb:
@Windoof: Das ich weiß wie man auf Labels, etc. in fremden Forms zugreift hab ich ja geschrieben, mir ging es um Variablen.
Die Variable oder Funktion sollte in der Klasse TForm1 deklariert sein,
Falsch.
Mhhh....irgendwie scheint ihr euch ja nicht so wirklich einig zu sein. Wie kann ich denn meine Funktion die ich momentan noch in Untit1.cpp stehen habe aus Unit2.cpp heraus am geschicktesten aufrufen?
-
Deklaration im Header Unit2.h, implementation in Unit2.cpp.
In Unit1.cpp Unit2.h includen und Funktion benutzen.
-junix
-
Genauso hatte ich es auch gemacht. Hatte die Deklaration in der Header-Datei allerdings unter Public stehen, hab sie jetzt unter extern geschrieben und es funktioniert. Hoffe das ist im Sinne des Erfinders...
Danke für eure Hilfe!!
-
Nick--HR schrieb:
Hatte die Deklaration in der Header-Datei allerdings unter Public stehen,
Was für ein Public-Teil?
-junix
-
In der Header-Datei gibt es doch
__published: // Von der IDE verwaltete Komponenten
private: // Anwender-Deklarationen
public: // Anwender-Deklarationen
.
.
.
extern PACKAGE TForm1 *Form1;
-
Wenn ich einen char Array habe und darauf einen Pointer setzen will, dann kann ich ja keine Funktion SetChar (int index) schreiben, oder???