Variablenzugriff in zweites Formular



  • 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=0

    Das 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???


Anmelden zum Antworten