Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Application.Exit()

Îåêßíçóå áðü ôï ìÝëïò Bill . Τελευταία δημοσίευση από το μέλος teliaz στις 22-11-2008, 03:18. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-10-2008, 23:38 45520

    Application.Exit()

     Έχω μια εφαρμογή όπου έχει και σε Menu bar όπου ο χρήστης μπορεί να επιλέξει Exit (έξοδος απο την εφαρμογή) και απλά να κλείσει την εφαρμογή επιλέγοντας το close button των windows. Θέλω κάθε φορά πριν κλείσει η εφαρμογή να βγαίνει ένα πληροφοριακό μύνημα που απλά να λέει "Εξοδος απο την εφαρμογή" και να έχει δυο button ένα επιβεβαίωση και ένα ακυρο.Λοιπόν τα έχω κάνει όλα αυτά και στο OnFormClosing εκτελώ τα παρακάτω...:
    ΅ try
                {
                    DialogResult dr = MessageBox.Show("Έξοδος από την εφαρμογή;", "Επιβεβαίωση", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (dr == DialogResult.Yes)
                    {
                        Application.Exit();
                        return true;
                    }
                    else
                        return false;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Σφάλμα κατά το κλείσιμο της εφαρμογής :" + ex.Message);
                    return false;
                }

    Το παραπάνω είναι μέσα σε μια class on_exit_class πχ και είναι static method. Το πρόβλημα μου είναι πως αν θέλω να κλεισω την εφαρμογή και πατώ επιβεβαίωση τότε εμφανίζεται δύο φορές το MessageBox και αυτό γιατί
    1) Καλείτε μία στο OnClosing
    2) Ξανα μπαίνει στο event μόλις παει να εκτελέσει το Application.Exit()
    Λέω να βάλω boolean μεταβλητές και να λύσω πρόχειρα το πρόβλημα .... αλλά θα θελα μια πίο safe και common λύση στο πρόβλημα όποιος έχει καμια ιδέα ........ευπρόσδεκτη!!Big Smile

    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  17-10-2008, 01:37 45522 σε απάντηση της 45520

    Απ: Application.Exit()

    Η λύση είναι πολύ απλή. Μήν καλείς την Application.Exit(). Αφού η φόρμα σου ήδη κλείνει, και εφόσον είναι η κύρια φόρμα της εφαρμογής, θα κλείσει και η εφαρμογή. Επίσης, αν επιστρέψεις true ή false δεν παίζει κανένα, μα κανένα απολύτως ρόλο. 'Ετσι κι αλλιώς η OnFormClosing δεν έχει return type. Αν θέλεις να ακυρώσεις το κλείσιμο θα πρέπει να θέσεις το e.Cancel=false όπου το e είναι το event argument που δέχεται η OnFormClosing. Έτσι θα απαλλαγείς και από το try/catch και ο κώδικας σου θα γίνει απλά

    DialogResult dr = MessageBox.Show("Έξοδος από την εφαρμογή;", "Επιβεβαίωση", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    e.Cancel = (dr == DialogResult.Yes);

    Αντί να πειραματίζεσαι για το πως νομίζεις ότι δουλεύουν οι διάφορες μέθοδοι και events καλύτερα να κοιτάξεις το documentation των μεθόδων. Απλά πάς επάνω στο OnFormClosing και πατάς F1.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-10-2008, 09:32 45524 σε απάντηση της 45522

    Απ: Application.Exit()

    Ωραία .... και τι γίνεται αν πρέπει να κλείσω την εφαρμογή και απο μία άλλη φόρμα που δεν είναι η main form μου??? Εκεί πρέπει να καλέσω την Application.Exit() και όταν θα κλείνει και η main form θα ξανακάνει την παραπάνω διαδικασία...!Το πρόβλημα μου είναι ότι η εφαρμογή έχει τη δυνατότητα να κλείσει απο 2 διαφορετικές φόρμες και για αυτό έκανα μία class να τη καλώ απο οπουδήποτε.

    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  17-10-2008, 10:43 45525 σε απάντηση της 45524

    Απ: Application.Exit()

    Αν καλέσεις την Application.Exit()  από οποιοδήποτε σημείο θα εκτελεστεί το FormClosing της κύριας φόρμας αρά θα γίνει και ο έλεγχος που θες ακριβώς όπως περιγράφει ο Παναγιώτης. Δεν σου είναι αρκετό αυτό;

     

    Αν θες να γνωρίζεις στην φόρμα όπου κάλεσες το exit αν έχει γίνει ακύρωση από κάποια φόρμα, μπορείς να χρησιμοποιήσεις την overload της Application.Exit() .

     

    Τέλος μια διόρθωση. Για να ακυρώσεις το κλείσιμο πρέπει να θέσεις το e.Cansel = true.

  •  17-10-2008, 10:59 45526 σε απάντηση της 45525

    Απ: Application.Exit()

    gkaz Ουπς! Το έγραψα ανάποδα! Αυτά παθαίνεις όταν πας να το παίξεις πολύ έξυπνος

    ironbill Πέρα από αυτό που είπε ο gkaz και είναι σωστό, είναι σχεδιαστικό λάθος να μπορείς να κάνεις το ίδιο πράγμα από πολλά διαφορετικά σημεία. Καταρχήν, είναι ένας σίγουρος τρόπος να χάσεις τη μπάλα. Μία μικρή αλλαγή να θέλεις να κάνεις (π.χ. έλεγχο ότι δεν υπάρχουν δεδομένα για σώσιμο) και θα πρέπει να ψάξεις να βρεις οπουδήποτε έχεις βάλει αυτό το application exit για να το αλλάξεις. Αντί να προσπαθείς να κλείσεις την εφαρμογή από 2 διαφορετικά σημεία, βάλε τον κώδικα σε 1 και μόνο σημείο στην κυρίως φόρμα, φτιάξε μία public μέθοδο π.χ. TerminateApplication και μέσα σε αυτή κλείσε τη φόρμα. Μετά, κάλεσε την TerminateApplication από τις άλλες φόρμες.

    Ακόμα καλύτερα, μπορείς να χρησιμοποιήσεις την TerminateApplication ως event handler για τα κουμπιά ή τα μενού που χρησιμοποιείς για το κλείσιμο, ακόμα και αν αλλού είναι το μενού και αλλού ο handler. Έτσι θα εκτελείται πάντα ο ίδιος κώδικας.

    .


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-10-2008, 11:59 45530 σε απάντηση της 45526

    Απ: Application.Exit()

    Καλόοο. Θα το δοκιμάσω έτσι!Ευχαριστώ

    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  19-10-2008, 19:05 45585 σε απάντηση της 45530

    Απ: Application.Exit()

    private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    {
    TerminateApp(e);
    }

    private void TerminateApp(FormClosingEventArgs e)
    {
    DialogResult button = MessageBox.Show("Είσται σίγουροι?\nΜη αποθηκευμένα " +
    "στοιχεία\nθα χαθούν κατά την έξοδο.", "Ειδοποίηση",
    MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
    e.Cancel = (button == DialogResult.No);
    }

    private void ExitToolStripMenu_Click(object sender, EventArgs e)
    {
    this.Close();
    }


    Διαπίστωσα όμως ότι κλείνει η φόρμα αλλά δεν κλείνει το Thread...
    Δηλαδή πρέπει μετά να πατήσω και το Stop του Visual Studio...

    Ποιο είναι το λάθος? πρέπει να προσθέσουμε κάτι?




  •  22-11-2008, 03:18 46412 σε απάντηση της 45522

    Απ: Application.Exit()

    Παναγιώτης Καναβός:

    Η λύση είναι πολύ απλή. Μήν καλείς την Application.Exit(). Αφού η φόρμα σου ήδη κλείνει, και εφόσον είναι η κύρια φόρμα της εφαρμογής, θα κλείσει και η εφαρμογή. Επίσης, αν επιστρέψεις true ή false δεν παίζει κανένα, μα κανένα απολύτως ρόλο. 'Ετσι κι αλλιώς η OnFormClosing δεν έχει return type. Αν θέλεις να ακυρώσεις το κλείσιμο θα πρέπει να θέσεις το e.Cancel=false όπου το e είναι το event argument που δέχεται η OnFormClosing. Έτσι θα απαλλαγείς και από το try/catch και ο κώδικας σου θα γίνει απλά

    DialogResult dr = MessageBox.Show("Έξοδος από την εφαρμογή;", "Επιβεβαίωση", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    e.Cancel = (dr == DialogResult.Yes);

    Αντί να πειραματίζεσαι για το πως νομίζεις ότι δουλεύουν οι διάφορες μέθοδοι και events καλύτερα να κοιτάξεις το documentation των μεθόδων. Απλά πάς επάνω στο OnFormClosing και πατάς F1.




    DialogResult dr = MessageBox.Show("Έξοδος από την εφαρμογή;", "Επιβεβαίωση", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    e.Cancel = (dr == DialogResult.No);

    Μάλλον αυτό εννοείς...
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems