Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Komuniciranje između formi - C#

[es] :: .NET :: .NET Desktop razvoj :: Komuniciranje između formi - C#

[ Pregleda: 3009 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
*.adsl-3.sezampro.yu.



+2 Profil

icon Komuniciranje između formi - C#17.10.2007. u 20:38 - pre 200 meseci
Kolege forumaši, odlučio sam da napišem ovaj tekst koji će pomoći početnicima da lakše savladaju komuniciranje između formi. Podruzemva se da znate šta su eventi i delegati. Ukoliko ne znate šta su, pročitajte neki tutorial na netu jer je njihovo razumevanje važno za tekst koji sledi.
Sve kritike (pozitivne ili one pljuvatorske) su dobrodošle.. Pa da počnem:

Imamo sledeći zadatak:

Napraviti dve forme: Form1 i Form2. Dok je Form1 aktivna, pritiskom tastera Ctrl + K otvara se Form2. Form2 sadrži 3 track bar-a. Njihova vrednost može biti od 0 do 255 i svaki od njih predstavlja jednu od 3 RGB komponente. Promenom vrednosti track barova, menja se BackGround color forme Form1. Korisnik može otvoriti proizvoljan broj formi Form2, ali svaka forma mora imati povratnu informaciju kada je došlo do promene BackGround color forme Form1 kako bi vrednosti track barova u tim formama bile ažurirane.

To bi trebalo da izgleda kao na slici ispod.


Novom projektu dodajte 2 forme: Form1 i Form2.
U Form2 potrebno je uraditi sledeće:
Dodati 3 track bar-a.
Za maximum staviti 255, a za TickFrequency 20.
Selektovati sva 3 track bara i u event prozoru napraviti zajednički Scroll event pod nazivom Skrolovanje.


Postaviću ceo kod za Form1 i Form2 pa ću objašnjavati deo po deo.

Form1
Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace boranija
{
    public delegate void ColorDelegate(Color c);

    public partial class Form1 : Form
    {
        public event ColorDelegate PromenilaSeBoja;

        public Form1()
        {
            InitializeComponent();
            KeyPreview = true;
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control == true && e.KeyCode == Keys.K)
            {
                Form2 f = new Form2();
                f.SetBoja(BackColor);
                f.SkrolovaoSeTrackBar += new ColorDelegate(PromeniBoju);
                PromenilaSeBoja += new ColorDelegate(f.SetBoja);
                f.Show();
            }
        }

        void PromeniBoju(Color c)
        {
            BackColor = c;
        }

        private void Form1_BackColorChanged(object sender, EventArgs e)
        {
            if (PromenilaSeBoja != null)
                PromenilaSeBoja(BackColor);
        }
       
    }
}


Form2
Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace boranija
{
    public partial class Form2 : Form
    {
        public event ColorDelegate SkrolovaoSeTrackBar;

        public Form2()
        {
            InitializeComponent();
        }

        public void SetBoja(Color c)
        {
            trackBar1.Value = c.R;
            trackBar2.Value = c.G;
            trackBar3.Value = c.B;
        }

        private void Skrolovanje(object sender, EventArgs e)
        {
            if (SkrolovaoSeTrackBar != null)
                SkrolovaoSeTrackBar(Color.FromArgb(trackBar1.Value, trackBar2.Value, trackBar3.Value));
        }

    }
}


U konstruktoru forme Form1 stoji
Code:
KeyPreview = true;

Time smo rekli da će svi key događaji prvo biti prosleđeni formi umesto kontroli koja ima fokus.
U KeyDown događaju otvaramo formu Form2 ako je pritusnuta kombinacija tastera Ctrl + K:
Code:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control == true && e.KeyCode == Keys.K)
    {
         Form2 f = new Form2();
         ...
         f.Show();
    }
}


Pravimo fju za promenu boje pozadine:
Code:

void PromeniBoju(Color c)
{
      BackColor = c;
}


Negde u okviru namespace-a, a izvan klase Form1, deklarišemo sledeći delegat:
Code:
public delegate void ColorDelegate(Color c);

On je zajednički za sve klase iz tog namespace-a.

U klasi Form1 potrebno je deklarisati sledeći događaj koji će se pozivati svaki put kada se promeni BackColor forme Form1:
Code:
public event ColorDelegate PromenilaSeBoja;


Za sada nećemo registrovati taj događaj, ali ćemo ga pozvati u BackColorChanged događaju:
Code:

private void Form1_BackColorChanged(object sender, EventArgs e)
{
     if (PromenilaSeBoja != null)
       PromenilaSeBoja(BackColor);
}


U formi Form2 potrebno je napraviti f-ju koja će postaviti vrednosti track bar-ova u zavisnosti boje.
Code:

public void SetBoja(Color c)
{
    trackBar1.Value = c.R;
    trackBar2.Value = c.G;
    trackBar3.Value = c.B;
}


Deklarišemo događaj koji će se desiti kada se skroluje neki track bar
Code:

public event ColorDelegate SkrolovaoSeTrackBar;


Taj događaj još uvek ne registrujemo ali ga pozivamo u događaju Skrolovanje koji je zajednički Scroll događaj za sva 3 track bar-a
Code:

private void Skrolovanje(object sender, EventArgs e)
{
    if (SkrolovaoSeTrackBar != null)
        SkrolovaoSeTrackBar(Color.FromArgb(trackBar1.Value, trackBar2.Value, trackBar3.Value));
}


Na kraju ostalo je još da registrujemo sve neregistrovane događaje.
Vratimo se na KeyDown događaj forme Form1.

Pravimo referencu f na formu Form2
Code:

Form2 f = new Form2();


Podešavamo vrednosti track bar-ova
Code:

f.SetBoja(BackColor);


Registrujemo događaj forme Form2 tako da svaki put kad se izvrši skrolovanje, pozove se funkcija PromeniBoju koja menja boju pozadine u zavisnosti vrednosti track bar-ova
Code:

f.SkrolovaoSeTrackBar += new ColorDelegate(PromeniBoju);


Registrujemo događaj PromenilaSeBoja forme Form1 koji će pozvati f-ju SetBoja forme Form2 koja će promeniti vrednosti track bar-ova svaki put kada se promeni boja pozadine forme Form1
Code:

PromenilaSeBoja += new ColorDelegate(f.SetBoja);


I na kraju prikazujemo formu Form2
Code:

f.Show();



Zahvaljujem se svima koji su izdržali i pročitali ovaj tutorial do kraja!
U prilogu šaljem izvršnu verziju programa gde možete videti kako to sve treba da radi.

Prilikom pisanja ovog tutorijala nije povređena ni jedna životinja!
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
Prikačeni fajlovi
 
Odgovor na temu

sivan347
.NET Programer
Beograd

Član broj: 84406
Poruke: 101
*.fiberop.matgnet.com.



Profil

icon Re: Komuniciranje između formi - C#18.10.2007. u 15:21 - pre 200 meseci
Evo jedan primer komunikacije izmedju formi bez koriscenja eventa i delegata.

http://www.c-sharpcorner.com/U...7012304AM/LimitedDataXfer.aspx
 
Odgovor na temu

toxi_programer
Nemanja Todić
Beograd

Član broj: 104396
Poruke: 464
*.adsl-1.sezampro.yu.

Sajt: www.articles411.com


+8 Profil

icon Re: Komuniciranje između formi - C#18.10.2007. u 15:54 - pre 200 meseci
Hihi nije povređena ni jedna životinja

Ja sam pročitao sve do kraja koda i pošto sam ga razumeo dalje čito nisam a mogu da kažem da mi se dopada kako si napisao kod.
Svaka pohvala na trudu, ipak nije lako napisati 'volki tekst a da ni jedna životinja ne bude povređena


 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
*.adsl-4.sezampro.yu.



+2 Profil

icon Re: Komuniciranje između formi - C#18.10.2007. u 16:55 - pre 200 meseci
Citat:
sivan347: Evo jedan primer komunikacije izmedju formi bez koriscenja eventa i delegata.


To je one way komunikacija. Ja sam postavio primer komunikacije u oba smera.
Prosleđivanje reference jedne forme konstruktoru druge forme je jedno izuzetno lame rešenje. Nedostaci su brojni, a u nekim narednim tekstovima ću to detaljnije obrazložiti.
A da mi neko u firmi napiše ovo:
Code:
f.lblCity.Text = textBox3.Text;

Strašno!
Ja ovde pokušavam da objasnim kako se vrši komunikacija između formi, a kod koji si postavio je ono kako ne treba da se radi i nešto što je suprotno svim principima OOP.

@toxi_programer
Drago mi je da se barem nekom dopada =)
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

toxi_programer
Nemanja Todić
Beograd

Član broj: 104396
Poruke: 464
*.adsl-1.sezampro.yu.

Sajt: www.articles411.com


+8 Profil

icon Re: Komuniciranje između formi - C#18.10.2007. u 18:36 - pre 200 meseci
Bah, pa nije to samo da se meni dopada ima ih još no nejavljaju se svi sa komentarima

Postavio sam tekst na još jedan sajt, da ne ostane neko uskraćen za njega.

Pozdrav i iščekujem te naredne, naprednije tekstove koje si najavio.
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Komuniciranje između formi - C#

[ Pregleda: 3009 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.