» »

c# class

c# class

japol ::

v class3.cs mam kodo:

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

namespace Class_delo_z_njimi
{
class Class3
{
private void prikaži()
{
MessageBox.Show("dostop je možen!");
}
}
}

kaj morm v form1.cs pod button click napisat, da mi izvrši class3, se pravi da mi prikaže messagebox.

private void button9_Click(object sender, EventArgs e)
{
// kakšna je koda, da dostopa do class3?
}

noraguta ::

ti pa tole najbrž nimaš v istem namespacu ?
Pust' ot pobyedy k pobyedye vyedyot!

japol ::

v from1.cs mam kodo

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;
using System.IO;

namespace Class_delo_z_njimi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button9_Click(object sender, EventArgs e)
{
// kakšna je koda, da dostopa do class3?
}
}
}

Qcube ::

Class_delo_z_njimi.Class3.prikaži() mislim, da bi tako moralo delovati...

noraguta ::

kreiraj objekt razreda Class3(saj veš tist new pa to). potem pa pokliči metodo nad danim objektom(objekt-pika-metoda).
edit:
predstavljaj si da je program zgolj štala , dialog box je sedlo , Class3 pa je zgolj pojem oz opis konja. katerega moraš še pripeljat v štalo ako ga kaniš osedlat.
Pust' ot pobyedy k pobyedye vyedyot!

Zgodovina sprememb…

  • spremenilo: noraguta ()

japol ::

a, itak, hvala noraguta.
private void button9_Click(object sender, EventArgs e)
{
Class_delo_z_njimi.Class3 klas3 = new Class_delo_z_njimi.Class3();
klas3.prikaži();

}

še nekej: mam en mini paint program (rasanje črt, krogov,...). ob kliku na button1 rišeš črto, z buttnom2 rišeš krog, itd. a ma kdo kak primer kode, da:
- ne rabm za vsako klikat na button1 da bi risou črto
- ko kliknem na button2 - da prekine button1

japol ::

sm pozabu: kako v class3 dostopam textbox1 k je na formu?

japol ::

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;
using System.IO;

namespace Class_delo_z_njimi
{
class Class5
{
public void izračunaj()
{
Form1 frm1 = new Form1();
int a = System.Int32.Parse(frm1.textBox1.Text);
int b = System.Int32.Parse(frm1.textBox2.Text);

int c;
c = a + b;
MessageBox.Show("rezultat je:" + c.ToString());
}
}
}

v textbox1 in 2 vstavim cifre, a mi vrže error v vrstici int a = ..., error je: Input string was not in a correct format. sm kej spregledou?

Ericssony ::

Osnove C# :D
Razred mora biti statičen, če bi rad do njega in njegovih metod dostopal direktno - Class3.prikaži()...

japol ::

mi lahk pomagaš pr zadnem postu?

dolenc ::

public static void izračunaj()

Potem pa lahko metodo kličeš s 'Class5.izračunaj' v drugem razredu. Če bi to rad.

Pa izogibaj se šumnikov.

Zgodovina sprememb…

  • spremenil: dolenc ()

japol ::

v vrstici:
int a = System.Int32.Parse(frm1.textBox1.Text);
mi prkaše error:
Input string was not in a correct format.
pa sej pišem cifre v textbox1 in 2.

do zdej mam:
v class5.cs je koda:
public static void izračunaj4()
{
Form1 frm1 = new Form1();
int a = System.Int32.Parse(frm1.textBox1.Text);
int b = System.Int32.Parse(frm1.textBox2.Text);
int c;
c = a + b;
MessageBox.Show("rezultat je:" + c.ToString());
}

v form1.cs je koda:
private void button13_Click(object sender, EventArgs e)
{
Class5.izračunaj4();
}

noraguta ::

Form1 frm1 = new Form1(); // tule pod obstoječo formo ustvariš še eno podformo katero ne prikažeš potem pa bereš iz nje
int a = System.Int32.Parse(frm1.textBox1.Text);
int b = System.Int32.Parse(frm1.textBox2.Text);
int c;
c = a + b;
MessageBox.Show("rezultat je:" + c.ToString());

razmisli kaj počneš tu. (hint koliko instanc Form1 imaš? in katere so prikazane)
Pust' ot pobyedy k pobyedye vyedyot!

Zgodovina sprememb…

  • spremenilo: noraguta ()

dolenc ::

Malo imaš to res nelogično, poskusi tako

public static void izračunaj4(int a, int b)
{
int c = 0;

c = a + b;
MessageBox.Show("rezultat je:" + c.ToString());
}

private void button13_Click(object sender, EventArgs e)
{
int a1 = System.Int32.Parse(textBox1.Text);
int b1 = System.Int32.Parse(textBox2.Text);

Class5.izračunaj4(a1, b1);
}

japol ::

dolenc: na ta način mam že urejen, poanta je da se v celoti računi nahajajo v classu, v formu pa samo dostopam do njih (to hočem doseč).
noraguta: dej mi prosm poprav kodo, k ne vem kaj mislš s tem.

dolenc ::

No ampak če pravilno zastopim, ti podatke vnašaš/bereš samo preko forme.

To da se ti potem vrednosti shranjujejo v classe pa kličejo funkcije narediš vse na formi(ki je dejansko tvoj Main), tako da uporabiš ali objekt tistega razreda ali pa static metodo. Vse kličeš preko forme, potem se ti preko objektov/static metod, polni ali prebere v classu.

japol ::

Ja, dostopam preko forme. Sej delam na tak način:

koda v classu:
public static int mnozenje(int firstnumber, int secondnumber)
{
return firstnumber * secondnumber;
}

koda v formu:
private void button1_Click(object sender, EventArgs e)
{
int a = System.Int32.Parse(textBox1.Text);
int b = System.Int32.Parse(textBox2.Text);
int rez;
rez = Class_delo_z_njimi.Class1.mnozenje(a, b);

MessageBox.Show("rezultat je: " + rez.ToString());
}

Ampak zaradi preglednosti, želim imeti vse v classu, ker bo tega zelo veliko.

Moti me edino še:
public static void izračunaj4()
{
Form1 frm1 = new Form1();
int a = System.Int32.Parse(frm1.textBox1.Text);
int b = System.Int32.Parse(frm1.textBox2.Text);
int c;
c = a + b;
MessageBox.Show("rezultat je:" + c.ToString());
}

ker mi v vrstici: int a = System.Int32.Parse(frm1.textBox1.Text); javi error: Input string was not in a correct format.

dolenc ::

Nisem nek strokovnjak, tako da upam da ti bom prov napisal, če ne me naj pa kdo popravi.

Form1 frm1 = new Form1(); ti ustvari novo instanco razreda, on ne ve kaj se skriva v tvojem textboxu na formi.
In s tem ko narediš frm1.textBox1.Text, je vrednost tega verjetno "", torej prazno polje. Ko želi to pretvorit v int se mu pa zatakne.

Sedaj kaj lahko narediš. Najbolj pametno bi bilo še malo preštudirat objekte:D.
Druga rešitev, če želiš tako delati je da nabrišeš notri en konstruktor(sedaj ker ga nimaš ti vzame privzetega) in mu potem ko kličeš nov objekt že tam nafilaš vrednosti.

Bolša rešitev se skriva že par objav nazaj... Torej uporabi funkcijo tako kot sem ti zgoraj napisal, da je funkcija samo funkcija, brez da vsakič naredi nov objekt. Vrednosti prebereš pa že v razredu forma, ob klicanju funkcije(torej ob kliku na gumb).

Mitja Bonča ::

Upam da je to kar misliš:
1. OPOMBA: metoda v classu 3 mora biti public, da jo lahko vidiš in zaženeš iz Form1:

namespace Class_delo_z_njimi
{
   class Class3
   {
      public void prikaži()
      {
          MessageBox.Show("dostop je možen!");
      }
   }
}
private void button9_Click(object sender, EventArgs e)
{
    Class3 mojClass3 = new CLass3();
    class3.prikaži();
}


------------------------------------------
2. OPOMBA: še boljša varjanta pa je pa jo daš kot static potem ti ni treba delati nove instance razreda Class3:

namespace Class_delo_z_njimi
{
    class Class3
   {
       public static void prikaži()
       {
           MessageBox.Show("dostop je možen!");
       }
    }
}

private void button9_Click(object sender, EventArgs e)
{
    Class3.prikaži();
}

noraguta ::

no ja static metod se izogibaj , iz principa.
tvoj problem je na na obstojeci formi ustvariš še eno formo

in ne berez iz this.tb1.text .... amamk iz frm1.tb1.text , ampak ti si to formo zgol ustvaril niti jo nisi prikazal. + tega formo ustvariš potem pa že prirediš vrednosti spremenljivkam(ja vrednost je null in to ne gre v int).
Pust' ot pobyedy k pobyedye vyedyot!

japol ::

Maš kak primer, kako to popravm?

Ericssony ::

Prikaži formo uporabniku, da vnese podakte...
public static void izračunaj4()
{
    Form1 frm1 = new Form1();
    frm1.ShowDialog(); // <- to si pozabil

    // nekje še dodatno preveri smiselnosti vnešenih podatkov
    int a = System.Int32.Parse(frm1.textBox1.Text);
    int b = System.Int32.Parse(frm1.textBox2.Text);
    int c;
    c = a + b;
    MessageBox.Show("rezultat je:" + c.ToString());
}

japol ::

Sm že meu to:
frm1.ShowDialog(); - s tem nism nč pridobi, ko vnesem podatke v textboxe, mi ob kliku na button prikaže novi prazen form, brez rezultata in brez messageboxa in to lahk ponavljaš v nedogled, na konc maš en kup istih formou. Vnašam pa cela števila. Kako povežeš class in textbox (in ostale gradnike)?

Ericssony ::

Če te prav razumem bi rad imel razred z medoto izračunaj. Ob klicu medotde izračunaj bi se uporabniku prikazalo okno v katerega bi vnesel podatke. Po tem ko uporabnik vnese podatke pa bi jih obdelal. Je to to ali ne?

Če ja, potem je zgornji primer v redu! Predpostavljam, da imaš na Form1 dva gumba - [v redu] in [prekliči]. Za oba gumba nastaviš lastnost DialogResult - gumb [v redu] DialogResult.OK, gumb [prekliči] pa DialogResult.Cancel.
Podatke NE obdeluješ na Form1 ampak za klicem frm1.ShowDialog() metode. S pomočjo vrednosti, ki ti jo vrne medota ShowDialog() pa preveriš kateri gumb je uporabnik pritisnil:
if (frm1.ShowDialog() == DialogResult.OK)
{
    // zračunaj oz. obdelaj podatke
}

japol ::

v classu hočm met to:
v class5.cs je koda:
public static void izračunaj4()
{
Form1 frm1 = new Form1();
int a = System.Int32.Parse(frm1.textBox1.Text);
int b = System.Int32.Parse(frm1.textBox2.Text);
int c;
c = a + b;
MessageBox.Show("rezultat je:" + c.ToString());
}

v form pa samo to:
poanta je v tem, da je form le povezovalni - da v njem ne pišeš nikakršne kode,... le to spodaj:
v form1.cs je koda:
private void button13_Click(object sender, EventArgs e)
{
Class5.izračunaj4();
}

se pravi da iz classa dostopam textboxe k so na formu. Vsak class bo predstavljal svoj izračun, v formu jih bom pa samo povezal skupaj.

Predstavljaj si da pišeš ceotno kodo v classih, v formu pa samo classe med sabo povežeš.

Zgodovina sprememb…

  • spremenil: japol ()

Mitja Bonča ::

Čak mal, počasi... ti malo mešaš zadeve.
Imaš osnvoni (glavni) okno, to je Form1. Imaš pa tudi Form5, ki ga odpreš iz Form1, je tako?
V Form1 imaš 2 textBoxa, v katera vneseš števila, a ne?
In v Form5 imaš metodo za izračun. Seštevek iz textBoxov iz Form1, bi rad prikazal v Form5, je tako?

samo malo ti naredim domačo nalogo.

Zgodovina sprememb…

Mitja Bonča ::

Na Form1 dodaj to metodo:
private void button4_Click(object sender, EventArgs e)
        {
            string strStevilo1 = textBox3.Text.Trim();
            string strStevilo2 = textBox4.Text.Trim();
            if (strStevilo1 != String.Empty && strStevilo2 != String.Empty)
            {
                //PREVERJANJE ŠTEVIL, ČE SO LE TA TAPRAVA
                bool boolPravoStevilo = false;
                decimal decŠtevilo = 0;                
                string[] arrayVsaStevila = new string[] { strStevilo1, strStevilo2 };

                foreach (string strEnoStevilo in arrayVsaStevila)
                {
                    boolPravoStevilo = decimal.TryParse(strEnoStevilo, out decŠtevilo);
                    if (!boolPravoStevilo)
                    {
                        MessageBox.Show("Prosim v vnosna polja vpišite samo števila");
                        break;
                    }
                }
                if (boolPravoStevilo)
                {
                    //PO PREVERJANJU ŠTEVIL SE LE TA SPREMENI V DECIMAL:
                    decimal decStevilo1 = Convert.ToDecimal(strStevilo1);
                    decimal decStevilo2 = Convert.ToDecimal(strStevilo2);

                    // IN SE JIH POŠLJE V DRUGI CLASS:
                    Class1.Izracunaj(decStevilo1, decStevilo2);
                }
            }
            else
                MessageBox.Show("Za izračun prosim vpišite števila v oba vnosna polja.");
        }        


... no sedaj pa pojdni na tvoj Class5 in dodaj samo to metodo, in nič drugega:
public static void Izracunaj(decimal decStevilo1, decimal decStevilo2)
        {
            decimal decVsota = decStevilo1 + decStevilo2;
            System.Windows.Forms.MessageBox.Show("Rezultat je: " + decVsota);
        }


To je vse! To dela 100%.
Če rabiš še kaj, samo povej.

Mitja

Zgodovina sprememb…

Mitja Bonča ::

Preverjanje decimal števila se lahko izvaja tudi na sledeči način, ki je v bistvu "še boljši" od tryParse() metode:
Regex jeStevilo = new Regex(@"(^[-+]?\d+(,?\d*)*\.?\d*([Ee][-+]\d*)?$)|(^[-+]?\d?(,?\d*)*\.\d+([Ee][-+]\d*)?$)");
Match SteviloPravo = jeStevilo.Match(strEnoStevilo);
if (!SteviloPravo.Success)
{
   MessageBox.Show("Prosim v vnosna polja vpišite samo števila");
   return;
}


.. just for info
Mitja

japol ::

Jst hočm s classom dostopat textboxe in ostale gradnike k so dodani na form ne pa v Form1.cs. Me razumeš?
Mitja Bonča: ti si kodo pisou na Form1.cs, jst pa želim to kodo pisat v Class5.cs In na Form1.cs sam povezat classe skup.

Tko da bodo v Form1.cs samo kode, k bodo classe povezale skupaj. V classu pa bo spisana celotna koda za izračun, ki bo zajemala vse gradnike, k jih rabm:
v class5.cs je koda:
public static void izračunaj4()
{
Form1 frm1 = new Form1();
int a = System.Int32.Parse(frm1.textBox1.Text);
int b = System.Int32.Parse(frm1.textBox2.Text);
int c;
c = a + b;
MessageBox.Show("rezultat je:" + c.ToString());
}
sej kot kaže ta primer: pod Project --> Add Class... sm dodal Class5.cs in vanj vpisujem kodo, ki dostopa do textboxov in ostalih kot bi iz Forma1.cs dostopal, ampak Form1.cs bo namenjem SAMO povezavi vseh classov skupaj, ne pa pisanju kode. Ali pa predstavljaj si da kodo pišem samo v Class5.cs, form1.cs sm pa zbrisal. Kako bi v takem primeru s Classom5 dostopal textbox in ostale gradnike?

Glede na tvoj post: "Mitja Bonča :: danes, 16:18:22" je v mojem primeru želja, da ti celotno kodo ki si jo pisou pod button4_Click (v form1.cs) prestaviš v Class5 in z njega dostopaš tvoj textbox3 in 4.

Mitja Bonča ::

Ti imaš malo pomešane pojme, ampak vseeno ... kvečjemu naredi tako koj je spodaj:
Form1:
        private void button4_Click(object sender, EventArgs e)
        {
            string strStevilo1 = textBox3.Text.Trim();
            string strStevilo2 = textBox4.Text.Trim();
            if (strStevilo1 != String.Empty && strStevilo2 != String.Empty)
                Class1.Izracunaj(strStevilo1, strStevilo2);
            else
                MessageBox.Show("Za izračun prosim vpišite števila v oba vnosna polja.");
        } 


Class5:
        public static void Izracunaj(string strStevilo1, string strStevilo2)
        {
            Form1 form1 = new Form1();
            
            //PREVERJANJE ŠTEVIL, ČE SO LE TA TAPRAVA
            bool boolPravoStevilo = false;
            decimal decStevilo = 0;
            string[] arrayVsaStevila = new string[] { strStevilo1, strStevilo2 };

            foreach (string strEnoStevilo in arrayVsaStevila)
            {
                Regex jeStevilo = new Regex(@"(^[-+]?\d+(,?\d*)*\.?\d*([Ee][-+]\d*)?$)|(^[-+]?\d?(,?\d*)*\.\d+([Ee][-+]\d*)?$)");
                Match SteviloPravo = jeStevilo.Match(strEnoStevilo);
                if (!SteviloPravo.Success)
                {
                    System.Windows.Forms.MessageBox.Show("Prosim v vnosna polja vpišite samo števila");
                    return;
                }

                boolPravoStevilo = decimal.TryParse(strEnoStevilo, out decStevilo);
                if (!boolPravoStevilo)
                {
                    System.Windows.Forms.MessageBox.Show("Prosim v vnosna polja vpišite samo števila");
                    break;
                }
            }
            if (boolPravoStevilo)
            {
                //PO PREVERJANJU ŠTEVIL SE LE TA SPREMENI V DECIMAL:
                decimal decStevilo1 = Convert.ToDecimal(strStevilo1);
                decimal decStevilo2 = Convert.ToDecimal(strStevilo2);
                
                decimal decVsota = decStevilo1 + decStevilo2;
                System.Windows.Forms.MessageBox.Show("Rezultat je: " + decVsota);
            }            
        }


To kar ti delaš se meni osebno zdi brez potrebe.
Če že želiš vedeti, zakaj ne vidiš textBoxov, ko vpišeš:
Form1 frm1 = new Form1();
int a = System.Int32.Parse(frm1. ... ->
textBox1 moraš nastaviti na PUBLIC, da bo viden iz drugih classov, to narediš na sledeči način:
Greš v Form1.Designer.cs in na koncu dol imaš listo vseh kontrol, ena izmed njih sta textBox1, in textBox2. Spremeni iz private v public:
public System.Windows.Forms.TextBox textBox1;
public System.Windows.Forms.TextBox textBox2;
Sedaj lahko narediš tvojo finto (textBox bo viden iz Class5):
Form1 frm1 = new Form1();
int a = System.Int32.Parse(frm1.textBox1);
OPOMBA: controle ni pametno imeti nastavljene kot public.

Imam pa pripombe:
Zakaj bi iz Class5 dostopal v Form1? To je čisto nepotrebno. Ti imaš na Classu5 metodo za izračun, ZATO SE PARAMETER (VREDNOSTI) PRENESE iz metode v Form1 v Class5 - as simple as that. Poglej mojo zgornjo kodo.

Če pa delaš kakšen drug primer (ne tega tako simple z c= a+b), pa ga prosim pokaži, da bom videl zakaj želiš dostopati iz classa5 v form1, ok?
lp,
Mitja

Popravljena koda: spremenjeni parametri (decimal, string)

Zgodovina sprememb…

japol ::

Mam nastavleno kot public. Textbox je viden v classu, ampak mi prkaže error (glej poste).
Sm dobu informacijo da ne morš tko narest, ker form.cs nima enakih lastnosti kot class.cs. Upou sm da se je že kdo s tem srečou, pa da mi bo lahk pomagou. Hvala za pomoč.

Mitja Bonča ::

Nevem, ampak jaz sem enkrat to že delal in je stvar delala.
Ti pa to odsvetujem, kot so do meni.
Zato ti predlagam, da narediš tako kot sem jaz naredil na zgornji kodi.
Parametre pošlješ iz Form1 v Class5 na 2. načina:
1. ali tako kot kot sem jih jaz (skupaj z metodo)
2 ali pa preko get, set metode
get, set kako:
V classu5 narediš:
public static decimal PrvoStevilo { get; private set; }
public static decimal DrugoStevilo { get; private set; }

Nato jih v metodi Izracunaj samo pokličeš.

Na Formi1 v metodi od kjer pošiljaš podatke na class5:
Class5.PrvoStevilo = decPrvoStevilo; //decPrvoStevilo je decimal number od vpisanega stringa
Class5.DrugoStevilo = decDrugoStevilo;

Ericssony ::

Z "Bončem" sva ti lepo dopovedovala kako in kaj in podala možne rešitve ampak ti hočeš na vsak način z glavo skozi zid... :)

Mitja Bonča ::

Ericssony je izjavil:

Z "Bončem" sva ti lepo dopovedovala kako in kaj in podala možne rešitve ampak ti hočeš na vsak način z glavo skozi zid... :)

Ma pust ga, je brez veze. Sej ko bo pisal kakšno večjo (daljšo) kodo tam čez par 10.000 vrstic, bo že pogruntal.
Mene je to že izučilo, pa se z programiranjem ukvarjam dobro leto dni.
ajde

japol ::

Hvala obema za vajin cajt in znanje. Očitno bom mogu tko delat. Trenutno sm na 6 jurčkih vrstic in točno zaradi tega sm hotu mal več preglednosti, organiziranosti,... Hvala še enkrat.


Vredno ogleda ...

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

[c#] ukaz radirka

Oddelek: Programiranje
9877 (670) japol
»

[c#] Risanje z miško

Oddelek: Programiranje
221239 (920) japol
»

[C#] pomoc pri vpisu elementov v listBox

Oddelek: Programiranje
101043 (958) keworkian
»

C# textbox polnjenje

Oddelek: Programiranje
71384 (1249) Mitja Bonča
»

C# okna in podokna

Oddelek: Programiranje
111455 (1049) FlashM

Več podobnih tem