[C#] Form Pause

0

Witam.
Mam pewien, w sumie banalny, problem. Chodzi o to, że mój projekt składa się z kilku form. Po kliknięciu buttona na formie głównej pojawia się "podforma". Czy jest możliwość zablokowania programu głównego, żeby oczekiwał na jakiekolwiek zdarzenia na otwartej podformie, np. kliknięcie buttona, a po wystąpieniu takiego zdarzenia, program główny DOPIERO powinien kontynuować wykonywanie kolejnych instrukcji.

Jakieś sugestie...

0

Użyj metody Form.ShowDialog .

0

okej. Robie tak:

form.showdialog();
a potem, w nowej formie, po wykonaniu potrzebnych operacji uruchamiam metodę this.dispose(), która zamyka "podformę".

Thx
PdR

0

Lepiej będzie przypisać jej właściwość DialogResult. Wtedy Form.ShowDialog() zwróci tą Twoją przypisaną wcześniej wartość.

Dispose z miejsca zwalnia zasoby i nie wiem czy jego użycie do zwykłego zamknięcia formy jest poprawne.

0

Do zmykania użyj Form.Close

0

Mam taki kod , do podformy:

 public partial class Podforma : Form
    {
        public Wysylka_masowa()
        {
            InitializeComponent();
        }
        public int Check()
        {
            if (CHwsWSwybrany.Checked)
            {                
                return 1;
            }
            if (CHwsWSwszyscy.Checked)
            {
                return 2;
            }
           return 0;
        }

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

Oraz kod w czesci głównej komunikujący się z podformą:

 Podforma  WM = new Podforma ();

           DialogResult =  WM.ShowDialog();         
            sp_wys = WM.Check();

Co ciekawe, this.close() zamyka formę, a dalej można z niej "czytać" zapisane wartości (funkcja check()). Rozumiem, że metoda this.close() zamyka samo okno, jednak instancja WM klasy Podforma jest dalej aktywna, zatem można się odwoływać do jej metod ?Dopiero gdybym zapisał WM.dispose(), to klasa zostałaby skasowana i nie byłoby już możliwości odwoływania się do niej.
Jeżeli coś źle rozumiem to walcie śmiało, bo uczę się pracy z kilkoma oknami, więc każda uwaga jest cenna :).

0

Jest dokładnie tak jak piszesz. Zwolnienie następuje dopiero po .Dispose(), ale widzę inną rzecz, z której nie skorzystałeś, a o której już wspominano - .DialogResult

        private void BwsANULUJ_Click(object sender, EventArgs e)
        {
this.DialogResult = DialogResult.Cancel;
            this.Close();
        }
        private void BwsWYSLIJ_Click(object sender, EventArgs e)
        {
this.DialogResult = DialogResult.OK;
            this.Close();
        }

I w głównej formie pozostaje sprawdzenie, czy czasem nie cancelnął user:

Podforma  WM = new Podforma ();

           if(WM.ShowDialog()==DialogResult.OK)sp_wys = WM.Check();
0

ale to są dwie niepotrzebne linijki kodu. PO this.close(), odwołanie się do metody WM.check nadal jest możliwe, więc wartości są przekazane. Chyba, że to jakaś kwestia bezpieczeństwa ?

0

Jak już pisałem - w kwestii sprawdzenia, czy użytkownik nie wcisnął 'Anuluj'. Bo tak, to i tak podstawiasz do zmiennej sp_wys .Check, chociaż użytkownik Anulował całą akcję...

0
//-----------------------------------------------------------------------------------
//FormaGlowna.cs

    public partial class FormaGlowna : Form
    {
        private Wysylka_masowa WM;

        public FormaGlowna()
        {
            InitializeComponent();
            WM = new Wysylka_masowa();
        }

        //podepnij to pod zdarzenie 'Dispose' formy, zapewni zwolnienie WM gdy już nie będzie potrzebne
        private FormaGlowna_Disposed() { WM.Dispose(); }

        public void Wysylka()
        {
            if (WM.ShowDialog() == DialogResult.OK)
            {
                sp_wys = WM.Check();
                //...
            }
        }
    }

//-----------------------------------------------------------------------------------
//Wysylka_masowa.cs

    //najlepiej ustaw 'AcceptButton' tej formy na 
    //'BwsWYSLIJ', a 'CancelButton' na 'BwsANULUJ'
    public class Wysylka_masowa : Form
    {
        public Wysylka_masowa()
        {
            InitializeComponent();
        }

        public int Check()
        {
            if (CHwsWSwybrany.Checked)
            {               
                return 1;
            }
            if (CHwsWSwszyscy.Checked)
            {
                return 2;
            }
            return 0;
        }

        private void BwsANULUJ_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }

        private void BwsWYSLIJ_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
            this.Close();
        }

        //podepnij tą procedurę pod zdarzenie 'Shown' formy
        private void Wysylka_masowa_Shown(object sender, EventArgs e)
        {
            //tu ewentualnie wstaw czyszczenie kontrolek
            
        }
    }

Poza tym trzymaj się jednej koncepcji nazewnictwa, bo kompletnie mieszasz wszystko (wielkość liter, język polski i angielski). Najlepiej trzymaj się tego co jest w .NET czyli nazwy zmiennych z małej, pozostałe z dużej, kolejne człony nazwy z dużej. Nie rób skrótów chyba że nazwa jest naprawdę długa (dłuższa niż 25 znaków), przy word completion dłuższe nazwy to nie problem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1