gtkmm: MessageDialog schließt nicht richtig



  • Hi @ all

    Ich habe folgende Funktion

    int MessageBox(Gtk::MessageType messagetype, Gtk::ButtonsType buttonstype, const char *title, const char *message, const char *secondarymsg)
    {
     Gtk::MessageDialog msgdlg(Glib::ustring(message), true, messagetype, buttonstype);
    
     msgdlg.set_title(Glib::ustring(title));
    
     if(secondarymsg != NULL) msgdlg.set_secondary_text(Glib::ustring(secondarymsg),true);
    
     int result = msgdlg.run();
    
     return result;
    }
    

    Rufe ich diese auf:

    gui::MessageBox(Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK, "Nur eine Info", "Eine relativ kurze Info-message");
    

    So wird die Messagebox auch richtig angezeigt. Wenn ich nun auf den OK-Button, oder den Schließen-button des Fenstes klicke, geht der Programmfluss weiter.
    Allerdings wird das Fenster immernoch angezeigt. Ich kann dieses auch noch verschieben, der OK-Button selber zeigt aber keine Reaktion mehr (wenn ich mit der Maus drüber gehe.) Verdecke ich das Fenster mit einem andren, so wird der inhalt der Messagebox nicht neu gezeichnet. (Fenster der MB bleibt leer)

    Woran liegt dass? Was mache ich falsch?

    System: openSuSE 11.0
    Fenstermanager: Fluxbox 1.0.0-2.1
    gtkmm: 2.12.7-21.1



  • Direkt nach Gtk::MessageDialog::run () auch Gtk::MessageDialog::hide () aufrufen. 😉 Also in deinem Fall:

    int result = msgdlg.run();
     msgdlg.hide ();
    


  • sowohl .hide(), als auch .hide_all() bringen keinen unterschied 😞



  • Hm also mit deinem Code (also ohne zusätzliches .hide ()) wird die MessageBox normal geschlossen, wenn ich auf OK klicke. 😮



  • hm... Habs nun mal auf meinem zweitrechner probiert:
    openSuSE 11.1
    KDE4.1
    gtkmm 2.12.7-21.1

    Diesmal alles 64Bit

    code:

    #include <gtkmm.h>
    #include <gtkmm/window.h>
    #include <cstdio>
    
    int MessageBox(Gtk::MessageType messagetype, Gtk::ButtonsType buttonstype, const char *title, const char *message, const char *secondarymsg)
    {
     Gtk::MessageDialog msgdlg(Glib::ustring(message), true, messagetype, buttonstype);
    
     msgdlg.set_title(Glib::ustring(title));
    
     if(secondarymsg != NULL) msgdlg.set_secondary_text(Glib::ustring(secondarymsg),true);
    
     int result = msgdlg.run();
     msgdlg.hide_all();
    
     return result;
    } 
    
    int main (int argc, char *argv[])
    {
     Gtk::Main *gtkmain = new Gtk::Main(argc, argv);
     MessageBox(Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK, "Nur eine Info", "Eine relativ kurze info-message", "1000");
    
     char x[1000];
     scanf("%999s", x);
    
     delete[] gtkmain;
     return 0;
    }
    

    Kompilieren tue ich es so:

    g++ `pkg-config gtkmm-2.4 --cflags --libs` -o mb test.cpp
    

    Das Gleiche Problem. Das Fenster der Messagebox bleibt erhaltet.
    ps.: Wenn das Programm beendet wird, verschwindet das fenster dann auch endlich... Vorher aber nicht (gilt auch für oben)

    -- edit --
    Gerade per zufall herrausgefunden:
    Wenn ich nach aufruf der MessageBox ein andere Fenster (Gtk::Window) öffne, verschwindet die Messagebox endlich. Funktioniert auch, wenn ich 2 Messageboxen hintereinander öffne. Die 1. Verschwindet, sobald die 2. sich öffnet.
    ps.: Das Gtk::Window-Fenster mach absolut keine Probleme. Das schließt sich direkt bei dem Klick auf das X (Fenster-Schließen-Button)



  • Hi,

    MessageBox anzeigen funktioniert bei mir tadellos (Debian 5.0, KDE 3.5.x, gtkmm 2.12.7-1). Auch dass der Button nach Klick auf OK verschwindet. Allerdings muss man dazu bei deinem letzten Codebeispiel schon die scanf-Anweisung entfernen... die da eh extrem sinnlos ist.
    Ach ja, besser ist es, wenn du Gtk::Main nicht per new anlegst sondern ganz normal auf dem Stack.

    #include <gtkmm.h>
    #include <gtkmm/window.h>
    #include <cstdio>
    
    int MessageBox(Gtk::MessageType messagetype, Gtk::ButtonsType buttonstype, const char *title, const char *message, const char *secondarymsg)
    {
     Gtk::MessageDialog msgdlg(Glib::ustring(message), true, messagetype, buttonstype);
    
     msgdlg.set_title(Glib::ustring(title));
    
     if(secondarymsg != NULL) msgdlg.set_secondary_text(Glib::ustring(secondarymsg),true);
    
     int result = msgdlg.run();
    
     return result;
    }
    
    int main (int argc, char *argv[])
    {
     Gtk::Main gtkmain(argc, argv);
     MessageBox(Gtk::MESSAGE_INFO, Gtk::BUTTONS_OK, "Nur eine Info", "Eine relativ kurze info-message", "1000");
    
     return 0;
    }
    

    Cheers

    GPC



  • sry dass ich erst jetzt anworten kann... war 2 Wochen im Urlaub, und dort gab es keine Möglichkeit ins Netz zu kommen.

    Zum scanf: Damit wollte ich verhindern, dass die Messagebox durch das Beenden des Programmes "zerstört" wird.

    Warum gtkmain auf dem stack besser aufgehoben sein soll, kann ich zwar nicht nachvollziehen, aber auch dass verhindert nicht das Fehlverhalten 😞



  • RedEagle schrieb:

    Warum gtkmain auf dem stack besser aufgehoben sein soll, kann ich zwar nicht nachvollziehen,

    Weil der heap-alloc einfach null Vorteile bringt, aber mehr kostet.

    aber auch dass verhindert nicht das Fehlverhalten 😞

    Bei dir ist irgendwas kaputt an der Installation.



  • GPC schrieb:

    RedEagle schrieb:

    Warum gtkmain auf dem stack besser aufgehoben sein soll, kann ich zwar nicht nachvollziehen,

    Weil der heap-alloc einfach null Vorteile bringt, aber mehr kostet.
    [..]

    In diesem fall mag dass sein. Aber in dem Projekt, in dem ich die Messagebox auch benötige ist es per new und delete "einfacher" (bzw ohne währe es deutlich umständlicher), da ich die Vorbereitenden Maßnahmen und dass Aufräumen in verschiedenen Funktionen unterteilt habe, da ich den ganzen GUI-Kram von dem Organisatorischen Klassen getrennt haben wollte. Und nicht alles zusammen in deine 1000-Zeilen-main-Funktion zusammengepackt. Und da ich ein möglichst Projektnahes testprogramm haben wollte (bzw möglichst alles per copy&past erstellen, damit ich ggf nicht beim neuschreiben irgendwelche Fehler unbemerkt/unterbewusst korrigiere), behilt dich heap-geschichte bei. Aber dass tut ja nichts zur sache 🙂

    GPC schrieb:

    aber auch dass verhindert nicht das Fehlverhalten 😞

    Bei dir ist irgendwas kaputt an der Installation.

    Das habe ich anfangs auch vermutet/befürchtet. Nachdem es aber auch unter dem frisch installierten openSuSE 11.1 nicht lief bezweifel ich das langsam. Werd's aber am Sonntag nochmal auf 'nem frischen Fedora 10 versuchen.



  • RedEagle schrieb:

    GPC schrieb:

    aber auch dass verhindert nicht das Fehlverhalten 😞

    Bei dir ist irgendwas kaputt an der Installation.

    Das habe ich anfangs auch vermutet/befürchtet. Nachdem es aber auch unter dem frisch installierten openSuSE 11.1 nicht lief bezweifel ich das langsam. Werd's aber am Sonntag nochmal auf 'nem frischen Fedora 10 versuchen.

    Probier mal eine vernünftige (=debian basierte) Distribution 😉



  • So. Mal wieder etwas neues herrausgefunden, was die sache noch komischer macht 🙂
    Wenn ich den in der Messagebox dargestellten Text Markiere (egal ob nur teilweise) und dann OK klicke (egal ob der text noch Markiert ist, oder nicht mehr) wird die MB Ordnungsgemäß geschlossen 🙂
    Nur was das Markieren von Text mit den Schließen eines Fensters zu tun hat ist mir nich ein Rätsel.


Anmelden zum Antworten