Mehrere Formulare



  • Hallo zusammen,
    ich bin mir zwar relativ sicher, dass ich auch etwas mit der Suchfunktion dazu finde, doch leider funktioniert die gerade nicht bei mir (sie lädt, lädt, lädt..).

    Naja, meine Frage ist, wie ich es anstelle, dass beispielsweise durch einen Buttonklick ein neues Formular geöffnet werde, auf dem ich dann wieder völlig unabhängige Sachen darstellen kann (also mit eigener Unit). Ich habe es leider nicht hinbekommen.

    Ich dachte zunächst einfach an Show () und Hide (), doch wenn ich nun sehr viele Formulare hätte, dann würde mein Editorfenster irgendwann sehr unübersichlich..

    Könnt ihr mir helfen?
    Vielen Dank
    lg, freakC++



  • einfach deine zweite Form zum Projekt hinzufügen und in die Aktion des Buttons kommt

    form2->Show();
    

    Show() und Hide() erinnert mich irgendwie so an VisualBasic ^^



  • Hi,
    kann man denn es so machen, dass beim Buttonklick erst das Formular generiert wird? Oder ist das schwachsinnig?

    Vielen Dank
    lg, freakC++





  • Hallo zusammen,
    ich muss nochmals kurz nachfragen. Ich habe einfach eine neue Anwendung geöffnet und ein neues Formualar. NUn kann ich ja nicht einfach beispielsweise in die FormCreate-Methode des 1.Formulars "Form2->Show ()" schreiben, da dieses ja unbekannt ist. Wie füge ich Form2 Form1 hinzu??

    Vielen Dank
    lg, freakC++



  • Indem du den Header von Form2 dort inkludierst.



  • Hi,
    eigentlich klar :D. Dennoch habe ich noch ein Problem. Ich habe in Formular1 eine Variabel, die einen Wert bekommen muss (eins oder zwei). Erst dann kann das Programm laufen. Nun ist es so, dass ich gerne ein 2. Formular haben möchte, auf dem nur ein Editfenster und ein button zu sehen ist. Ich geben in das Editfenster 1 oder 2 ein. So soll die Variabel ihren Wert bekommen.

    Meine Probleme:

    1.) Wenn ich ein zweites Formular erstellt habe und das Programm laufen lasse, erscheint immer das erste Formular (es soll aber erstmal nur form2 erscheinen und nachdem die Variabel ihren Wert hat, ist form1 dran).

    2.) Wie kriege ich es hin, dass wenn ich in form2 eine Variabel eingebe, diese auch in form1 bekannt ist und ich damit arbeiten kann?

    Könnt ihr mir helfen?
    Vielen Dank
    lg, freakC++



  • wenn du ein edit feld mit einem button willst kannst du dir auch weiterhelfen mit
    InputQuery.

    if (InputQuery("Text","Text",variable))
    


  • Hallo,
    ja, das wäre eine andere Darstellungstechnik, aber das ist nicht das Problem. Meine Fragen sind leider dadurch nicht geklärt...

    lg, freakC++



  • Hallo,

    1. In den Projektoptionen kannst du das Hauptformular deiner Anwendung festlegen! In deinem Fall Form2. Dieses Formular startet dann immer als erstes!

    2. Im public-bereich des Headers von Form1 die Variable deklarieren -> den Header von Form1 in Form2 einbinden und mit Form1->Variable auf die zuvor angelegt Variable von Form1 zugreifen. Oder eben den Umkehrfall für die Variable in Form2.

    LG, Micha



  • Hey,
    vielen Dank schonmal. Das hat super geklappt. Dennoch habe ich es noch nicht geschafft, alles so umzuschreiben, dass es meinen Wunsch erfüllt. Ich schildere nochmal kurz die Situation.

    In Form1 gibt es eine grundlegende Methode, die über den kompletten Verlauf des Programms entscheidet. Diese sieht so aus:

    float __fastcall TKepler::VRotation (int i)
    {
      if (modus=="1")    // Hier wird die Entscheidung gemacht
      {
       float R1 = i / Rmax;
       if (R1 <= 1) V = Vmax * R1;
       else V = CGM / pow(i,0.5);
      }
      if (modus=="2")    // Hier wird die Entscheidung gemacht
      {
       V=(282.99*(i/6.0)) / pow(1+2*(pow(i/6.0,10)),0.15);  //R = i
      }
    
      return V;
    }
    

    Die Variabel "modus" muss den Wert 1 oder 2 haben, sonst funktioniert nichts. Ich möchte über ein zweites Formular, welches zuerst erscheint, dieser Variabel eine Wert geben. Ich habe, so wie RandomAccess85 gesagt hat, die Variabel "modus" in Form2 eingebunden.

    Nun ist es aber, dass wenn diese Variabel einen Wert bekommen hat, diese keine Auswirkungen auf Form1 hat. So sieht die wichtigste Methode von Form2 aus:

    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
     switch (RadioGroup1->ItemIndex)
     {
      case 0:
       Form1->modus=1; //Wertzuweisung
       break;
      case 1:
       Form1->modus=2;
     }
     Form1->Show();
    }
    

    Kann es sein, dass die Variabel keine Auswirkung hat, weil hier nur "Form1->Show()" steht? Wurde im Hintergrund schon der Quelltext von Form1 berechnet (als "modus" noch 0 war) und jetzt wird dieser nur angezeigt?

    Wie mache ich es, dass nach dem Klick auf Button1 von Form2, erst Form1 berechnet wird?
    Ich habe schon mal daran gedacht, dass ich die nötigen Methoden einfach auch in die Button Methode von Form2 schreibe, doch sind diese da auch unbekannt (auch wenn ich die Instanz meiner Klasse in public erstellt habe).

    Hoffe, dass ihr mich versteht und mir helfen könnt.
    Vielen Dank für eure Hilfe
    lg, freakC++



  • case 0:
       Form1->modus=="1"; //Wertzuweisung
       break;
      case 1:
       Form1->modus=="2";
    

    Das ist keine Zuweisung, sondern ein Vergleich...



  • Hi,
    ach verdammt. Du hast natürlich recht...das ist der Nachteil von Copy & Paste. Weißt du jetzt noch, wie ich mein problem löse....??

    Vielen Dank
    lg, freakC++

    PS: Ich hab den Fehler oben berichtigt.



  • wenn ich dich oben richtig verstanden hab dann soll form1 nur geöffnet werden wenn du auch einen richtigen wert zuweisst?.

    momentan wird deine form immer aufgerufen.

    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
     switch (RadioGroup1->ItemIndex)
     {
      case 0:
       Form1->modus=1; //Wertzuweisung
       break;
      case 1:
       Form1->modus=2;
       break;
     }
    if (modus>0)
       Form1->Show();
    }
    


  • Hi,
    stimmt da hast du recht. Es löst aber leider auch nicht das Problem, weil Form1 mit dem Progammstart eigens compiliert wird. Es soll aber damit warten, bis in Form2 der Variabel "modus" ein Wert zugewiesen worden ist.

    Weiß jemand, wie ich das bewerkstelligen kann?

    Vielen Dank
    lg, freakC++



  • du kannst im Konstruktor des Form1 das Form2 dynamisch aufrufen, z.B.:

    TForm2* Form2 = new TForm2(NULL); 
    if (Form2->ShowModal() == mrOk)
      {
      //Tu etwas mit Form1
      }
    else
      {
      delete Form2;
      ShowMessage("Es wurde keine Auswahl getroffen!");
      Application->Terminate();
      }
    delete Form2;
    

    hierzu mußt du in den Projekteinstellungen das Form2 aus der Liste der automatisch erstellten Formulare nehmen und das mit dem Form1->Show() brauchst du dann nicht in Form2

    dem Button kann man ein ModalResult zuordnen und dadurch z.B. die oben gezeigte Abfrage machen



  • dann schau dir mal bitte das bedingte kompilieren an mit #if

    allerdings wirst du damit auch nicht sehr weit kommen da eh deine beiden forms kompiliert werden zu beginn.



  • Hallo,
    also der Vorschlag Linneas gefällt mir sehr gut. Dennoch habe ich damit ein paar Probleme, ds ich nicht weiß wie ich mit ShowModal / ModalResult umzugehen habe.

    1.) Wann ist denn ShowModal = mrOK?

    Außerdem weiß ich nicht, was ich jetzt in die if-Bedingung schreiben soll. Wird die Buttonfunktion aus Form2 total ersetzt??? So sieht mein Quelltext jetzt aus:

    Form1 Konstruktor:

    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner), list(new TStringList)
    {
    TForm2* Form2 = new TForm2(NULL);
    if (Form2->ShowModal() == mrOk)
      {
      //Muss hier die Button Methode aus Form2 ersetzt werden? Wo kommt das 
      //ModalResult hin??
      }
    else
      {
      delete Form2;
      ShowMessage("Es wurde keine Auswahl getroffen!");
      Application->Terminate();
      }
    delete Form2;
    }
    

    Form2 ButtonClick-Methode:

    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
     switch (RadioGroup1->ItemIndex)
     {
      case 0:
       Form1->modus=1;
       break;
      case 1:
       Form1->modus=2;
     }
    }
    

    Ich möchte, dass durch RadioGroup "modus" einen Wert bekommt, der an Form1 weitergegeben wird, wobei Form1 dann erst kompiliert wird, damit die Wertzuweisung auch eine Auswirkung hat.

    Ich hoffe, dass ihr mir weiter helfen könnt. Bitte entschuldigt, wenn ich vll ein bisschen blöde Fragen stellen, aber die Methode "ShowModal" ist für mich neu. Ich versuche mittels der BCB Hilfe diese mir besser anzueignen.

    Vielen Dank für eure Hilfe
    lg, freakC++



  • Was genau soll den bei modus anders kompiliert werden?

    Das ModalResult kannst du dem "Bestätigungs"-Button auf Form2 geben, also dem Button der das Form nach der Auswahl schließt. Das geht entweder zur Entwurfszeit oder im Konstruktor von Form2 zur Laufzeit.

    Außerdem kannst du zu ShowModal und ModalResult mal die BCB-Hilfe konsultieren.


Anmelden zum Antworten