Mit Buttonklick in nächstes Form wechseln



  • Hallo zusammen,

    wie der Titel schon sagt, möchte ich gerne mit einem Button names "weiter >" in ein nächstes Form wechseln. Ich habe insgesamt drei Forms. In welches Form gewechselt werden soll hängt ab, welches ListBoxItem ich zuvor angeklickt habe.
    Wie mache ich das 😕 Danke für Tipps 🙂

    lg,
    blitzgeist



  • das sollte gehen:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      switch(ListBox1->ItemIndex)
      {
        case 0:
        {
          Form1->ShowModal();
          break;
        }
        case 1:
        {
          Form2->ShowModal();
          break;
        }
      }
    }
    


  • Hallo P,
    habe es eben ausprobiert. Es "funktioniert". Nur wenn ich im Form1 bin, in der ListBox das Item für From1 auswähle und auf den Button klicke stürzt das Programm ab. Wenn ich in der ListBox das Item für From2 auswähle und den Butto anklicke öffnet sich Form2. Jetzt sind aber zwei Form´s geöffnet. Wie kann ich es machen, dass sich Form1 schließt und ich nur in Form2 arbeite. Wenn ich natürlich in Form2 wieder auf den Butto "< zurück" klicke komme ich wieder zu Form1 zurück und Form2 schließt sich. Ich denke für diese Art von Anwendung gibt es unter NEW doch bestimmte Projekte oder nicht? Was ich erreichen möchte ist, dass der User denkt er würde sich immer nur in einem Fenster bzw Form befinden. Denke mir auch, dass es eine sehr umständliche Lösung ist, zwischen den einzelnen Form´s hin und her zu springen.



  • das mit dem Abstürzen wird warscheinlich daran liegen, das es schon zu sehen ist.
    Da könnte man versuchen es mit if abzufragen und wenn es bereits zu sehen ist nicht auf den Button reagieren, aberwas genau man bei if eingeben muss weiß ich nich.

    schließen kann man ein Fenster mit:

    Form->Close();

    Wenn kein anderes Fenster sichtbar ist, wird aber das ganze Programm geschlossen.

    Und wenn es für dem Benutzer so aussehen soll, als ob es nur ein Fenster ist, dann mach doch einfach nur ein Fenster. _ Man könnte die einzelnen Oberflächen ja auf jeweils einer ScrollBox machen und je nach dem die richtige anzeigen und die anderen unsichtbar machen.

    Aber jemand anderes kann da bestimmt noch bessere Lösungen geben...



  • Ja, kann sein. Also habe auch in den FAQ´s zu diesem Thema schon was gelesen. Aber irgendwie kann ich das nicht auf mein Problem abbilden. Wäre sehr nett, wenn mir jemand weiterhelfen kann.

    Hier habe ich noch zwei Schlagworte:

    Dazu brauchst du ein einzelnes Form, das entweder die Controls pro seite manuell ein- und ausblendet oder du arbeitest mit dynamischen Frames.

    Wie kann ich die Controls ein und ausschalten und wo finde ich was über dynamische Frames? Und, welche Variante ist besser?

    lg,
    blitzgeist



  • Wenn du im Debug Modus arbeitest bekommst du eine Fehlermeldung, die dir eigentlich alles sagen sollte ...
    Versteh aber auch nicht die Logik dahinter, wenn ich auf eine Listbox klicke welches auf der Form1 positioniert ist, dann ist Form1 doch sowieso schon sichtbar, oder ?



  • achso, das was du suchst nennt sich sonst TPageControl ...



  • Hi blitzgeist,

    Ich beziehe mich jetzt auf die Ausgangssituation.

    "p"'s Code sollte dir den nötigen Denkanstoß gegeben haben.
    Um zu verhindern, dass 2 Forms gleichzeitig sichtbar sind, also die Form auf der die Auswahl getroffen wird und z.B. Form2, muss schlichtweg mit TForm::Hide gearbeitet werden. Dann kannste dir auch TForm::ShowModal() schenken; TForm::Show() ist da vollkommen ausreichend.

    Nur wenn ich im Form1 bin, in der ListBox das Item für From1 auswähle und auf den Button klicke stürzt das Programm ab.

    Du wählst auf Form1 in einer ListBox ein Item für Form1 aus, das ein Anzeigen von Form1 einleitet? Die Form wird doch bereits angezeigt... Also hier würd ich mein Konzept überdenken, das hier nämlich wenig Sinn hat!

    PS: Ein Thread pro Thema, ein Thema pro Thread!



  • Hi carstenbauer,
    danke für deine Infos. Ich wähle aus einer ListBox in Form1 eine Option aus, welche mir das Anzeigen von der nächsten Form einleiten soll, nicht wieder die Form selbst.
    Also gibt es zwei Möglichkeiten.
    1. mit Hide meine Form ausblenden und die nächste einblenden lassen.
    2. mit nur einer Form und die Controls ein und ausblenden.

    zu 1. Wenn ich in Form1 bin und zu Form2 wechsel und zurück und beide Form´s nicht aufeinanderliegen, sieht man ja den Wechsel der Form´s, oder nicht?

    .
    .
    .
    Ja, und es ist leider so. Eigendlich logisch, da ich ja zwei getrennte Forms habe. Programm gestartet, verchiebe Hauptform nach oben links, wechsel zu Subform, ist in der Mitte. So kann man das nicht lassen. Gibt es eine Möglichkeit, beim Wechsel von Hauptform zum Subform dem Subform die Position des Hauptforms mitzugeben? Das ist doch aber extrem Umständlich. Denke da ist die 2. Variante (Controls ein und ausbleden) besser. Was heißt besser: bei dem Button Klick Event müssen dann alle "alten" Controls aus- und alle "neuen" Controls eingeblendet werden. Das trägt doch viel zur Unübersichtlichkeit bei, oder nicht?

    Aber was hat es sich noch mit den dynamischen Frames aufsich? Ist das evtl die eleganteste Lösung?



  • Ok, noch mal zur Ausganssituation. Du hast ein Form1 (das MainForm). Dieses wird beim Anwendungsstart bereits nicht-modal angezeigt. Dann versuchst Du dieses bereits sichtbare nicht-modale Form erneut anzuzeigen, allerdings modal... Kann nicht funktionieren. Der Absturz ist vorprogrammiert.

    Es gibt überhaupt keinen Grund in Form1 eine Auswahl zu haben, um Form1 anzuzeigen, also weg damit. In die Liste gehört Form2 und die weiteren, falls Du noch welche hast. Wenn jeweils nur ein anderes Form sichtbar sein soll, blendest Du Form1 aus und zeigst FormX modal an. Da dadurch die Hauptanwendung so lange wartet, bis Du das FormX wieder schließt, kannst Du mit dem nächsten Befehl Form1 wiede sichtbar machen.

    Ps entsprechend geänderter Code:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      switch(ListBox1->ItemIndex)
      {
        case 0:
        {
          Form1->Hide();
          Form2->ShowModal();
          Fomr1->Show();
          break;
        }
        case 1:
        {
          Form1->Hide();
          Form3->ShowModal();
          Form1->Show();
          break;
        }
      }
    }
    


  • Hi Joe_M.,
    danke für deine Antwort. Das ist mir nun alles klar und es funktioniert auch, aber wie gesagt mit dem Seiteneffekt, dass beim Ein- und Ausblenden die Position er einzelnen Form´s unterschiedlich ist. Das sieht total unprofessionell aus, denn ich werden ca. 20 Form´s haben und die alle zu Positionieren, ne. Deshalb dachte ich mir nun, dass ich Frames benutze: ein Form und per Buttonklick wird das Frame geändert. Denke das ist die beste Lösung. Hierzu mache ich aber am Besten einen neuen Thread auf...



  • Setzt doch bei allen Forms Position auf poMainFormCenter oder poScreenCenter.



  • Habe es ausprobiert, funktioniert auch. Aber was ist wenn ich das Mainform verschiebe? Wieder der Effekt.



  • Dann mußt Du in jedem Form, außer Form1, im Ereignis OnShow() die aktuelle Position von Form1 ermitteln und die Forms entsprechend positioniern.



  • Das wäre eventuell, möglicherweise eine Lösung... Bis auf den Effekt, wenn ich zwischen den Form´s hin und her klicke wird jedesmal in der Taskleiste mein Programmbutton aktualisiert, bzw, der Button schiebt sich jedesmal von rechts in die Taskleiste ein.
    Doch kann man sich nicht die ganze Arbeit sparen, wenn man Frames benutzt?

    .
    .
    .

    Das mit der Taskleiste hat sich erledigt.



  • Hi blitzgeist,

    mit Frames, dass ist auch eine Möglichkeit, aber eben eine, die deiner Ausgangssituation zur Folge, eine komplette Umstrukturierung des Programmes voraussetzt, was bei größeren Projekten umständlich und kostenintensiv sein könnte.

    Um mal ein Beispiel für die Verwendung von mehreren Forms (der ursprüngliche Ansatz) zu bringen: Bei vielen Installern, wo man sich immer lästig mit Weiter -> Weiter -> Weiter durchklicken muss(!), werden mehrere Forms benutzt (Kann man einfach nachweisen, wenn man z.B. Vista drauf hat, da dann nämlich der Einblendeffekt alles verrät :)). Grund für den Einsatz verschiedener Forms, ist meiner Meinung nach hauptsächlich die deutlich einfachere Möglichkeit eines Austausches einer "Seite" in z.B. einer Installation. Oder wenn das Installationsprogramm von mehreren Programmierern geschrieben wird, ist es am Ende einfach, alles zusammenzufügen!

    Also ... entscheide dich für eine Möglichkeit (vermutlich Frames) und dann halte dich an "Ein Thread pro Thema, ein Thema pro Thread!" 😉

    mfg
    cb



  • Hallo carstenbauer,
    ich habe mich jetzt für Forms entschieden, da unter Builder 3 keine Frames möglich sind(wenn das nicht so ist, lasse ich mich gerne eines besseren belehren, und, bleibe trotzdem bei Forms)...naja mit Forms sieht das ganze doch mittlerweile auch ganz gut aus.


Anmelden zum Antworten