Çözüldü Yaptığım uygulama arka planda çalışmaya devam ediyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

ChessKing146

Centipat
Katılım
7 Kasım 2022
Mesajlar
82
Daha fazla  
Cinsiyet
Erkek
Arkadaşlar C# üzerinden basit bir giriş yapma, kayıt olma programı yaptım fakat ana formdan diğer bir forma geçip programı çarpı ile kapatınca arka planda hâla çalışıyor. Bunu nasıl engelleyebilirim?
 
Son düzenleyen: Moderatör:
Çözüm
Birinci sayfayı muhtemelen this.hide ile gizleyip ikinci sayfaya geçiyorsun, C#'ta ise açılış sayfası kapanmadan uygulama kapanmıyor. Dolayısıyla uygulamayı tamamen kapatabilmek için Form1'i kapatmak zorundasın. Geçmiş bir konu da buna şöyle bir yanıt vermiştim;
Hatayı tahmin edebiliyorum. Muhtemelen proje arkada açık kalıyor ve sen tekrar üstünde değişiklik yaptıktan sonra başlatmak istediğinde dosyayı silemediği için sana hata veriyor. Çözüm basit. Form 2'yi kapatıp uygulamadan çıkacağın zaman application.exit metodunu kullanırsın, böylece bu sorunla karşılaşmazsın.

this.Close() mevcut nesneden çıkış yapar. Form1 ise C#'ın geliştirme kurallarına göre parent form olduğu için ondan çıkış yapmak tüm uygulamadan çıkış yapmak demek. Form2 ise form1'in üstünde oluşturulmuş oluyor ve çağrılıyor. this.Hide() metoduyla form1'i gizlediğinde, Form1'den çıkış yapamaz hale geliyorsun tekrar ortaya çıkartmadıkça. Bu sebeplede yaşadığın hata ortaya çıkıyor. Bug bu. O yüzden Form2'nin closing eventine yada herhangi bir butona System.Windows.Forms.Application.Exit( ) yazman gerekiyor. Bu arkadaş tüm uygulamayı kapatmaya yarıyor.

Buna alternatif çözüm olarak Form2'nin constructor parametrelerine Form1'i eklersin, public olarak işaretlenmiş tüm metodlara erişebilir olursun. Buna Show ve Close metodları dahil. Yine bunları Form2 closing eventine eklersen çözüm olacaktır. Kodları da vereyim.

Çözüm 1:
C#:
//Form1 load fonksiyonu;
private void Form1_Load(object sender, EventArgs e)
        {
            Form2 frm = new Form2(this);
            frm.Show();
        }


C#:
public partial class Form2 : Form
    {
        Form1 holder; //Form1'in kontrollerini üstüde tutması için.
                      //Eğer yeni form1 oluşturursak, asıl formu kapatamayız.
        public Form2(Form1 frm) //Buradaki parametre değişikliği önemli!
        {                         //Form1'i parametre olarak vermek gerekiyor.
            holder = frm;        //Parametreden gelen arkadaşı diğer fonksiyonların global
            InitializeComponent(); //erişebileceği bir yere koydum.
        }

        private void Form2_Closing(object sender, CancelEventArgs e) //Form2 closing eventi
        {
            holder.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            this.FormClosing += Form2_Closing; //Yukarıdaki fonksiyonu evente bağladık.
        }
    }
Çözüm 2:
C#:
        //Form1 Load
private void Form1_Load(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.Show();
        }
C#:
//Form2 | Farklı kısmı bu sefer parametre değişikliği ve fazladan bir değişken yerine
// Application Exit kullandım.
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Closing(object sender, CancelEventArgs e)
        {
            Application.Exit();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            this.FormClosing += Form2_Closing;
        }
    }
Sen ne istiyorsun onu söyle bize? Açılan ikinci formda çarpıya tıklayınca komple program mı kapanacak ne olacak? Eğer öyleyse ikinci formun kapatma callback fonksiyonuna app exit yaz işte...
Hocam biraz yeniyim de callback fonksiyonuna nerden ulaşabilirim.Ve evet çarpıya basınca program komple kapansın istiyorum.Biraz geç cevap verdim pardon.
 
Birinci sayfayı muhtemelen this.hide ile gizleyip ikinci sayfaya geçiyorsun, C#'ta ise açılış sayfası kapanmadan uygulama kapanmıyor. Dolayısıyla uygulamayı tamamen kapatabilmek için Form1'i kapatmak zorundasın. Geçmiş bir konu da buna şöyle bir yanıt vermiştim;
Hatayı tahmin edebiliyorum. Muhtemelen proje arkada açık kalıyor ve sen tekrar üstünde değişiklik yaptıktan sonra başlatmak istediğinde dosyayı silemediği için sana hata veriyor. Çözüm basit. Form 2'yi kapatıp uygulamadan çıkacağın zaman application.exit metodunu kullanırsın, böylece bu sorunla karşılaşmazsın.

this.Close() mevcut nesneden çıkış yapar. Form1 ise C#'ın geliştirme kurallarına göre parent form olduğu için ondan çıkış yapmak tüm uygulamadan çıkış yapmak demek. Form2 ise form1'in üstünde oluşturulmuş oluyor ve çağrılıyor. this.Hide() metoduyla form1'i gizlediğinde, Form1'den çıkış yapamaz hale geliyorsun tekrar ortaya çıkartmadıkça. Bu sebeplede yaşadığın hata ortaya çıkıyor. Bug bu. O yüzden Form2'nin closing eventine yada herhangi bir butona System.Windows.Forms.Application.Exit( ) yazman gerekiyor. Bu arkadaş tüm uygulamayı kapatmaya yarıyor.

Buna alternatif çözüm olarak Form2'nin constructor parametrelerine Form1'i eklersin, public olarak işaretlenmiş tüm metodlara erişebilir olursun. Buna Show ve Close metodları dahil. Yine bunları Form2 closing eventine eklersen çözüm olacaktır. Kodları da vereyim.

Çözüm 1:
C#:
//Form1 load fonksiyonu;
private void Form1_Load(object sender, EventArgs e)
        {
            Form2 frm = new Form2(this);
            frm.Show();
        }


C#:
public partial class Form2 : Form
    {
        Form1 holder; //Form1'in kontrollerini üstüde tutması için.
                      //Eğer yeni form1 oluşturursak, asıl formu kapatamayız.
        public Form2(Form1 frm) //Buradaki parametre değişikliği önemli!
        {                         //Form1'i parametre olarak vermek gerekiyor.
            holder = frm;        //Parametreden gelen arkadaşı diğer fonksiyonların global
            InitializeComponent(); //erişebileceği bir yere koydum.
        }

        private void Form2_Closing(object sender, CancelEventArgs e) //Form2 closing eventi
        {
            holder.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            this.FormClosing += Form2_Closing; //Yukarıdaki fonksiyonu evente bağladık.
        }
    }
Çözüm 2:
C#:
        //Form1 Load
private void Form1_Load(object sender, EventArgs e)
        {
            Form2 frm = new Form2();
            frm.Show();
        }
C#:
//Form2 | Farklı kısmı bu sefer parametre değişikliği ve fazladan bir değişken yerine
// Application Exit kullandım.
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Closing(object sender, CancelEventArgs e)
        {
            Application.Exit();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            this.FormClosing += Form2_Closing;
        }
    }
 
Çözüm
Birinci sayfayı muhtemelen this.hide ile gizleyip ikinci sayfaya geçiyorsun, C#'ta ise açılış sayfası kapanmadan uygulama kapanmıyor. Dolayısıyla uygulamayı tamamen kapatabilmek için Form1'i kapatmak zorundasın. Geçmiş bir konu da buna şöyle bir yanıt vermiştim;
Teşekkürler bunun sorunumu çözeceğini düşünüyorum.
 

Yeni konular

Geri
Yukarı