[ Marko Simulak @ 04.04.2013. 21:02 ] @
Pozdrav svima, imam problem u radu sa formama. Naime, program treba ovo da radi:

Forma1 >> Forma1.Hide >> klik na "show" ikonu iz notifikacija, contextMenuStrip; >> Forma2 >> klik na "button" >> Forma1.

E sad ... Pravi mi problem i javlja mi gresku ("An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll"), i TO samo u slucaju kada stavim:
Code:
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        Form1 f1 = new Form1(); // GENERISEM FORMU 1 U FORMI 2, NA POCETKU

A sad..ako generisem formu >> button_click << prodje, ali mi OTVORI formu 1 kao da nista nisam pisao, menjao, kao pocetnu, tj NE OTVORI sa sacuvanim podacima, nego kao neki reset uradi, a pri tom se stvori jos 1 ikonica u toolbaru, kao 2 ista programa....

Da li neko zna u cemu je fora?

Hvala.
[ Marko Simulak @ 04.04.2013. 21:22 ] @
U sustini zanima me kako da menjam, da radim sa 2 forme (Show, Hide). Sad sam probao samo najosnovinije i opet mi javlja isto.

Code:
public Form1()
        {
            InitializeComponent();
        }

        Form1 f = new Form1();                                 //JAVLJA ONU GRESKO OD GORE
        
        private void button1_Click(object sender, EventArgs e)
        {
            
            f.Show();
            this.Hide();
        }

Code:
public Form1()
        {
            InitializeComponent();
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            Form1 f = new Form1();                //OTVARA NOVU FORMU 1

            f.Show();
            this.Hide();
        }
[ dusans @ 04.04.2013. 23:27 ] @
Ovako nekako:
Code:

        public Form1()
        {
            InitializeComponent();
        }
        
        Form2 f;
        private void button1_Click(object sender, EventArgs e)
        {
            if (f == null) f = new Form2();
            f.Show();
            this.Hide();
        }

        ...

        public Form2()
        {
            InitializeComponent();
        }
        
        Form1 f;
        private void button1_Click(object sender, EventArgs e)
        {
            if (f == null) f = new Form1();
            f.Show();
            this.Hide();
        }

        ...
[ Marko Simulak @ 05.04.2013. 13:15 ] @
Ali i to mi otvara novu formu 1... Evo pojasnjenja na slikama...

[ ravni @ 05.04.2013. 13:26 ] @
Vidi jel ovo to sto hoces.
Code:
private void button1_Click(object sender, EventArgs e)
{
  Form1 f = new Form1();          
  Hide();
  f.ShowDialog();
  Show();
}
[ Marko Simulak @ 05.04.2013. 13:50 ] @
I dalje mi samo otvara formu za formom..
Probao sam u delfiju, tamo radi bez problema...(Ostane ono sto je napisano u textBoxu)..
[ plague @ 05.04.2013. 14:53 ] @
Problem je zasto sto u Form2 ti pravis novu instancu Form1 umesto da otvoris postojecu. Dodaj nov property u Form2
Code (csharp):

Form1 ParentForm { get; set; }

A zatim dopisi u Form2 klasi:
Code (csharp):

public Form2(Form1 parent) :base() { this.ParentForm = parent; }

Zatim kada hoces da pokrenes iz Form1 novu Form2 koristi liniju:
Code (csharp):

Form2 f2 = new Form2(this);
f2.Show();
this.Hide();

A iz Form2 kada hoces da pokazes Form1:
Code (csharp):

ParentForm.Show();
this.Hide();


P.S. Nisam dugo radio sa winforms, moguce je da vec postoji konstruktor sa parametrom parent.
[ Marko Simulak @ 05.04.2013. 15:23 ] @
Dobro je radi..Nego me zanima da li mogu da napravim i pozivam "child" form kao ovu Form2?
Zanima me zato sto u programu, kada mi je ikonica u toolbaru, znaci kada je Form1.Hide()...i kada otvorim Formu2 da bih otvorio formu1, otvori mi se jos jedna Form2, isto dole ikonica...
[ plague @ 05.04.2013. 15:50 ] @
Vidi da li ti bool property .ShowInTaskbar odgovara sa skirvanje iz Taskbara.

Nisam siguran na sta mislis kada kazes "child", ali ako hoces da imas samo jednu Form2 a ne da pravis novu svaki put, i da sacuvas njeno stanje (kao sto hoces da cuvas stanje Form1), mozes to uraditi ovako:
Code (csharp):

Form2 _childForm;
Form2 ChildForm
{
     get {
          if(_childForm == null)
               _childForm = new Form2(this);
          return _childForm;
     }
     set { _childForm = value; }
}
 
[ Marko Simulak @ 05.04.2013. 15:50 ] @
Ustvari sada koliko vidim, otvori mi jos jednu formu1, ali radim sa onom sto sam vec radio...Jel moguce da mi notificationBar ili contextMenuStrip pravi problem?
[ dusans @ 05.04.2013. 16:08 ] @
Nije moguce da ti to pravi problem vec si zaista instancirao 2 puta formu 1 ili 2 puta formu 2 ili stagod da ti se vec desava.
Ako dolazis iz Delphija, nije mi jasno kako si tamo radio i do sad nisi naucio najbanalnije koncepte OOP-a koji vaze svuda
dal radio u .Net-u, Javi, Delphiju, ...
Uzmi najosnovniji tutorijal koji se tice OOP-a (i sintakse u C#) i prouci malo sta je instanca, staticke metode, varijable i
sve ce ti se samo kazati.
Umesto jednog dana ucenja i shavatanja sustine ti mozes sad da eksperimentises 10 dana i da postavljas mesec dana
pitanja po forumima i da trazis resenja a da ti i dalje ne bude jasno.
[ Marko Simulak @ 05.04.2013. 17:13 ] @
Hah, pa nije bas da dolazim iz delfija, tamo sam samo probao, u pravu ste sto se toga tice, da bih trebao da pocnem iz pocetka, i obratim paznju na propuste...
Inace, program mi radi ono za sta je namenjen, s tim sto mi to dole u toolbaru svaki put ulepsa za jos jednu ikonicu.
Ostalo je mozda da nadjem best solution...

Evo inace na sta mislim...

Hvala svima
[ plague @ 05.04.2013. 17:26 ] @
Tesko da mozemo da ti pomognemo bez malo boljeg uvida u kod. Verovatno je problem sto prozore ne zatvaras nego ih skrivas, pa oni ostaju u memoriji.

Inace, dosao sam u priliku da testiram i meni na Windows 7 sa Hide() sakrije i prozor u taskbaru, tako da se u taskbaru nalazi samo aktivna (vidljiva) forma.
[ Marko Simulak @ 05.04.2013. 17:45 ] @
Naravno.. Username = Marko, Pass = 1234. Evo koda:
>> FORMA 1
Code:

public partial class Form1 : Form
    {
            RegistryKey RunKljuc = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);     //Pokretanje programa na start racunara (StartUp)
            RegistryKey TimeKljuc = Registry.CurrentUser.CreateSubKey("ShutDownTimer");                                           //Kreiranje reg. kljuca

       public Form1()
        {
            RunKljuc.SetValue("ShutDown", Application.ExecutablePath.ToString());                                                //RUN (StartUp)
            InitializeComponent();
        }

        int minutaOdbrojavanje, vrednostReg, preostaloVremena;                           

        //NA DUGME SHUTDOWN GASI, ILI STARTUJE TIMER

        private void dugmeGasi_Click(object sender, EventArgs e)
        {
            try
            {
                if (RadiSvakiDan.Checked)
                {
                    vrednostReg = minutaOdbrojavanje;

                    TimeKljuc.SetValue("Svaki dan", vrednostReg);
                    TimeKljuc.SetValue("Preostalo", vrednostReg);

                    timer1.Start();
                }
                else
                {
                    TimeKljuc.SetValue("Svaki dan", 0);
                    TimeKljuc.SetValue("Preostalo", 0);

                    timer1.Start();
                }

                this.Hide();
                this.ShowInTaskbar = false;
            }

            catch (Exception ex)
            {
                MessageBox.Show("Unesi podatke.", "Greska");
            }
        }

        //NA DUGME U REDU DODAJE VREDNOST IZ TEXT BOXA U LABELU

        private void URedu_Click(object sender, EventArgs e)
        {
            try
            {
                minutaOdbrojavanje = Convert.ToInt32(tbMinuta.Text) * 60;
                lbVreme.Text = minutaOdbrojavanje.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Unesi podatke.", "Greska");
            }
        }

        //TIMER

        private void timer1_Tick(object sender, EventArgs e)
        {
            minutaOdbrojavanje--;
            lbVreme.Text = minutaOdbrojavanje.ToString();
            tsOdbrojavanje.Text = minutaOdbrojavanje.ToString();                      //U contextMenuStrip imam TextBox, tako da mogu da proverim koliko vremena je jos ostalo...

            if (Convert.ToInt32(TimeKljuc.GetValue("Svaki dan")) > 0)                 //U slucaju da se izadje iz programe pre isteka vremena, pamti se koliko je jos vremena ostalo
            {
                preostaloVremena = minutaOdbrojavanje;
                TimeKljuc.SetValue("Preostalo", preostaloVremena);
            }
            
            if (minutaOdbrojavanje == 0)
            {
                preostaloVremena = 0;
                TimeKljuc.SetValue("Preostalo", preostaloVremena);
                System.Diagnostics.Process.Start("shutdown.exe", "-s -t 0");
                Application.Exit();
            }
        }

        //PRI POKRETANJU PROGRAMA PROVERA SE DA LI JE PREOSTALO VREMENA, AKO JESTE NASTAVLJA SE ODBROJAVANJE...

        private void Form1_Load(object sender, EventArgs e)
        {
            DateTime vremeGasenja = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0, 0);

            int mesec = vremeGasenja.Month;
            int dan = vremeGasenja.Day;

            if (DateTime.Now.Day == dan && DateTime.Now.Month == mesec)
            {
                if (Convert.ToInt32(TimeKljuc.GetValue("Svaki dan")) > 0)
                {
                    if (Convert.ToInt32(TimeKljuc.GetValue("Preostalo")) > 0)
                    {
                        minutaOdbrojavanje = Convert.ToInt32(TimeKljuc.GetValue("Preostalo"));
                        timer1.Start();
                    }
                    else
                    {
                        minutaOdbrojavanje = Convert.ToInt32(TimeKljuc.GetValue("Svaki dan"));
                        timer1.Start();
                    }

                    this.Hide();
                    this.ShowInTaskbar = false;
                }
            }
        }

        //NA MINIMIZE SAKRIVA FORMU

        protected override void OnResize(EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)
            {
                this.ShowInTaskbar = false;
                //notifyIcon1.Visible = true;
                this.Hide();
            }
        }

        //NA SHOW IZ CONTEXTMENU-A PRIKAZUJE FORMU 2

        private void tsShow_Click(object sender, EventArgs e)
        {
            try
            {
                Form2 f2 = new Form2(this);

                f2.Show();
                this.Hide();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //RESETOVANJE SVEGA

        private void tbMinuta_KeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                if (e.KeyCode == Keys.F11)
                {
                    timer1.Stop();
                    lbVreme.Text = "";
                    tsOdbrojavanje.Text = "";

                   TimeKljuc.SetValue("Svaki dan", 0);
                   TimeKljuc.SetValue("Preostalo", 0);

                    Application.Exit();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //KLIK NA "X" PITA DA LI ZELIS DA IZADJES IZ PROGRAMA

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (e.CloseReason == CloseReason.UserClosing)
                {
                    DialogResult zatvori = MessageBox.Show("Da li zelite da zatvorite program?", "ShutDown", MessageBoxButtons.YesNo);

                    if (zatvori == DialogResult.Yes)
                        Application.Exit();
                    else
                        e.Cancel = true;
                }
                else
                    Application.Exit();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //DUPLI KLIK NA IKONICU U TOOLBARU, RADI ISTO STO I SHOW...

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            try
            {
                Form2 f2 = new Form2(this);

                f2.Show();
                this.Hide();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

>> FORMA 2
Code:

 public Form2(Form1 parent)
            : base()
        {
            InitializeComponent();
            this.ParentForm = parent;
        }

        Form1 ParentForm { get; set; }

        const string USER = "Marko";                      //USERNAME
        const int PASS = 1234;                           //PASSWORD

        //NA DUGME OK PROVERAVA DA LI SU UNETI PODACI TACNI, AKO JESU OTVORI FORMU 1

        private void dugmeOk_Click(object sender, EventArgs e)
        {
            try
            {

                if (tbUser.Text == USER && Convert.ToInt32(tbPass.Text) == PASS)
                {
                    Form1 f1 = new Form1();

                    ParentForm.Show();
                    ParentForm.ShowInTaskbar = true;
                    tbUser.Text = "";
                    tbPass.Text = "";
                    this.Hide();
                }
                else
                    MessageBox.Show("Pogresni podaci.", "GRESKA!");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Pogresni podaci.", "GRESKA!");
            }
        }

        //NA "X" MI SAKRIJE FORMU 2

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                if (e.CloseReason == CloseReason.UserClosing)
                {
                    e.Cancel = true;
                    this.Hide();
                }
                else
                    Application.Exit();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Pogresni podaci.", "GRESKA!");
            }
        }

        //ISTO KAO DUGME OK, SAMO ULAZAK NA "ENTER"...

        private void tbPass_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                try
                {
                    Form1 f1 = new Form1();

                    ParentForm.Show();
                    ParentForm.ShowInTaskbar = true;
                    tbUser.Text = "";
                    tbPass.Text = "";
                    this.Hide();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Pogresni podaci.", "GRESKA!");
                }
            }
        }
    }
[ plague @ 05.04.2013. 18:27 ] @
Evo greske na prvi pogled:
Code (csharp):

if (tbUser.Text == USER && Convert.ToInt32(tbPass.Text) == PASS)
                {
                    Form1 f1 = new Form1(); //Bespotrebna linija

                    ParentForm.Show();
                    ParentForm.ShowInTaskbar = true;
 

Nema potrebe da ponovo incijalizujes f1 jer je parent vec inicijalizovan. Ovim ces samo napraviti novu instancu Form1 klase.
Ako ovo ne resi problem pogledacu kasnije detaljnije.
[ Marko Simulak @ 05.04.2013. 19:15 ] @
E jeste, kako li mi je to promaklo...

Hvala :D