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

Problem sa formom u C#

[es] :: .NET :: Problem sa formom u C#

Strane: 1 2

[ Pregleda: 5069 | Odgovora: 27 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

TATATA
Nezaposlen
Čačak

Član broj: 309279
Poruke: 16



Profil

icon Problem sa formom u C#30.11.2012. u 09:06 - pre 138 meseci
Ćao,


nova sam na forumu, pa ako nisam postavila pitanje na pravom mestu ili na pravi način, reagujte.

Pravim formu u C# koja sadrži 3 kockice u razlicitim bojama (crvena, žuta, zelena), ime svake kockice, dva TextBox-a i button OK.

Na pocetku je zadato ime kockice i njena boja. Npr:
"prva" Green
"druga" Red
"treca" Yellow

Ovi podaci se čuvaju u Dictionary u formi:

public Dictionary<string, LightValue> Lights = new Dictionary<string, LightValue>();

Kockice, u stvari, simuliraju lampice, tj, ako korisnik unese "druga" Green i stisne OK, kockica pored druge treba da promeni boju u onu koju je korisnik uneo (Green). U formi će biti samo ove tri boje. Pri svakom unosu, radiće se UPDATE boje u Dictionary:

switch (args.Light.ToString())
{

case "Red":
Lights.Add(args.Name, Semafor.LightValue.Red); break;
case "Green":
Lights.Add(args.Name, Semafor.LightValue.Green); break;
.
.
.
}
Kad izvršim program, LightValue dobije novu vrednost, ali ne znam kako da promenim boju u formi.
Ako treba još neki podatak, tu sam.

Hvala unapred.



 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa formom u C#30.11.2012. u 10:23 - pre 138 meseci
Malo su nejasno postavljeni uslovi. Ne znam šta od ovog napisanog može, a šta ne može da se menja. Ne znam šta je poenta ovog zadatka, šta tačno želiš da postigneš, ili šta tačno neko drugi očekuje od tebe. Ne znam ni odakle ova promenljiva args, ni kako je ona povezana sa dva text boxa.

Ako prosto samo želiš da menjaš boje u tri kvadrata, a nije uopšte bitno kako ćeš to da uradiš onda ti nikakav Dictionary ni ne treba. Imaš dva TextBox-a, recimo da se zovu textBoxName i textBoxLight. Imaš tri labele koje treba bojiti, recimo da se zovu labelFirst, labelSecond, labelThird. U hendleru za klik na OK dugme treba ti kod nalik ovome:

Code:
System.Windows.Forms.Label target;

if (textBoxName.Text == "prva")
  target = labelFirst;
else if (textBoxName.Text == "druga")
  target = labelSecond;
else if (textBoxName.Text == "treca")
  target = labelThird;

System.Drawing.Color color;

if (textBoxLight.Text == "Red")
  color = Color.Red;
else if (textBoxLight.Text == "Yellow")
  color = Color.Yellow;
else if (textBoxLight.Text == "Green")
  color = Color.Green;

target.BackColor = color;


I to je to. Ali, ako baš potrebno da se koristi Dictionary onda umesto ovih if-else-if kobasica možeš da imaš dva rečnika koja se jednom inicijalizuju i više ne diraju. Jedan koji mapira string u Label, i drugi koji mapira string u Color, i onda bi u hendleru stajala samo jedna linija:

Code:
Targets[textBoxName.Text].BackColor = Colors[textBoxLight.Text];


Ili nešto slično. Ali, ako baš potrebno da se koristi Dictionary kojem će tokom rada da se menjaju podaci, može i to ali to je glupo, i to mi miriše da školske zadatke.
 
Odgovor na temu

TATATA
Nezaposlen
Čačak

Član broj: 309279
Poruke: 16



Profil

icon Re: Problem sa formom u C#30.11.2012. u 11:54 - pre 138 meseci
Evo screenshot, možda bude malo jasnije.

Kada pokrenem formu, kocka pored labela jupi je narandžasta.
Ako korisnik klikne OK, boja bi trebala da se izvrši Update u Dictionary i da se boja promeni u zelenu (TextBox2).
Label se ponaša kao primarni ključ, znači ne može da se menja. Moram da koristim Dictionary.

A args služi da primi podatke:
Code:

public class StisnuoEventArgs : EventArgs
    {
        public string Name { get; set; }
        public string Light { get; set; }
        
        public StisnuoEventArgs(string n, string l)
        { 
            Name = n;
            Light = l;
           
         }


public void Update(StisnuoEventArgs args)
        {
            foreach (KeyValuePair<string, LightValue> kvp in Lights)
            {
                if (args.Name == kvp.Key)
                {
                     switch (args.Light.ToString())
                    {
                        case "Red":
                            Lights.Add(args.Name, Semafor.LightValue.Red); break;
                        case "Green":
                            Lights.Add(args.Name, Semafor.LightValue.Green); break;
                        case "Orange":
                            Lights.Add(args.Name, Semafor.LightValue.Orange); break;
                    }
                    break;
                }



Nije školski zadatak, pokušavam da se zaposlim, a ovo je jedan od zadataka koje treba da rešim.
Prikačeni fajlovi
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa formom u C#30.11.2012. u 12:19 - pre 138 meseci
Navedi tačno, od reči do reči, uslov u kome se spominje Dictionary. Želim da znam kako Dictionary mora da se koristi.

U međuvremenu bih da primetim da je foreach petlja ovde višak. Ako samo želiš da proveriš da li se args.Name nalazi u rečniku onda skloni foreach, a if uslov stavi da bude "if (Lights.Values.Contains(args.Name))". I dalje mislim da je ovaj rečnik ovde ubačen na silu, ali da bih znao kako bolje iskoristiti uslov "mora da se koristi Dictionary", moram da znam kako tačno uslov glasi.

Takođe ne treba ti ToString() za args.Light, jer je to već samo po sebi string.

Još nešto, trenutno ne preterano bitno. Postoje razna mišljenja u vezi sa ne-engleskim rečima za imena klasa i promenljivih. Moje mišljenje je da treba koristiti isključivo engleski jezik za bilo šta u kodu. Srpski pišem samo u komentarima. Engleski nema padeže, ima više korisnih kratkih reči od srpskog, i kod se prosto lakše čita ako je samo na jednom jeziku.
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Problem sa formom u C#30.11.2012. u 12:56 - pre 138 meseci
Citat:
Mihajlo Cvetanović: Moje mišljenje je da treba koristiti isključivo engleski jezik za bilo šta u kodu. Srpski pišem samo u komentarima. Engleski nema padeže, ima više korisnih kratkih reči od srpskog, i kod se prosto lakše čita ako je samo na jednom jeziku.
Problem su domain specific termini. Na primer ako pravis program za klanicu pilica, ti odmah znas da pile ima batak, krilo, karabatak i mozes tako i da nazoves promenljivu ili klasu. Tih termina nekada ima izuzetno mnogo i tesko bi bilo naci odgovarajuce prevode na engleski.

Naravno, tu onda ima smesnih situacija kao GetPileWithoutBatak() :)
 
Odgovor na temu

TATATA
Nezaposlen
Čačak

Član broj: 309279
Poruke: 16



Profil

icon Re: Problem sa formom u C#30.11.2012. u 13:10 - pre 138 meseci
Obzirom da sam na probnom radu, usmeno su mi rekli sta treba da uradim.
Ovo je inicijalizacija:

Sem = new Semafor();
Sem.Dock = DockStyle.Top;
Sem.Lights.Add("jupi", Semafor.LightValue.Orange);
Sem.Lights.Add("ipuj", Semafor.LightValue.Red);
Sem.Lights.Add("piju", Semafor.LightValue.Green);
Stisnuo += new StisnuoDelegate(Sem.Update);
Controls.Add(Sem);
.
.
.
Sto se tice imena klasa i promenljivih, ovo je samo za test, a kad pisem glavni program, podrazumevaju se engleski izrazi.
Moza zvucim nepovezano, ali c# ucim tek dva meseca.

Hvala ti na dosadasnjim savetima.

Pozdrav.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa formom u C#30.11.2012. u 13:20 - pre 138 meseci
Ravni, slažem se da u opštem slučaju može da se desi da neki pojmovi nemaju prevod, ali što se tiče jestivih delova piletine to bar postoji, čak ima i članak na vikipediji, sa sve slikom :)

 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa formom u C#30.11.2012. u 13:48 - pre 138 meseci
Aha sad imamo nove informacije. Postoji već gotova klasa Semafor, koja je nekakva kontrola, i ima property Lights koji je Dictionary. E pa, odgovor na sva tvoja pitanja se nalaze u toj klasi. Ta klasa mora da ima neke metode za menjanje boje, ili propertije za pristup kontrolama od kojih je klasa sačinjena. Bez definicije klase teško da možemo da ti pomognemo.

EDIT: možda je upotreba jednostavna. Vidi da li ovo menja boju: Sem.Lights["jupi"] = Semafor.LightValue.Green;

[Ovu poruku je menjao Mihajlo Cvetanović dana 30.11.2012. u 15:00 GMT+1]
 
Odgovor na temu

TATATA
Nezaposlen
Čačak

Član broj: 309279
Poruke: 16



Profil

icon Re: Problem sa formom u C#30.11.2012. u 14:11 - pre 138 meseci
Code:


 public class Semafor : Panel
    {
        public enum LightValue { Red, Orange, Green }
        public Dictionary<string, LightValue> Lights = new Dictionary<string, LightValue>();

        public int NumLights
        {
            get
            {return Lights.Count;}

        }

        public Semafor()
        {

        }
        private delegate void UpdateDelegate();

        public void Update(StisnuoEventArgs args)
      {
        .
        .
        .
       }
  SolidBrush blueBrush = new SolidBrush(Color.Cyan); //za crtanje forme
           

            W0 = (width - L * 2) / Lights.Count;
            W2 = W0 - W1 - B - D;

            Graphics G = e.Graphics;
            e.Graphics.FillRectangle(blueBrush, X, Y, width, height);

            foreach (KeyValuePair<string, LightValue> kvp in Lights)
            {                
                switch (kvp.Key)
                {
                    case "jupi":
                        {
                            SolidBrush orangeBrush = new SolidBrush(Color.Orange);
                            e.Graphics.FillRectangle(orangeBrush, X1, Y1, H1, W1);
                            X += space;

                             G.DrawString(kvp.Key, Font, new SolidBrush(ForeColor), new PointF(Left, Top));
                              // X += L;
                               X1 += W0;
                               Left += W0;
                               break;
                        }
                 
                        .
                        .        



Hvala jos jednom.



 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa formom u C#30.11.2012. u 14:40 - pre 138 meseci
Vidi da li ovo menja boju:

Code:
Sem.Lights["jupi"] = Semafor.LightValue.Green;
Sem.Invalidate();
 
Odgovor na temu

TATATA
Nezaposlen
Čačak

Član broj: 309279
Poruke: 16



Profil

icon Re: Problem sa formom u C#30.11.2012. u 15:09 - pre 138 meseci
Ne menja :(
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa formom u C#30.11.2012. u 15:29 - pre 138 meseci
Pitaj onog ko je napravio Semafor klasu da ti kaže kako se menja boja.
 
Odgovor na temu

ravni

Član broj: 8894
Poruke: 373



+15 Profil

icon Re: Problem sa formom u C#30.11.2012. u 15:48 - pre 138 meseci
Citat:
Mihajlo Cvetanović:
Ravni, slažem se da u opštem slučaju može da se desi da neki pojmovi nemaju prevod, ali što se tiče jestivih delova piletine to bar postoji, čak ima i članak na vikipediji, sa sve slikom :)
Pa da, ali tu se Pandorina kutija tek otvorila. Sledece sto ce biti potrebno su imena procesne opreme, tipa onih pokretnih stvari sa kukama, pa razni nozevi i ostraci, pa zastitna odela.. Hocu da kazem da se retko kada isplati biti iskljuciv :)
 
Odgovor na temu

plague
Software Developer
Auckland, NZ

Član broj: 46734
Poruke: 623
*.dynamic.sbb.rs.



+373 Profil

icon Re: Problem sa formom u C#30.11.2012. u 16:33 - pre 138 meseci
Mislim da ovaj deo menja boju:
Code (csharp):

                    case "jupi":
                        {
                            SolidBrush orangeBrush = new SolidBrush(Color.Orange);
                            e.Graphics.FillRectangle(orangeBrush, X1, Y1, H1, W1);
                            X += space;

                             G.DrawString(kvp.Key, Font, new SolidBrush(ForeColor), new PointF(Left, Top));
                              // X += L;
                               X1 += W0;
                               Left += W0;
                               break;
                        }
 

Hajde postavi ceo projekat, posto taj drugi deo koda koji si kopirala "visi" van funkcije, a sigurno nije tako.
 
Odgovor na temu

TATATA
Nezaposlen
Čačak

Član broj: 309279
Poruke: 16



Profil

icon Re: Problem sa formom u C#30.11.2012. u 16:54 - pre 138 meseci
Taj kod se izvršava kada se pokrene forma.

Ne mogu na ovaj način da menjam boju (mogu, ali nema smisla) jer ću onda morati "peške" da unesem sve varijante , zato što u metodi FillRectangle moram da dam koordinate kvadrata. Kako imam 3 kvadrata sa po tri moguće boje, to je baš mnogo koda.
Ili, možda postoji neko jednostavnije rešenje?
 
Odgovor na temu

plague
Software Developer
Auckland, NZ

Član broj: 46734
Poruke: 623
*.dynamic.sbb.rs.



+373 Profil

icon Re: Problem sa formom u C#30.11.2012. u 17:45 - pre 138 meseci
Ako je to zadatak, mozda zele da napises funkciju koja ce menjati boju?

U onom delu je napisano kako se inicijalizuje na te pocetne boje, iskoristi to da napises funkciju. Ili nam posalji ceo projekat da vidimo ima li takve funkcije vec ili ne.
 
Odgovor na temu

Mare_TS
Marko Pravdic
Software Engeneer - Microsoft .NET
Beograd, Banovo Brdo

Član broj: 62586
Poruke: 35



+1 Profil

icon Re: Problem sa formom u C#03.12.2012. u 10:04 - pre 138 meseci
Prvo treba da setuješ novu vrednost u Dictionary Lights a potom da izvršiš explicitni update kontrole i to istom metodom kojom se i iscrtava grafik (Sem.Update())

Tako da probaj:
Citat:
Mihajlo Cvetanović: Vidi da li ovo menja boju:

Code:
Sem.Lights["jupi"] = Semafor.LightValue.Green;
Sem.Update()

Eventualno trebaš da se pozoveš Refresh na panelu (sem.Refresh()) da bi se ponovo iscrtao. Malo je nejasno definisana Update metoda u gornjem postu. ;)
 
Odgovor na temu

Boyka
BPS

Član broj: 287185
Poruke: 338
*.dynamic.isp.telekom.rs.



+33 Profil

icon Re: Problem sa formom u C#04.12.2012. u 14:44 - pre 138 meseci
Vrhunac off-a je kad se tema o C#-u pretvori u temu o pilicima. lol

Najbolje bi bilo da okačiš taj projekat ovde...
 
Odgovor na temu

TATATA
Nezaposlen
Čačak

Član broj: 309279
Poruke: 16



Profil

icon Re: Problem sa formom u C#04.12.2012. u 16:15 - pre 138 meseci
Code:

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

namespace Semafor
{
    public partial class Form1 : Form
    {
        private Panel panel1;
        private TextBox LightBox;
        private TextBox NameBox;
        private Button GoBox;
        private Semafor Sem;

        public Form1()
        {
            InitializeComponent();
            Sem = new Semafor();
            Sem.Dock = DockStyle.Top;
            Sem.Lights.Add("jupi", Semafor.LightValue.Orange);
            Sem.Lights.Add("ipuj", Semafor.LightValue.Red);
            Sem.Lights.Add("piju", Semafor.LightValue.Green);           
            Push += new PushDelegate(Sem.Update);
            Controls.Add(Sem);

           
        }

        private void InitializeComponent()
        {
            this.panel1 = new System.Windows.Forms.Panel();
            this.GoBox = new System.Windows.Forms.Button();
            this.NameBox = new System.Windows.Forms.TextBox();
            this.LightBox = new System.Windows.Forms.TextBox();
            this.panel1.SuspendLayout();
            this.SuspendLayout();
            .
            .
            .

        }     

        public delegate void PushDelegate(PushEventArgs args);
        public event PushDelegate Push;

        private void OnPush(PushEventArgs args)
        {
            Console.WriteLine(args.ToString());
            if (Push != null)
            {
                Push(args);
            }
        }

        private void GoBox_Click(object sender, EventArgs e)
        {
            OnPush(new PushEventArgs(NameBox.Text, LightBox.Text));
        }

    }

    public class PushEventArgs : EventArgs
    {
        public string Name { get; set; }
        public string Light { get; set; }
        
        public PushEventArgs(string n, string l)
        { 
            Name = n;
            Light = l;
           
         }
        public override string ToString()
        {
            return "Name = " + Name + ", Light = " + Light;
        }
    }
}



namespace Semafor
{

    public class Semafor : Panel
    {
        public enum LightValue { Red, Orange, Green }
        public Dictionary<string, LightValue> Lights = new Dictionary<string, LightValue>();

        public int NumLights
        {
            get
            {return Lights.Count;}

        }

        public Semafor()
        {

        }
       
        private delegate void UpdateDelegate();
 
        public void Update(PushEventArgs args)
        {
            foreach (KeyValuePair<string, LightValue> kvp in Lights)
            {
                if (args.Name == kvp.Key)
                {                 
                   switch (args.Light)
                    {
                        case "Red":                            
                            Lights.Add(args.Name, Semafor.LightValue.Red);                                                   
                            break;
                        case "Green":
                            Lights.Add(args.Name, Semafor.LightValue.Green);                           
                            break;
                        case "Orange":
                            Lights.Add(args.Name, Semafor.LightValue.Orange); break;
                    }
                    break;
                }
                                                   
            }             
               if (InvokeRequired)
                    BeginInvoke(new UpdateDelegate(Invalidate));
                else
                    Invalidate();
                  
            }

        float X0 = 0.0F;
        float X = 0.0F;
        float Y = 0.0F;
        int width = 165;
        float height = 26.0F;
        int L = 3;
        float D = 3.0F;
        float B = 3.0F;
        int W0 = 0;
        float W2 = 0F;
        int space = 23;

        protected override void OnPaint(PaintEventArgs e)
        {

            float X1 = 3.0F;
            float Y1 = 3.0F;
            float W1 = 20.0F;
            float H1 = 20.0F;
            int Left = 24;
            int Top = 5;

            SolidBrush blueBrush = new SolidBrush(Color.Cyan);
           

                W0 = (width - L * 2) / Lights.Count;
            W2 = W0 - W1 - B - D;
            Graphics G = e.Graphics;
            e.Graphics.FillRectangle(blueBrush, X0, Y, width, height);

            foreach (KeyValuePair<string, LightValue> kvp in Lights)
            {                
                switch (kvp.Key)
                {
                    case "jupi":
                        {
                            SolidBrush orangeBrush = new SolidBrush(Color.Orange);
                            e.Graphics.FillRectangle(orangeBrush, X1, Y1, H1, W1);
                            X += space;

                             G.DrawString(kvp.Key, Font, new SolidBrush(ForeColor), new PointF(Left, Top));
                               X += L;
                               X1 += W0;
                               Left += W0;
                               break;
                        }
                    case "ipuj":
                       {
                        .
                        .
                        .
                        }
                    default:                        
                        {
                            SolidBrush orangeBrush = new SolidBrush(Color.Blue);
                            e.Graphics.FillRectangle(blueBrush, X1, Y1, H1, W1);
                            X += space;

                            G.DrawString("Error", Font, new SolidBrush(ForeColor), new PointF(Left, Top));
                            X += L;
                            X1 += W0;
                            Left += W0;
                            break;
                        }
                    }
            }
        }
    }
}

 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Problem sa formom u C#05.12.2012. u 09:53 - pre 138 meseci
Čudna mi je funkcija Semafor.Update: ako postoji ključ u rečniku onda dodaj još jedan taj ključ u rečnik. To će da baca exception. Umesto Lights.Add(x, y) u toj funkciji treba da stoji Lights[x] = y. Da li si ti pisala tu funkciju, ili ti je data? Šta se tačno desi kad klikneš na Go?
 
Odgovor na temu

[es] :: .NET :: Problem sa formom u C#

Strane: 1 2

[ Pregleda: 5069 | Odgovora: 27 ] > FB > Twit

Postavi temu Odgovori

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