|
[ 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
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|