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

 

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

Closing a window form

Îåêßíçóå áðü ôï ìÝëïò dgg. Τελευταία δημοσίευση από το μέλος object+ στις 19-03-2010, 16:09. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  17-03-2010, 12:17 57727

    Closing a window form

    Γειά σας,

    Γίνεται, στο formclosing ή στο formclosed event, να ελέγξω αν ο χρήστης έχει πατήσει το Χ button; Για την περίπτωση που θέλω να γίνονται διαφορετικά πράγματα αν κλείσει την φόρμα απο εκεί, απο το αν πατήσει κάποιο button πχ που κλείνει τη φόρμα.


    Ευχαριστώ
  •  17-03-2010, 12:32 57728 σε απάντηση της 57727

    Απ: Closing a window form

    Στο FormClosing υπαρχει στο event το e.Reason. Δες τις διαθέσιμες τιμές στο documentation. RTFM
  •  17-03-2010, 13:48 57733 σε απάντηση της 57728

    Απ: Closing a window form

    Προφανώς και πρέπει κανείς να διαβάζει το documentation, αλλά θα πρέπει και να δοκιμάζει αν η λύση που προτείνει δουλεύει. Το FormClosingEventArgs.CloseReason property δεν διαχωρίζει αν ο χρήστης πάτησε το Χ ή κάλεσε την Form.Close στο Click event ενός κουμπιού. Και στις δύο περιπτώσεις θα σου επιστρέψει UserClosing.

    Η αλήθεια είναι ότι βρίσκω κάπως περίεργη την ανάγκη γι αυτή τη διαφοροποίηση. Αν πρέπει να εκτελεστεί διαφορετικός κώδικας όταν πατηθεί κάποιο "Close" button, αυτό θα πρέπει να γίνει στο Click του button, όχι στο FormClosing. Θα πρέπει να μας εξηγήσεις τί προσπαθείς να κάνεις για να καταλάβουμε ποιά λύση είναι καλύτερη.

    Για παράδειγμα, μπορεί να θέλεις να εκτελέσεις κάποιο κώδικα είτε ο χρήστης κλείσει τη φόρμα με κουμπί είτε με το Χ, αλλά δεν θέλεις να το εκτελέσεις δύο φορές. Μία πιθανή λύση είναι να βάλεις αυτό τον κώδικα σε ένα function και να προσθέσεις ένα flag στη φόρμα το οποίο θα γίνεται true την πρώτη φορά που θα καλείς το function. Αν το function κληθεί δεύτερη φορά, απλά θα επιστρέφει αμέσως.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-03-2010, 15:24 57735 σε απάντηση της 57733

    Απ: Closing a window form

    Όντως παρατήρησα οτι το UserClosing στο CloseReason, είτε κλείσεις απο το Χ, είτε απο κάποιο button δεν το διαχωρίζει. Έστω ότι η εφαρμογή έχει μία φόρμα η οποία σε κάποιο σημείο ανοίγει μία δεύτερη και κάνει hide την πρώτη. Αν τώρα στη δεύτερη πατήσουμε Χ, θέλουμε να κλείνει τελείως το πρόγραμμα, ενώ με button (στη δεύτερη πάντα) να εμφανίζεται πάλι η πρώτη.

    Αυτό με το flag και το function ακούγεται καλό. Βασικά μόνο με flag. Στο click event του button θα κλείνω την current form (child) και θα κάνω το flag true.Στο form _closing αν είναι flag=true τότε μην κάνεις τίποτα, αν false (σημαίνει πατήθηκε απλώς Χ, δεν εκτελέστηκε το button event), τότε κλείσε και το parent form.

    Not bad.
  •  17-03-2010, 17:18 57737 σε απάντηση της 57735

    Απ: Closing a window form

    To θέμα είναι όμως ότι έτσι αλλάζεις την τυπική συμπεριφορά που έχει ένα παράθυρο. Ο χρήστης, περιμένει ότι πατώντας το X button θα κλείσει το παράθυρο, χάνοντας ενδεχομένως τις αλλαγές που έχει κάνει, και θα επανέλθει στο προηγούμενο παράθυρο. Αν υλοποιήσεις αυτό που έχεις κατά νου, τότε θα τον αιφνιδιάσεις και θα τον βάλεις να πρέπει να θυμάται ότι στο δικό σου πρόγραμμα, πρέπει πάντοτε να προσέχει όταν κάνει "αυτό" γιατί τότε θα γίνει "το άλλο"... Είναι καλό να κρατάμε τις συμβάσεις κάτω από τις οποίες δουλεύουν τα πράγματα όπως επίσης και να δίνουμε στον χρήστη ένα αίσθημα αφάλειας και σιγουριάς.

     


    Vir prudens non contra ventum mingit
  •  19-03-2010, 16:09 57768 σε απάντηση της 57727

    Απ: Closing a window form

    Μια λυση...  στο button να βαλεις αλλο msg και με ενα override της winproc να δεις αν  πατηθηκε το sys close η το δικο σου κουμπι :)
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace aoclosing
    {
        public enum WMsgs : int
        {
            Create = 1,
            Destroy,
            Close = 16,
            MyClose = 199990
        }
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            protected override void WndProc(ref Message m)
            {
    
                if (m.Msg == (int)WMsgs.Close)
                {
                    var result = MessageBox.Show("Are you sure?\n SYSTEM BUTTON CLOSE", "Hey!", MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        base.WndProc(ref m);
                    }
                    else
                    {
                        Message defMsg = Message.Create(this.Handle, 0, IntPtr.Zero, IntPtr.Zero);
                        base.WndProc(ref defMsg);
                        return;
                    }
                }
                if (m.Msg == (int)WMsgs.MyClose)
                {
                    var result = MessageBox.Show("Are you sure?\n MY BUTTON CLOSE", "Hey!", MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        Message CloseMsg = Message.Create(this.Handle, (int)WMsgs.Close, IntPtr.Zero, IntPtr.Zero);
                        base.WndProc(ref CloseMsg);
                    }
                    else
                    {
                        Message defMsg = Message.Create(this.Handle, 0, IntPtr.Zero, IntPtr.Zero);
                        base.WndProc(ref defMsg);
                        return;
                    }
                }
                base.WndProc(ref m);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Message CloseMsg = Message.Create(this.Handle, (int)WMsgs.MyClose, IntPtr.Zero, IntPtr.Zero);
                this.WndProc(ref CloseMsg);
            }
        }
    }

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