von mehreren Formularen auf eine Variable zugreifen?



  • Hallo,
    mein Programm bestand bisher aus einer einzigen Unit.

    Nun muß an einer Stelle eine Benutzereingabe abgewartet und ausgewertet werden.
    MessageDlg reicht nicht aus, ich lasse statt dessen vom Form1 aus ein zweites Formular Form2 anzeigen, in dem der Benutzer mehrere CheckBoxes (CheckBoxen?) auswählt und dann auf einen Button "weiter" drückt.

    Meine Fragen:
    1. Wie kann ich (je nach ausgewählten Checkboxen) von Form2 aus Variablen ändern, die im Form1 definiert wurden?

    //in Form2:
    #include "Unit2.h"
    #include "Unit1.h"
    .
    .
    .
    if (Form2->CheckBox1->Checked == true) Form1->IrgendwasGesetzt= true;
    

    funktioniert nicht. Fehlermeldung "IrgendwasGesetzt is not a member of Form1"

    Die FAQ "Forms - Variablenübergabe an andere Form" habe ich gelesen, dort wird der Inhalt von Steuerelementen übergeben.
    Geht das nicht auch mit Variablen?

    2.Wie erreiche ich, daß das Programm im Form1 erst dann weiter ausgeführt wird, wenn das Form2 wieder geschlossen wurde?

    Form2->ShowModal()
    

    allein reicht offensichtlich nicht.

    Bin für jeden Hinweis dankbar.
    Phillip :p



  • Hier stand Mist... Hab mich verlesen.



  • Phillip Pendulina schrieb:

    1. Wie kann ich (je nach ausgewählten Checkboxen) von Form2 aus Variablen ändern, die im Form1 definiert wurden?

    Solange die public deklariert ist sollte das funktionieren. Übersichtlicher wäre allerdings (noch schöner wäre nur die Verwendung einer Methode / Eigenschaft):

    Form1->IrgendwasGesetzt = CheckBox1->Checked;
    

    2

    Form2->ShowModal()
    

    Phillip Pendulina schrieb:

    ...allein reicht offensichtlich nicht...

    Doch das reicht.

    Grüße Joe_M.



  • @ Joe_M:

    Habe gefunden, wie man Methoden selbstgeschriebener Klassen public deklariert, aber einfache Variablen??

    public: bool IrgendwasGesetzt;
    

    Meine Variable IrgendwasGesetzt habe ich jetzt in Form2 nochmal deklariert:

    extern bool IrgendwasGesetzt;
    

    Damit funktioniert es, auch wenn ich nicht weiß, ob es guter Stil ist 😉

    Ich danke Dir für Deine Hilfe!

    Phillip



  • Prinzipiell sind public-Variablen böse. junix hat dazu einen schönen Artikel in der FAQ formuliert. 🙂



  • @Phillip:

    Sieht so als hättest Du die Variable nicht innerhalb der Deklarationen von TForm1 deklariert, sondern nur in der gleichen Unit untergebracht (als globale Variable). Somit ist die Verwendung von extern nötig. Ich bin davon ausgegegangen, dass die Variable innerhalb der Deklaration von TForm liegt. Dann wäre das extern nicht nötig gewesen. Dann hätte über TForm1->Member auch ohne extern darauf zugegriffen werden können.

    Ansonsten kann ich mich nur PuppetMaster2k, respektive junix anschließen.



  • Ich habe es so gemacht:

    using namespace std;
    
    bool IrgendwasGesetzt
    

    An welcher Stelle wäre es richtig gewesen?

    Phillip



  • Es gibt kein richtig für globale Variablen. Sollte man grundsätzlich vermeiden...

    Ich war davon ausgegangen, dass die Variable im Form sebst deklariert ist:

    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	
    public:
    	bool IrgendwasGesetzt;  // hier hatte ich die Variable erwartet.
    };
    


  • PuppetMaster2k schrieb:

    Prinzipiell sind public-Variablen böse. junix hat dazu einen schönen Artikel in der FAQ formuliert. 🙂

    -junix



  • 2.Wie erreiche ich, daß das Programm im Form1 erst dann weiter ausgeführt wird, wenn das Form2 wieder geschlossen wurde?

    Code:
    Form2->ShowModal()

    allein reicht offensichtlich nicht.

    Naja ich würde den Rückgabewert von ShowModal prüfen.

    if(Form2-ShowModal()== mrOk) //mrOk kann abweichen, einfach mal in die Hilfe zu ShowModal schauen
    //dann mache irgendwas
    

    Du kannst den ModalResult in den Eigenschaften des Buttons setzen den Du zum verarbeiten deiner Werte nutzen möchtest.Gut wäre auch wenn Du dem Benutzer einen 'Cancel' button zur Verfügung stellt, falls dies dort sinnvoll ist.



  • @Fox-Alpha: Das Programm wird dennoch nicht weiter ausgeführt, unabhängig davon, ob man den Rückgabewert prüft, oder nicht.


Log in to reply