[ Ivan Vasić @ 08.10.2003. 20:24 ] @
C# .NET
Recimo da imam formu i na njoj obican textBox i dugme. Klikom na dugme otvaram NOVU formu sa istim objektima (textBox i btn). Zelim da u novoj formi u textBox upisem neku vrednost i da klikom na btn izadjem a vrednost koju sam upisao da se pojavi na "staroj" formi. E ovo nisam uspeo da resim.
Jedini nacin koji C# nudi jeste kreiranje instance (normalna stvar) i onda lako spojis tekstove ta dva objekta. Evo na sta mislim :

Kod je u dogadjaju btn.Click nove forme :
Code:
 
frmGlavna frm = new frmGlavna();
frm.textBox.Text = this.textBox.Text();
frm.Show();


ALI ovim se pokazuje duplikat glavne forme sa trazenim vrednostima a plus jos postoji i ona od malopre. Moze naravno da se ugasi ta visak forma ali to nije resenje koje mi treba.
Problem UPROSCEN :
Da li je moguce i kako manipulisati objektima i svojstvima forme (uopsteno bilo kog objekta) ali BEZ kreiranja instance ?
To je recimo prosta stvar u Delphi-ju samo ukucas kod gde izjednacavas sta zelis i gotova stvar ali ovde nije tako.

Inace za odgovor sam ostao uskracen i od stranaca na forumu ASP.NET ... dal nisu znali ili je nemoguce ili mrze Srbe - ne znam
[ Deep|Blue @ 08.10.2003. 20:39 ] @
a sto jednostavno ne napravis globalnu promenjivu ???
[ -zombie- @ 08.10.2003. 20:43 ] @
niko ne mrzi srbe. (tj, dobro ajde, retko ko mrzi srbe ;)

ovo što ti hoćeš ne može ni u Delphiju.

nego, daj ti primer koda koji ti radi u delphiju, pa ću ti ja ili već neko prevesti na .net

[ Ivan Vasić @ 08.10.2003. 20:50 ] @
Citat:
Deep|Blue:
a sto jednostavno ne napravis globalnu promenjivu ???


Da ? Primer ?

A sto se tice Delphi-ja nemam ga trenutno tako da ne mogu da probam ali se secam da kad sam radio nesto u njemu (pre neku godinu) - sa ovim nije bilo problema.

[Ovu poruku je menjao Dragi Tata dana 08.10.2003. u 15:11 GMT]
[ -zombie- @ 08.10.2003. 20:59 ] @
ovo kako si ti zamislio ne može ni u današnjem, niti je moglo u verziji 1.0


[Ovu poruku je menjao Dragi Tata dana 08.10.2003. u 15:11 GMT]
[ Ivan Vasić @ 08.10.2003. 21:09 ] @
A opet sto se Delfija tice ne mogu da tvrdim dok ne probam a probacu i reci cu ti ako uspem.

Uzgred nisi razmotrio mogucnost da me nisi razumeo (ili da nisam lepo objasnio) sta sam hteo ?
[ Dragi Tata @ 08.10.2003. 21:14 ] @
Citat:
ivan@elfak:
Problem UPROSCEN :
Da li je moguce i kako manipulisati objektima i svojstvima forme (uopsteno bilo kog objekta) ali BEZ kreiranja instance ?


Hajde malo razjasni: kako to da manipulišeš svojstvima nečega ako to nešto ne postoji? Prvo kreiraš objekat, pa onda manipulišeš njime. Ili si mislio nešto drugo (onaj primer sa formom uopšte ne razumem)
[ Ivan Vasić @ 08.10.2003. 21:20 ] @
Citat:
Dragi Tata:
Hajde malo razjasni: kako to da manipulišeš svojstvima nečega ako to nešto ne postoji? Prvo kreiraš objekat, pa onda manipulišeš njime. Ili si mislio nešto drugo (onaj primer sa formom uopšte ne razumem)


Pazi to nesto postoji i ucitano je u memoriju tj. forma je PRIKAZANA na ekranu !
Problem je kako iz DRUGE forme promeniti BILO STA na formi koja je VEC PRIKAZANA a ne da pravim NEW objekat.

Jel sam uspeo malo da razjasnim svoju konfuznu poruku ?


[Ovu poruku je menjao Dragi Tata dana 08.10.2003. u 15:14 GMT]
[ degojs @ 08.10.2003. 21:22 ] @
Što se tiče deljenja podataka između objekata istog tipa, moguće je naravno, npr.

private static string x;

Kad klikneš na dugme u prvoj formi, recimo ovo:
Code:

x = this.TextBox1.Text
Form1 f2 = new Form1();
f2.TextBox1.Text = x;
f2.ShowDialog();


Ako je to ono što si hteo. Naravno, dodeljivanje vrednosti svojstvima samog objekta a bez kreiranja objekta nije moguće. static se odnosi na klasu i dele ga svi objekti klase. static podacima i funkcijama može da se pristupa i bez instanci klase, ali to kako rekoh nije vezano za niti jedan objekt konkretno, već za klasu.

Pozdrav.



[Ovu poruku je menjao degojs dana 08.10.2003. u 17:35 GMT]
[ degojs @ 08.10.2003. 21:25 ] @
Citat:
Problem je kako iz DRUGE forme promeniti BILO STA na formi koja je VEC PRIKAZANA a ne da pravim NEW objekat.


Pa dovoljno je da imaš referencu na objekt i da je svojstvo vidljivo, tj. dozvoljava promenu iz drugih objekata.

Konkretno, referencu možeš da proslediš prilikom kreiranja druge forme i to je to.

U prvoj formi npr. ovako nekako:

Code:

Form1 f2 = new Form1(this); // prosledi referencu na prvu formu
f2.ShowDialog();

Znači, samo odgovarajući konstruktor u Form1 i nema problema:
Code:

public Form1(Form1 f)
{
   InitializeComponent();
   System.Windows.Forms.MessageBox.Show(f.TextBox1.Text); // ispisuje tekst iz prve forme
}



/edit: ništa bitno izmenjeno - samo sam promenio forma u objekt da malo više generalizujem slučaj.

[Ovu poruku je menjao degojs dana 08.10.2003. u 17:44 GMT]
[ Ivan Vasić @ 08.10.2003. 21:40 ] @
Citat:
degojs:
Pa dovoljno je da imaš referencu na prvu formu i da je svojstvo vidljivo, tj. dozvoljava promenu iz druge forme. Referencu proslediš prilikom kreiranja druge forme i to je to.


Problem resen.

ustvari izgleda da nece. Evo sta sam uradio :
ovo se dogadja na Form1 neki btn.Click
Code:

Form2 frm = new Form2(this);
frm.Show();


pa onda u Form2
Code:

public Form2 (Form1 f)
{
..........
}


ali onda za f. - u padajucem meniju (intellisense menu) ne nalazim textBox niti bilo koju drugu kontrolu na formi 1. Mada moram da priznam ima mnogo vise svojstava nego bez ovog postupka.

Imas li ideju ? Ili sam negde zabrljao ?
[ -zombie- @ 08.10.2003. 22:09 ] @
Code:

class Form2 { 
    private Form1 MainFrm;
...

public Form2 (Form1 f)
{
    MainForm=f;
}

...

public onButtonClick( bla) {
    MainForm.bla.text=truc.text;
}




mada je ovo sve generalno glupo da druga forma pristupa glavnoj.

bolje potraži Form2.ShowModal() ili nešto slično (nemam .net, ali verovatno postoji), pa će izvršavanje prve forme pauzirati dok ne zatvoriš ovu drugu. kada je zatvoriš, lepo iz prve pročitaj text iz druge (referencu ka njoj već imaš), i upiši ga gde treba, i to je to
[ degojs @ 08.10.2003. 22:18 ] @
Citat:
ali onda za f. - u padajucem meniju (intellisense menu) ne nalazim textBox niti bilo koju drugu kontrolu na formi 1. Mada moram da priznam ima mnogo vise svojstava nego bez ovog postupka.


U konstruktoru svakako moraš da vidiš sve. Za ostale funkcije postupi ovako kako je zombi napisao. Ako slučajno neće, malo prodrmaj VS, može da se desi da intelisens poblesavi (mada, zaista retko u verziji 2003).
[ Deep|Blue @ 09.10.2003. 00:06 ] @
I varijanta
probaj da na formi 2 event kojim ces ocitati textbox.text
event aktiviras pri izlasku sa forme 2

na formi 1 cekas event i preuzmes vrednosti koje je ocitao na frm2.

II varijanta
definises globalnu promenjivu tekst_2
na formi 2
u textbox1_leave eventu u promenjivu tekst_2 upises vrednost textbox-a

na formi 1 event on activated
stavis teksbox_meta.text = tekst_2
[ Shadowed @ 09.10.2003. 00:38 ] @
Ne znam bas da li cu uspeti da izvedem ovo jer ne znam C# ali da pokusam:
Code:

Form2 frm = New Form2;
frm.Owner = This
frm.Show

Dalje u kodu za frm prvoj formi pristupas sa This.Owner.
[ Ivan Vasić @ 09.10.2003. 13:52 ] @
E hvala na svim odgovorima probacu izgleda mi da moze na vise nacina ali ono sto sam hteo sam uspeo da napravim uz pomoc degojs-ovog odgovora.
Radi kao sto je on napisao samo sam ja zaboravio da predefinisem kontrole u "public" pa se zato nisu videle u intelisense meniju ..... a da uzgred VS2002 stvarno ume da poblesavi sto se tog menija tice ... ne znam gde da nadjem 2003...
Hvala u svakom slucaju
[ mbran @ 27.07.2004. 00:20 ] @
Ja mislim, hocu da budem fin, hocu da kazem znam 100%, da jedini ko je bio u pravu je covek koji je rekao da ovaj problem treba da se resi koriscenjem Eventa.
Veoma je velika GRESKA da se u projektovanju programa bilo koji atribut (globalni)stavi kao Public. Svi atributi bi trebali da budu iskljcivo private ili protected, a ako hoces da pristupis tom atributu iz druge klase, onda se pravi takozvani Property koji je public. Ovo resenje preko eventa se u Design paternima inace naziva Mediator object.
[ nervozica @ 27.07.2004. 08:38 ] @
Kanda si malo zakasnio. Skoro pa godinicu :)
[ mmix @ 27.07.2004. 09:08 ] @
Pa dobro, nemojte čoveka u glavu, nov je ovde. Dobar deo novih korisnika da svoj doprinos kroz odgovaranje na temu koja je bila aktuelna nekada davno, valjda u procesu pregledavanja tih tema. Odgovor možda više nije aktuelan/potreban, ali je važna dobra volja da se pomogne.

Sa druge strane, ne valja mnogo kopati po prošlosti, svašta mož' da se pojavi tamo mbran, bolje otvori novu temu ako imaš nešto zanimljivo da podeliš sa forumom ili hoćeš da započneš diskusiju oko neke zanimljive problematike, vraćanje postojeće teme iz prošlosti retko kad ima neke praktične svrhe.
[ nervozica @ 28.07.2004. 08:34 ] @
Sorry, nije mi namera bila da vredjam ili plasim. Pokusao sam (izgleda neuspesno) da ispadnem duhovit.
[ mbran @ 28.07.2004. 11:24 ] @
Priznajem, ispao sam glup u drustvu, nije mi palo napamet da pogledam datum, tema mi se ucinila zanimljiva pa 'ajde da pomognem coveku. Naravno shvatio sam kao salu, nemoj nista da brines.
[ nervozica @ 29.07.2004. 08:45 ] @
cool