(Borland) ShowModal() ohne Schließen ?? [gelöst]



  • Hallo Miteinander! 🙂

    Zunächst schon mal ein Dankeschön für's Lesen dieses Problems. Ich suche jemanden, der mir weiterhelfen kann, denn meine Suche im Internet und Fachbüchern blieb bisher erfolglos ...

    Gibt es irgendeine Möglichkeit bei ShowModal() zu verhindern, dass nach dem mrOk Ereignis das Formular geschlossen wird?
    Normalerweise ist es ja Sinn und Zweck von ShowModal(), dass das Formular geschlossen wird und eben die Anweisungen ausgeführt werden, wenn z.B. OK geklickt wurde.

    Wahrscheinlich kann es nur anders gemacht werden.

    Habe eine Form1, von der aus eine weitere Form2 geöffnet wird. Wenn der Nutzer in der Form 2 auf "OK" klickt sollen bestimmte Sachen in ein TMemo von Form1 übernommen werden. Mit ShowModal klappt das (if ModalResult == true) wunderbar. Aber Form 2 sollte offen bleiben und sich nicht schließen.

    Wenn ich die Funktion Show() benutze, gibt es logischerweise kein ModalResult und durch klicken auf den "OK" Button alleine, kann ich keine Werte auf das übergeordnete TMemo in Form 1 übertragen. ⚠

    Was kann man da machen?

    Hat sich erledigt (siehe unten). vielen Dank. 🙂



  • Hallo Deepling,

    bei der Lösung mit ShowModal() könntest du nach dem Schließen danach natürlich wieder diese Form anzeigen (jedoch blockierst du dadurch natürlich die übergeordnete Form), aber dies sehe ich eher als Krux an.

    Der gängige Weg wäre die Benutzung von Ereignissen (Events).
    Definiere dir in deiner Form2 eine Ereignis und löse es in der OK-Click-Methode aus. Und in der Form1 "abonnierst" du dann dieses Ereignis und führst die Aktualisierung durch.

    s.a. [FAQ]Komponenten entwickeln - Ereignisbehandlungsroutinen erstellen



  • Hallo Th69,

    danke für die nette Antwort.

    Die Ereignisbehandlungsroutinen kannte ich schon. Nur konnte ich damit nicht auf die - wie ich meinte - übergeordnete Form zugreifen. Inzwischen bin ich aber auf die Lösung gekommen: Ich muss einfach die Headerdatei von Form1 in Form2 einbauen und dann ist das alles kein Problem!

    Darauf zu kommen war nur etwas schwer für mich. 😃

    Also: Hat sich geklärt.
    Vielen Dank trotzdem für die nette Antwort! 🙂



  • Hallo Deepling,

    du sollst ja auch nicht von Form2 direkt auf Form1 zugreifen (denn dafür sind die Events ja da, um eine Entkoppelung zu ermöglichen).

    Ein Beispiel aus meinem Code für dich übertragen:

    // in Form2.h (Unterform)
    typedef void __fastcall (__closure *TDropFilesEvent)
    						(TObject* Sender, const char *cFilename); // hier kannst du beliebige Parameter für das Event definieren
    
    class TForm2 : public TForm
    {
    private:	// Anwender-Deklarationen
    	TDropFilesEvent FOnDropFiles;
    __published:
    	__property TDropFilesEvent OnDropFiles = { read = FOnDropFiles, write = FOnDropFiles };
    
    	// ...
    };
    
    // in Form2.cpp (Unterform)
    
    void __fastcall TForm2::ButtonOKClick(TObject* sender)
    {
      // Ereignis auslösen
      if (OnDropFiles)
          OnDropFiles(this, "test"); // Parameter entsprechend anpassen
    }
    
    // in Form1.cpp (Hauptform)
    
    void __fastcall TForm1::ButtonClick(TObject* sender)
    {
      TForm2 *frm = new TForm2(this);
    
      frm2->OnDropFiles = &MyDropFiles; // abonnieren
    
      frm2->Show();
    }
    
    void __fastcall TForm1::MyDropFiles(TObject* sender, const char *cFilename)
    {
      TForm2 *frm = (TForm2*)sender;
      // hier dann die Aktualisierungen für Form1 durchführen (entsprechend der Parameter oder aber über die 'frm'-Variable auf Eigenschaften oder Methoden zugreifen)
    }
    

    Für C# habe ich einen Artikel dazu geschrieben: http://www.bitel.net/dghm1164/programming/Kommunikation_von_2_Forms.html
    Zumindestens die generellen Erklärungen dazu sollten dir beim Verständnis weiterhelfen.


Anmelden zum Antworten