» »

C# povezava forma in classa

C# povezava forma in classa

Miko55 ::

Sledeča naloga/problem je zgolj da skapiram kako gre.

V formu sta 2 gumba in 2 textboxa. Ko kliknemo na gumb1 se v textbox1 vpiše vrednost spremenljivke a, ko pa kliknemo gumb2 pa se vpiše vrednost spremenljivke b. Spremenljivki pa morata biti deklarirani v class1.cs. Kako zdaj jaz lahko prensem spremenljivke iz classa v form ?

Hvala za pomoč,lp

Math Freak ::

1.) Ustvariš nov class, notri deklariraš recimo:
public static int a = 13;

in ga compilaš, da se generira dll datoteka.


2.) Ustvariš novo form aplikacijo, dodaš gumbe in textboxe. Dvoklikneš na vsakega od štirih elementov, da se prikaže njihova koda.

Importaš razred v ta projekt: V meniju "Project" -> "Add Reference" in prebrskaš za dll datoteko znotraj class projekta, ki si ga prej ustvaril s compilanjem.

Da se text prikaže greš v button -> click metodo, ki si jo prej ustvaril z dvoklikom in vstaviš objekt iz class metode:

textBox2.Text = class1.Class1.a.ToString();


oziroma, kakorkoli si že poimenoval svoje objekte.

Zgodovina sprememb…

Miko55 ::

Zdaj mam tako kodo:
Form1.cs
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public Customer abc = new Customer();
        public void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = abc.Name.ToString();
        }
    }
}


Class1.cs
namespace WindowsFormsApplication2
{
    public class Customer
    {
        public static int a ;

        public int Name
        {
            set
            {
                a = 13;
            }
            get
            {
                return a;
            }
            
        }
    }
}

Sam zakaj se mi v textboxu zdaj pojavi 0 ne pa 13 ?

dellon ::

Zato ker se kliče get. Statična spremenljika pa ima začetno vrednost 0. Setter se ne pkliče zato se tudi ne nastavi vrednost 13. Malce napačno si si tole zastavil.

Rajši naredi takole:

        public string Name
        {
          get;
          set;
        }

        public string Surname
        {
          get;
          set;
        }


Navo ustvari konstruktor ki sprejme 2 spremenljivki, jih nastavi, nato pa kliči po mili volji

torej
Customer c = new customer("ime", "priimek");


textBox2.Text = c.Name;

Zgodovina sprememb…

  • spremenil: dellon ()

amacar ::

Pa ne rabiš dll-ja delat.

Miko55 ::

Hvala za pomoč,sem skapiral kako gre. Sedaj pa sem to prensel v dejanski program in sem prišel do manjše težave. Koda je sledeča:
        public void button3funkcija (Form1 form)
        {
            if (form.numericUpDown2.Value != 0) 
            {
                form.label10.Text = "Preostale igre:" + form.numericUpDown2.Value;
                tip = 3;
                st_iger = form.numericUpDown2.Value;
                prehod_stran2();
                form.errorProvider6.Clear();
            }
            else 
            {
                form.errorProvider5.Clear();
                form.errorProvider6.SetError(form.numericUpDown2, "Število more biti večje od 0");
            }
        }

        public void prehod_stran2(Form1 form) 
        {
            form.errorProvider1.Clear(); form.errorProvider2.Clear(); form.errorProvider3.Clear(); form.errorProvider4.Clear(); form.errorProvider5.Clear(); form.errorProvider6.Clear();

            if (form.textBox1.Text == "")
            {
                form.errorProvider1.SetError(form.textBox1, "Polje mora biti izpolnjeno");
                if (form.textBox2.Text == "")
                    form.errorProvider2.SetError(form.textBox2, "Polje mora biti izpolnjeno");
            }
            else if (form.textBox2.Text == "")
                form.errorProvider2.SetError(form.textBox2, "Polje mora biti izpolnjeno");
            else if (form.textBox1.Text == form.textBox2.Text)
            {
                form.errorProvider3.SetError(form.textBox1, "Imeni se morata razlikovati");
                form.errorProvider4.SetError(form.textBox2, "Imeni se morata razlikovati");
            }
            else
            {
                imeX = form.textBox1.Text;
                imeO = form.textBox2.Text;
                form.label5.Text = "Na vrsti je: " + imeX;
            }
        }


Problem je da mi pri prehod_stran2() funkciji vrne napako no overload for method,no valid arguments. Dalo bi se rešit če bi pri dejanski funkciji izbirasl iz () Form1 form ampak potem pa mi ne prepozna textboxov in lablov. Kakšna rešitev ?

Zgodovina sprememb…

  • spremenil: Miko55 ()

vorantz ::

Zakaj pa rabis form sploh? Sej lahko direkt referenciras textobe itd (samo reces textBox1 pa je)

Zgodovina sprememb…

  • spremenil: vorantz ()

dellon ::

Miko55. Predvidevam da si še začetnik pri programiranju (vsaj win forms).

Nekaj hitrih nasvetov:

- poimenuj vse kontrolce z nekimi smiselnimi imeni, ki odražajo samo vrednost (recimo za textboxe tbIme, comboboxe cmbSifrant itd. gumb: btnImeAkcije) isto velja za metode, evente..
ker ko boš čez čas gledal kodo bodo vis ti label10 in textbox6 zelo težko berljivi. Takšna koda je potem težka za vzdrževati.
- za vsako formo ne rabiš več kot enega error providerja.

prehod_stran2() pa ti vrne napako zato ker nisi v metodo vnesel parametra pri klicu, zato ti vrne napako že pri delu: form.errorProvider1.Clear(). Uporabljaš .NET 4.5, ker drugače bi ti tukaj moralo vrniti sintaktično napako.

- navadi se pisati recimo p pred parametri, ki pridejo v metodo torej: public void prehod_stran2(Form1 pForm). Tako boš lažje razlikoval ali nastavljaš vrednosti iz parametra ali iz lokalnega fielda. Lokalne fielde pa predznači z znakom "_"

Nam lahko mogoče zaupaš za kakšno aplikacijo gre tukaj? Je lažje potem pisati nasvete.

Miko55 ::

Sem začetnik ja :)

Gre vbistvu za aplikacijo ki bo imela več iger v sebi. Trenutno je tako da bo na začetnem panelu meni,potem pa odvisno na kateri gumb klikneš se odpre določena igra. Zdaj pa jaz v "glavni" datoteki nočem narediti koe za vse igre ampak hočem da se za vsako igro naredi class in potem v so potem v klasih funkcije ki jih kličem ob določenih eventih npr. button_click. Če je to sploh možno tako?

Zgodovina sprememb…

  • spremenil: Miko55 ()

dellon ::

Glede tlačenja kode v eno "datoteko" si v pravi smeri. Tega se lahko lotiš na več načinov:

- lahko ima vsaka igra svojo formo katera se proži ob kliku na gumb iz glavne forme (tvoj meni)
- lahko narediš v stilu mdi forme LINK (ena glavna forma, ki ima otroke, ki bi bili v tvojem primeru igre)
- "Paneli" (user controlce) kjer imaš samo eno formo in ji nastavljaš vsebino v glavnem panelu. Za vsak gradnik (meni in igre) pa implementiraš svojo user controlo, ki jo nato nastaviš panelu, ki se nahaja na glavni formi.

Mislim da je od teh treh načinov za začetnika še najlažji prvi (tudi najmanj dela). Zavedaj pa se da pri klasičnih win formsih z default gradniki, kaj več od tic tac toe, vislic in podobnih iger ne bo dalo delati.

Za indie igre je bil do nedavnega precej popularen XNA, ki pa se na žalost ne ravija več in niti ni podprt v win 8 rt. Je pa precej popularen zadnje čase Unity, kjer lahko razvijaš za več platform hkrati.

Miko55 ::

dellon je izjavil:

Glede tlačenja kode v eno "datoteko" si v pravi smeri. Tega se lahko lotiš na več načinov:

- lahko ima vsaka igra svojo formo katera se proži ob kliku na gumb iz glavne forme (tvoj meni)
- lahko narediš v stilu mdi forme LINK (ena glavna forma, ki ima otroke, ki bi bili v tvojem primeru igre)
- "Paneli" (user controlce) kjer imaš samo eno formo in ji nastavljaš vsebino v glavnem panelu. Za vsak gradnik (meni in igre) pa implementiraš svojo user controlo, ki jo nato nastaviš panelu, ki se nahaja na glavni formi.

Mislim da je od teh treh načinov za začetnika še najlažji prvi (tudi najmanj dela). Zavedaj pa se da pri klasičnih win formsih z default gradniki, kaj več od tic tac toe, vislic in podobnih iger ne bo dalo delati.

Za indie igre je bil do nedavnega precej popularen XNA, ki pa se na žalost ne ravija več in niti ni podprt v win 8 rt. Je pa precej popularen zadnje čase Unity, kjer lahko razvijaš za več platform hkrati.


Jaz delam z paneli ker mi je nekak najlažje. Sam glede tistih dveh funkcij, kako bi jih lahko sedaj "povezal" ? Ker če odstranim () Form1 form mi pol več textboxov pa tega ne prepozna.

Miko55 ::

OK zdaj ko sem zrihtal to z kodo da je v klasu,pa do so v prvi "datoteki" samo button kliki ki kličejo funkcije z classa. Ampak zdaj dobim v prvi "datoteki" pri debugerju tale error : http://imgur.com/BFbnZLg

Zgodovina sprememb…

  • spremenil: Miko55 ()

dellon ::

problem je tukaj:

frm1 = this

prirejaš vrednost, ki še niti ni instancirana (kličeš v konstruktorju, ki se šele gradi. Zato ti vrže null exception

tega objekta frm1 v istem razredu ne potrebuješ. Tam kjer kličeš metode zamenjaj frm1 z this.

cl1.button1funkcija(this);
bo zadostovalo.

Priporočam da komentarje pišeš nad metodo in ne poleg.

Miko55 ::

Hvala je delovalo :)

Nočem odpirat nove teme, mam problem pri naslednji kodo, ki verjento ni velik. Gre za program vislice, ko uporabnik klikne pravo črko in bi se label mogel namesto _ spremenit v dejansko črko mi vrže napako nullreference.

int i = 0;
        string[] besede = {
		"Šola",
		"računalnik",
		"avtobus",
		"program",
		"nrpa"
	    };
        string izbrana_beseda;
        string velika_crka;
        bool izpis_label = false;
        public char[] posamezne_crke;
        public string crka;
        Label[] tekst = new Label[25];
        private Form1 form1;
        public Class2(Form1 form1)
        {
            // TODO: Complete member initialization
            this.form1 = form1;
        }

        public void random_beseda()
        {
            Random rnd = new Random();
            int st_besede = rnd.Next(0, 5);  
            izbrana_beseda = besede[st_besede]; 

            string razdeljevanje = izbrana_beseda; 
            posamezne_crke = razdeljevanje.ToCharArray(); 
            
            if (izpis_label == false)  
            {
                Label[] tekst = new Label[posamezne_crke.Length];
                for (int i = 0; i < posamezne_crke.Length; i++)
                {
                    tekst[i] = new Label();
                    tekst[i].Location = new Point((100 + (40 * i)), 100);
                    tekst[i].Text = "_";
                    tekst[i].Font = new Font("Arial", 20);
                    tekst[i].AutoSize = true;
                    form1.panel3_vislice.Controls.Add(tekst[i]);
                }
                izpis_label = true;
            }
        }
        
        private void button_Vislice_Click(object sender, EventArgs e)
        {
            Button gumb_crka = (Button)sender; 
            crka = gumb_crka.Name.ToString();
            preveri();
        }

        public void preveri()
        {
            for (int i = 0; i < posamezne_crke.Length; i++) 
            {
                velika_crka = Char.ToUpper(posamezne_crke[i]).ToString();   
                if (crka == velika_crka) 
                {
                    tekst[1].Text = crka;  // NAPAKA 
                }
            }
        }

Zgodovina sprememb…

  • spremenil: Miko55 ()

dellon ::

tekst[1].Text = crka;


Verjetno je polje na drugi lokaciji prazno, oz v njem ni labele

Tole
Label[] tekst = new Label[25];
je samo inicializacija polja ampak v njem se še ne nahaja nobena labela.

Še en nasvet. Debugger is your friend ;)

Miko55 ::

dellon je izjavil:

tekst[1].Text = crka;


Verjetno je polje na drugi lokaciji prazno, oz v njem ni labele

Tole
Label[] tekst = new Label[25];
je samo inicializacija polja ampak v njem se še ne nahaja nobena labela.

Še en nasvet. Debugger is your friend ;)


Kako da ni? Saj ga v tem if-u naredim

if (izpis_label == false)  
            {
                Label[] tekst = new Label[posamezne_crke.Length];
                for (int i = 0; i < posamezne_crke.Length; i++)
                {
                    tekst[i] = new Label();
                    tekst[i].Location = new Point((100 + (40 * i)), 100);
                    tekst[i].Text = "_";
                    tekst[i].Font = new Font("Arial", 20);
                    tekst[i].AutoSize = true;
                    form1.panel3_vislice.Controls.Add(tekst[i]);
                }
                izpis_label = true;
            }

amacar ::

Daj stran
Label[]

Miko55 ::

amacar je izjavil:

Daj stran
Label[]

Hvala,sem si mislil da je nekaj malega narobe :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Visual Basic

Oddelek: Programiranje
313195 (2221) cekr
»

C#, TextBox in PopUp forma

Oddelek: Programiranje
61017 (911) MarCar
»

C# iz form2 v form1,textboxi

Oddelek: Programiranje
131852 (1478) Keki
»

C# Pomoč

Oddelek: Programiranje
131310 (1135) jizzer
»

c# class

Oddelek: Programiranje
342151 (1745) japol

Več podobnih tem