Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 68 ] Choď na stránku: 1, 2, 3 ďalšia
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok NapísalOffline : 15.04.2013 16:01

Mám otázočku. V C# mám 2 formuláre: Form1 a Form2.
Po spustení aplikácie je otvorený a aktívny Form1. V tomto formulári mám jedno tlačidlo.
Ako dosiahnem, aby po kliknutí na toto tlačidlo sa Form1 skryl (Hide) a otvoril sa Form2. Na Form2 je tiež tlačidlo a keď naň kliknem, chcem aby sa skryl Form2 a otvoril Form1. Ako to môžem dosiahnť? Pozeral som na internete, ale moc som nepochopil riešenia, ani jedno mi nefunguje.

Nerozumiem tiež tomu, ak mám druhý formulár, musím byť preň nový thread? Ako ho vytvoriť?
Akosi sa v tom strácam.

Ďakujem za odpoveď.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 15.04.2013 16:12

Keď použijem nasledovný príkaz:

Kód:
Form2.show();


Ohlási chybu:
Error 1 'WindowsFormsApplication1.Form2' does not contain a definition for 'show'


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 15.04.2013 16:55

Kód:
Form2.show()

Takáto funkcia naozaj neexistuje, správne je to "Show". Pri C# záleží aj na tom, či je písmeno malé alebo veľké. Používaj intellisense vo Visual studiu, aby si vedel ľahko zistiť, aká je správna syntax.

Čo sa týka toho tvojho prvého problému (a vlastne aj druhého), ak chceš nejaký Form ukázať alebo skryť, najskôr musíš vytvoriť jeho inštanciu a odkazovať sa potom na ňu.
Nový thread nepotrebuješ.

Stačí také vysvetlenie? Skús a daj vedieť, či sa podarilo :)







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 15.04.2013 18:00

Ďakujem za rýchlu odpoveď. Ja som medzitým prišiel na to, že takto:

Kód:
Form2 form2 = new Form2();
form2.Show();


Ale zas mám problém skryť ten Form1. Ani cez Hide(), Close(), Visible = false. Neviem, čo s tým.

Ono sa otvorí Form2 ako nemodálne okno, Form1 ostane otvorený a môžem oba formuláre používať. Ale to ja nechcem, chem aby Form1 zmizol.

Form1 je hlavný formulár.

Dík.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 15.04.2013 18:17

No hurá, konečne:

Kód:
using(Form2 form2 = new Form2())
            {
                this.Hide();
                form2.ShowDialog();
            }


Takto som si to predstavoval. Len mám otázočku ohľadne toho using. Viem, že nevadí ak tam je. Ale je lepšie ak to píšem takto? Ak by tam to using nebolo, uvoľnila by sa pamäť neskôr?

Aha, to je nepodstatná otázka, som teraz zistil.
Mám podozrenie, že sa vždy keď otváram Form1 alebo Form2 vytvárajú nové inštancie tých okien. Na formulári Form2 mám Textbox, keď doňho napíšem text a prekliknem na Form1 a späť na Form2, text tam nie je. Takže vporiadku to nie je. Som si myslel, že keď dám hide(), že sa len skryje.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 15.04.2013 18:54

Pár vecí, na ktoré treba myslieť:
- pravdepodobne chceš, aby existovala len jediná inštancia každého Formu
- Show/Hide je v podstate len inak povedané this.Visible = true/false. Ak zavrieš okno, tie ostatné ostanú skryté na pozadí pokiaľ existuje niečo, čo sa na ne odkazuje, čiže pri niektorých postupoch ti aplikácia "nikdy" neskončí

Máš viac spôsobov, ako dosiahnuť to, čo chceš... Napríklad sa dá spraviť takáto sranda:
Kód:
    internal class FormManager
    {
        private static List<Form> _myForms = new List<Form>();

        internal static Form GetInstanceOfForm<T>() where T : Form
        {
            Form form = _myForms.SingleOrDefault(o => o is T);

            if (form == null)
            {
                form = Activator.CreateInstance<T>();
                _myForms.Add(form);
            }

            return form;
        }
    }


Použiješ to jednoducho:
Kód:
     private void button1_Click(object sender, EventArgs e)
     {
          Form f = FormManager.GetInstanceOfForm<Form2>();
          f.Show();
          this.Hide();
      }


Ak existuje Form daného typu (Form1, Form2, Form3...), vráti sa ti inštancia. Ak neexistuje, najskôr sa ti pridá do privátneho statickej kolekcie s inštanciami. Výhoda tohto je v tom, že udržuješ stále Formy tak, ako si ich nechal, len meníš ich viditeľnosť a kedykoľvek sa ne môžeš odkázať. To je zároveň ale aj mínus, pretože udržuješ v pamäti všetky takto získané Formy. Ak sú zložitejšie a je ich viacero, samozrejme to bude mať vyššie nároky na systém. Môžeš samozrejme implementovať funkciu pre mazanie nepotrebných Formov z kolekcie pomocou nejakej zverejnenej metódy. Treba taktiež myslieť na prípad, kedy formulár zatvoríš a chceš, aby sa zatvorila celá aplikácia.

V tom prípade by si to mohol urobiť napríklad takto, proste natvrdo aplikáciu vypnúť:
Kód:
    protected override void OnClosing(CancelEventArgs e)
    {
         Application.Exit();
    }


Ďalší spôsob, ako by sa to dalo urobiť, je implementovať Singleton na úrovni jednotlivých Formov. Vtedy by si sa na Formy odkazoval napríklad takto:

Kód:
     private void button1_Click(object sender, EventArgs e)
     {
          Form1.Instance.Show();
          this.Hide();
      }   


Tiež treba myslieť na to, čo sa stane, ak to okno zatvoríš... Ak by si to spravil len takto, zasa sa ocitneš v rovnakej situácii a treba to riešiť.

Taktiež existuje spôsob, že by si upravil konštruktor tak, aby prijímal odkaz na Form, ktorý ho vytvoril. Urobil by si v podstate nejakú obdobu reťaze, kedy by najnovší formulár bol zodpovedný za všetky na neho naviazané. Problém by nastal, keby si mal Formov viac a chcel by si sa odkázať na nejaký umiestnený niekde inde v reťazi, to by som riešiť vážne nechcel...

Tu by som asi pri príkladoch skončil, aj tak ich je imho viac ako dosť :lol: Na jeden si došiel aj sám :)
Problém pri tom tvojom prípade je v jednom - čo by si urobil, keby bolo takýchto Formov viac a chcel by si uchovať ich stavy a preklikávať sa medzi nimi menej lineárnym spôsobom. Pohraj sa s tým, uvidíš, čo ti najviac vyhovuje a podľa toho si vyber. Using podľa mňa v tvojom prípade nepotrebuješ, nemáš žiadne unmanaged zdroje (aspoň si teda nespomenul) a keď už by si mal, odstraňovanie by som riešil inak a nie globálne cez Form... Ale tak to tiež záleží od konkrétnych potrieb.

Hádam som nepopísal kraviny, posledné dni som neskutočne unavený :?







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 16.04.2013 17:40

walther, veľmi Ti ďakujem, dosť sa v tom strácam ako začiatočník.
Ale nieco spraviť je dobra skola.
Preto si dovolím sem dať trošičku dlhší kód.
Chcem sa opýtať, že či je ten kód OK.
Ono síce nevypisuje ziadnu chybu, ale to neznamena, ze je to napisane spravne.

Ja si myslim, ze je OK, ale nemam istotu
Zmenil by si na nom nieco?

Ďakujem.

Dve triedy na (zatial iba) ukladanie polynomov a matic.

Kód:
namespace Vypocet_vlastnych_cisel_matic
{
    public partial class Main_Form : Form
    {       

        //Hlavný formulár
        public Main_Form()
        {
            InitializeComponent();
        }

        private void Main_Form_Load(object sender, EventArgs e)
        {
            Polynomial novyPolynom = new Polynomial();
            Matrix novaMatica = new Matrix();
        }

        public class Polynomial
        {
            private decimal[] polynomBody;

            public decimal[] PolynomBody
            {
                get
                {
                    return polynomBody;
                }

                set
                {
                    polynomBody = value;
                }
            }
        }

        public class Matrix
        {
            private Polynomial[,] matrixBody;
            private decimal[] determinantMatice;

            public Polynomial[,] MatrixBody
            {
                get
                {
                    return matrixBody;
                }

                set
                {
                    matrixBody = value;
                }
            }

            public decimal[] DeterminantMatice
            {
                get
                {
                    return DeterminantMatice;
                }
            }
        }
       
       
        private void Call_Input_Form_Click(object sender, EventArgs e)
        {
            Form f = FormManager.GetInstanceOfForm<Input_Form>();
            f.Show();
            this.Hide();
        }

        private void Main_Form_FormClosing(object sender, FormClosingEventArgs e)
        {
            Application.Exit();
        }
    }
    //Manažér formulárov
    internal class FormManager
    {
        private static List<Form> _myForms = new List<Form>();

        internal static Form GetInstanceOfForm<T>() where T : Form
        {
            Form form = _myForms.SingleOrDefault(o => o is T);

            if (form == null)
            {
                form = Activator.CreateInstance<T>();
                _myForms.Add(form);
            }

            return form;
        }
    }

}


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 16.04.2013 18:07

Čo sa týka matematickej stránky veci, čiže počítanie matíc, ti neporadím, ale môžem ti pozrieť na C# kód..
Ak používaš vlastnosti tried len takto, že ak nepotrebuješ riešiť žiadnu logiku v setteri ani getteri, C# obsahuje jednu veľmi užitočnú funkciu, ktorá ti vie ušetriť (v tvojom prípade) pár riadkov písania - automatické vlastnosti.

Menšia ukážka na tvojom prípade:

Kód:
        public class Polynomial
        {
            public decimal[] PolynomBody { get; set; }
        }

        public class Matrix
        {
            public Polynomial[,] MatrixBody { get; set; }
            public decimal[] DeterminantMatice { get; private set; }
        }


Pri väčších projektoch sa dakedy ušetria aj stovky riadkov... :) Funguje to na pozadí rovnako, akurát sa toľko nenapíšeš a kód je potom prehľadnejší. Privátne premenné v tomto prípade nepíšeš, pretože sa vytvárajú automaticky a C# to vie potom využiť. Ja len aby si nepísal niečo takéto:

Kód:
private Polynomial[,] matrixBody;
public Polynomial[,] MatrixBody { get; set; }

Tá privátna premenná by sa vôbec nepoužila (aspoň pokiaľ viem). V každom prípade je to zbytočnosť.

Ďalšia vec, odporúčal by som sa vyvarovať zbytočných komentárov, ako napríklad tu:
Kód:
//Hlavný formulár
public Main_Form()

Názov je dostatočne popisný, netreba pridávať ďalšie riadky zbytočne.

Tvoj Load handler v stave, v akom je teraz, nedáva zmysel. Vytváraš síce nové objekty a inštanciu samotného Formu uchovávaš, ale tieto premenné majú pôsobisko len v samotnej funkcii a potom sa zahodia. Ak ich chceš uchovať a pracovať s nimi niekde ďalej, definuj si ich ako privátne premenné (a/alebo aj vlastnosti, ak ich chceš použiť mimo tohto Formu).

Kód:
 public partial class Main_Form : Form
 {       
        private Polynomial _polynom;
        private Matrix _matica;       

        public Main_Form()
        {
            InitializeComponent();
        }

        private void Main_Form_Load(object sender, EventArgs e)
        {
            _polynom = new Polynomial();
            _matica = new Matrix();
        }
        ....


Toto máš ako projekt do školy, do práce, či sa len samovzdelávaš? :)







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 16.04.2013 18:29

Ďakujem.

O automatických vlastnostiach viem, si ma vlastne predbehol :-) lebo som to chcel potom upraviť na ten skrátený tvar.

Ak som dobre pochopil, ak vytváram triedu a v nej premenné, implicitne sú private. Mne sa zdá, že som to aj čítal, ja som tam to private dal pre istotu :-) Ale dík, že ma na to upozorňuješ, aby som si hneď nespravil nejaké hlúpe návyky :-)

A to že som definoval premenné v Main_Form_Load() je teda riadna blbosť, ale to som tam len narýchlo dal, je logické, že ich budem definovať na úrovni formu, alebo nad ním, podľa toho, či ich budem potrebovať v druhom forme. Díky.

Tak je to do školy, ale aj sa samovzdelávam - tak hybridne :D

Ešte mám jednu otázočku:

Aký je rozdiel medzi týmto
Kód:
Polynomial novyPolynom = new Polynomial();

a týmto?
Kód:
novyPolynom = new Polynomial();

Je to rovnocenné?

Vďaka.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 16.04.2013 18:44

V prvom prípade vykonávaš zároveň dva kroky
1.) definuješ premennú
2.) priraďuješ do nej hodnotu

Pri druhom prípade je krok len jeden. Samozrejme tú premennú musíš mať najskôr definovanú niekde... Tomu sa nevyhneš. Niektorí odporúčajú prvý postup, niektorí zas druhý.. Záleží to hlavne od situácie, čo je vhodnejšie :)

Ak sa ešte len učíš, skús zvážiť WPF namiesto Winforms. V mnohých ohľadoch je to podľa môjho názoru lepšia vec a imho to má aj väčšiu budúcnosť (budeš vedieť napríklad robiť aplikácie pre Win8 a vyššie, ktoré využívajú prakticky rovnakú syntax čo sa týka UI). Winforms sú dosť špinavé a síce to "funguje", existujú lepšie postupy.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 16.04.2013 20:08

Hm, tak toto dokončím v Winforms. Ale nabudúce, pôjdem cez WPF.

Ale ďalšia vec ma škrie, už si pribadám ako Nevedko :-)

Je síce pekné, že mám tento kód, ale akosi som narazil na problém, ako pri vytváraní inštancie tejto triedy poviem, že chcem maticu 4. rádu. Jednoducho aby to pole bolo 4x4. Vôbec sa nechytám :-(
Chcel som to skúsiť cez konštruktor, ale neviem, čo mám doňho napísať, navyše mi vypíše:
(Konštruktor mám byť to, čo začína na 3. riadku) :cry:

'Vypocet_vlastnych_cisel_matic.Main_Form.Matrix' does not contain a constructor that takes 0 arguments



Kód:
public class Matrix
        {
            public Matrix(byte radMatice)
            {
                MatrixBody = matrixBody[radMatice,radMatice];
            }
            private Polynomial[,] matrixBody;
            private decimal[] determinantMatice;

            public Polynomial[,] MatrixBody
            {
                get
                {
                    return matrixBody;
                }

                set
                {
                    matrixBody = value;
                }
            }

            public decimal[] DeterminantMatice
            {
                get
                {
                    return DeterminantMatice;
                }
            }
        }


To čo som napísal do toho konštruktora, je asi úplny nezmysel. Keby som mohol pozrieť ten implicitný konštruktor, by mi to pomohlo.
Dá sa nejako pozrieť implicitný konštruktor? Používam MS Visual C# 2010 Express Edition.
Už by som tento deň mal dať oddych od toho, lebo nasilu to robiť, je zbytočne stratený čas.

Veľmi pekne ďakujem za trpezlivosť a ochotu.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 16.04.2013 20:58

Implicitný konštruktor (čiže ten defaultný bez parametrov, ktorý máš automaticky) je len vtedy, ak ty nešpecifikuješ nejaké svoje. Ty si si už jeden zadefinoval, čiže buď musíš použiť ten alebo si musíš vytvoriť ďalší..

Kód:
public class Matrix
{
     public Matrix()
     {
          // do something
     }
 
     public Matrix(byte radMatice)
     {
          //  do something else
     }

     ...
}

Až teraz môžeš využívať oba konštruktory.

Čo sa týka inicializovania dvojrozmerného poľa, máš to jednoduché, napríklad:

Kód:
int[,] dvojrozmernePole = new int[4,4]; // pole intov o velkosti 4x4


V tvojom prípade by si chcel asi niečo takéto:

Kód:
MatrixBody = new Polynomial[radMatice, radMatice];







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 17.04.2013 10:50

Ahoj, už mi to začína byť trápne. Ale napísal som v triede Matrix 2 metódy:
Kód:
public Polynomial GetPrvokMatice(byte columnMatrix, byte rowMatrix)
            {
                return matrixBody[columnMatrix, rowMatrix];
            }

            public void SetPrvokMatice(byte columnMatrix, byte rowMatrix, Polynomial prvokMatice)
            {
                matrixBody[columnMatrix, rowMatrix] = prvokMatice;
            }

Vytvorím polynóm a maticu:
Kód:
            Polynomial[] newpolynom = new Polynomial[7];
            Matrix[,] newmatrix = new Matrix[4, 4];

a chcem zapísať prvok do matice, ale neviem ako.
Kód:
newmatrix(1,2) = newpolynom;


najprv som skusal
Kód:
newmatrix[1,2] = newpolynom;
lebo som si myslel, že to prevzalo vlastnosti polí, ale to nejde.
Potom som skúsil preťažiť vlastnosti get a set, ale ani to sa asi nedá.
Ako zapísať a prečítať prvok triedy Matrix (vlastne inštancie newmatrix)?

Dúfam, že Ťa moc neobťažujem. Napriek tomu, že som si časť knihy o triedach, štruktúrach a objektoch prečítal 3x (Trey Nash: C# 2010) a niektoré časti viackrát, stále sa strácam.

Ďakujem.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 17.04.2013 12:11

Nevidím celý tvoj kód, ale podľa toho, čo si napísal, stačí ti predsa použiť len tie tvoje metódy... :)

Kód:
newmatrix.SetPrvokMatice(column, row, newpolynom);


Ak by si mal vlastnosti spravené tak, že ich môžeš upravovať zvonku (t.j. public, ako si mal uvedené vyššie pri ukážkach tried), dalo by sa to aj takto:

Kód:
Matrix newmatrix = new Matrix();
newmatrix.MatrixBody = new Polynomial[4,4]; // ak pole nebolo zatial inicializovane v konstruktore, v opacnom pripade toto nerob
newmatrix.MatrixBody[column, row] = newpolynom;


V tomto prípade by si tie metódy ani nepotreboval.
Treba si uvedomiť, čo a ako definuješ. U teba je Matrix ako trieda, ak to napíšeš ako Matrix[], tak ide o pole Matrixov. To asi nebolo naschvál, či hej?







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 17.04.2013 12:51

Joj, som to už tak prekombinoval, že už som tam začal robiť blbosti, samozrejme že som nechcel pole Matrixov a Polynomov.

Jediné, čo chcem dosiahnuť je, že mam triedu Matrix, ktorá ma premennu, v ktorej je 2-rozmerne pole polynomov. A samozrejme, že chcem pristupovať k jednotlivym prvkom (polynomom) matice.
Zdanlivo jednoducha vec je pre začiatočníka úplne peklo, teda pre mňa :-o
To iste chcem aj s polynomami, ale tam chcem aj metody na scitanie/odcitanie a nasobenie polynomov. (Idealne, qôli zjednodušeniu by to bolo cez preťaženie operátorov, pretože budem s nimi robiť veľké množstvo matematických operácií)

Ja dam sem cely kod triedy, ak mozes, mi, prosim Ta, porad, ako inicializovať instanciu triedy matrix:
Kód:
Matrix novamatica = new Matrix(radMatice, radMatice);

A ako pristupovat k jednotlivym prvkom matice (citat a zapisovat)

A tu sa rovno opytam, ako mozem vytvorenu instanciu jednoducho zmazať. O to sa sice stara Garbage Collector, ale ak to chem TU a TERAZ (ked uz budem mat istotu, že ju nebudem potrebovat), da sa to nejako jednoducho?

Kód:
public class Matrix
        {
            private Polynomial[,] matrixBody;
            private decimal[] determinantMatice;

            public Polynomial[,] MatrixBody
            {
                get
                {
                    return matrixBody;
                }

                set
                {
                    matrixBody = value;
                }
            }

            /*public Polynomial PrvokMatice //(byte columnMatrix, byte rowMatrix)
            {
                get
                {
                    return matrixBody[columnMatrix,rowMatrix];
                }
            }*/
            /*public Polynomial GetPrvokMatice(byte columnMatrix, byte rowMatrix)
            {
                return matrixBody[columnMatrix, rowMatrix];
            }

            public void SetPrvokMatice(byte columnMatrix, byte rowMatrix, Polynomial prvokMatice)
            {
                matrixBody[columnMatrix, rowMatrix] = prvokMatice;
            }*/

            public decimal[] DeterminantMatice
            {
                get
                {
                    return DeterminantMatice;
                }
            }
        }


Dík, za trpezlivosť so mnou.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 17.04.2013 13:42

Máš šťastie, že ide o C#. Pri inom jazyku by som ťa poslal už dávno kade-ľahšie :lol: Toto sú vážne už základy.

Trošku si asi nepochopil, na čo sú vlastne vlastnosti tried. Ide pri nich o to, aby si nemusel ručne vypisovať ďalšie takéto metódy ako "získaj prvok matice na pozícii z tejto premennej...". Zbytočne si to komplikuješ. Buď používaj metódy, alebo vlastnosti. Nemá zmysel mať aj to, aj to, pokiaľ to budeš používať na identické úlohy. Duplikuješ si kód. Skús niečo takéto:

Kód:
public class Matrix
{
    public Polynomial[,] Body { get; private set; }
    public decimal[] Determinant { get; private set; }

    public Matrix(byte rows, byte columns)
    {
         MatrixBody = new Polynomial[rows, columns];
    }
}


Máš to isté napísané na 10 riadkov. Potom to použiješ takto:

Kód:
Matrix matica = new Matrix(4,4);

// nastavenie polynomu
matica.Body[0,1] = nejakyPolynom;

// ziskanie polynomu
Polynomial polynom = matica.Body[0,1];


Samozrejme nezabudnúť, že Polynomial je takisto len trieda, nie pole ;)







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 17.04.2013 17:57

Ďakujem. K tým triedam sa ešte vrátim.

Vieš mi vysvetliť, prosím Ťa, čo je v tomto kóde zle?

Kód:
String t1 = "-4.939";
            String t2 = "0.0.5061";
            Decimal d1;
            Decimal d2;
           
            try
            {
                d1 = Decimal.Parse(t1);
                d2 = Decimal.Parse(t2);
            }
            catch( System.FormatException )
            {
                MessageBox.Show("Zlý formát");
            }
            catch
            {
                MessageBox.Show("Ina chyba.");
            }


Vypíše chybu:
Use of unassigned local variable 'd1'
Use of unassigned local variable 'd2'


Vôbec to nechápem, išiel som úplne presne podľa knižky, aj tak to nejde. Buď niečo prehliadam, alebo už som naozaj tak hlúpy.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 17.04.2013 18:22

Ide o to, že d1 ani d2 nemáš nijako inicializované. Hej, snažíš sa o to v "try" bloku, ale problém je v tom, že ak to zlyhá, používaš vlastne neinicializovanú premennú. Túto chybu vyhadzuje vtedy, keď sa snažíš d1 a d2 použiť niekde ďalej v kóde, ktorý si neukázal :)

Najjednoduchšie je v takomto prípade inicializovať premennú na nejakú defaultnú hodnotu, väčšinou sa používa nula. Potom ti dá kompilátor pokoj.







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 17.04.2013 21:57

No pekne, to by ma nenapadlo. Dik.

Zasa mam otazku, ak mam nejaku funkciu, ktora vracia nejaky typ premennej a ta z nejakych pricin, ktore viem, ze mozu nastat, nemoze spravit co ma, ako to osetrit, aby pri skonceni dala patricne vediet, ze je vsetko OK, alebo nastala chyba.

Kód:
        private int[,] ConvertToMatrix(string TextMatice)
        {
            //tu sa bude prevadzat text na jednotlive prvky matice, t. j. na cisla
            //ale ak sa stane, že tam bude malo cisel, tak funkcia nemoze dat
            //vysledok pole[,]. Ako to vyriešiť, aby funkcia nejako dala vedieť,
            //že sa to nedá, že chýbajú nejaké prvky, alebo je nesprávny formát?
            //predpokladam, ze tej funkcii sa da napisat nejaká vynimka.
            //S tymto vzdy mam problém, ja som to riešil tak, že som vratil
            //pozadovany format pri skonceni a mal som verejnu premennu, kde som vlozil
            //svoj kod chyby a potom som to vonku (mimo funkcie) osetril.
            //To asi nebude moc dobra metoda programovania.
            //Neviem ako to mam osetrit, aby to bolo korektne.
            return pole;
        }


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 17.04.2013 22:50

Ideálne by bolo mať asi dve kontroly
1.) v UI, aby bol užívateľ okamžite informovaný o probléme s jeho vstupom
2.) v samotnej metóde (tu asi vyhodením ArgumentException)

Ide o situáciu, kedy by program určite nemal len tak bezstarostne pracovať ďalej. Vstupné dáta sú nesprávne, užívateľ by ich mal opraviť. Určite sa nesnaž vstup opraviť alebo dačo podobné. Reálna implementácia je ale už na tebe, do hry vstupuje viac faktorov..







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 19.04.2013 20:09

Ide o to, že užívateľ vloží maticu vo forme textu do TextBoxu v požadovanom formáte, potom stlačí tlačidlo a začnú sa spracovávať dáta (string) z textového poľa. Pokiaľ nastane chyba, reťazec v ktorom je chyba, sa označí (vysvieti). To je všetko ok.
Napr. funkcia má výstup pole. Ale ak nemôže to pole naplniť korektnými dátami, tak výstup pole je nezmysel, ale výstup má byť pole, ako toto vyriešiť? Ako dám na výstupe vedieť, že to nie je ok? Môžem cez verejnú premennú, ale fakt neviem, či je to vhodné. Nerád by som používal techniky, ktoré sú nekorektné a v budúcnosti by mi spôsobovali problémy.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 19.04.2013 22:47

Imho by sa tá funkcia nemala ani spustiť, mala by to vyfiltrovať validácia vstupu. Ak sa tak už stane (nedá sa predsa myslieť na všetko), funkcia by mala hodiť výnimku. Celý ten kód vlastne obalíš do try-catch a podľa potreby zareaguješ. Nie vnútri triedy alebo dokonca metódy, mimo.
Ono tých spôsobov je viacero a problém je v tom, že sa názory ľudí trochu líšia ohľadom konkrétnych praktík. Záleží od konkrétnej situácie a potrieb. Hovorí sa, že hádzanie výnimiek je dosť náročné, ale čo iné s tým spraviť v takomto prípade, ako opisuješ? Vstup je očividne zlý a dostal sa cez validáciu. Bráni to správnemu vykonávaniu programu? Bráni...
Vieš, dá sa to urobiť ako si povedal, že nastavíš nejakú premennú a pokúsiš sa vykonávanie zastaviť, lenže aj to sa dá len v rámci nejakých medzí. Čo keby na tejto funkčnosti záviseli ďalšie triedy a funkcie, ktoré by sa tie hodnoty snažili použiť?

Chápeš jak to myslím nie?







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 29.04.2013 16:31

Ahoj!
To, čo si písal v poslednom príspevku, tomu rozumiem, len ja som sa asi nie najlepšie vyjadril. Ja mám metódu KonvertujTextNaMaticu() a ona sa stará o to, aby sa text previedol na jednotlivé členy matice. A tu som chcel, aby ak to zlyhá, aby dala vedieť o tom, že to nie je OK, ale už som to vyriešil cez public bool a public string vo formulári, kam šupne info o tom, či je chyba a ak je už vráti aj text, ktorý vypíše užívateľovi.


Teraz iešim samotný polynóm.

Mám class:
Kód:
public class Polynomial
        {
            public Decimal[] body { get; set; }

            public Polynomial()
            {
                body = new Decimal[];
            }

            public Polynomial(byte stupen)
            {
                body = new Decimal[stupen];
            }

            public Polynomial(Decimal[] prvky)
            {
                body = prvky;
            }

        }


Tu je problém, že v prvom konštruktore je chyba, nemôžem inicializovať pole bez zadania dĺžky pola. Bolo by super, keby som mohol len vytvoriť inštanciu triedy Polynomial a až potom určiť dĺžku poľa (dynamické pole?), ale to by som už asi moc komplikoval. Dá sa to nejako ošetriť? Ak nie je na to nejaké jednoduché riešenie, tak to zatiaľ nebudem implementovať (bezparametrový konštruktor zruším)

Inicializácia, zapisovanie a aj čítanie jednotlivých členov ide:
Kód:
Polynomial poly1 = new Polynomial(5);
            Polynomial poly2 = new Polynomial(3);
            Polynomial poly3 = new Polynomial(new Decimal[]{ 1, 2, 3, 4 });

            Decimal[] c = new Decimal[] { 1, 2, 3, 4, 5 };

            Polynomial poly5 = new Polynomial(c);
           
            poly1.body[1] = 45;
            poly2 = poly1;


Tu mám jednu dôležitú otázku k poslednému riadku. Ten riadok, čo presne vykoná?
1. skopíruje poly1 do poly2?
2. priradí referenciu na poly1 do poly2?

Musím sa Ti priebežne veľmi poďakovať za Tvoju nezištnú pomoc.

Ďakujem.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 29.04.2013 16:36

fooha, moj predpoklad bol správny:
Kód:
            Polynomial poly1 = new Polynomial(new Decimal[]{1,2,3});
            Polynomial poly2 = new Polynomial(new Decimal[]{4,5,6});
            MessageBox.Show(poly1.body[0] + ", " + poly2.body[0]);
            poly1.body = poly2.body;
            MessageBox.Show(poly1.body[0] + ", " + poly2.body[0]);
            poly2.body[0] = 7;
            MessageBox.Show(poly1.body[0] + ", " + poly2.body[0]);

Posledná hláška: "7, 7", takže len skopíroval odkaz.

Takže teraz musím prísť nato, ako použiť Clone, alebo čo.


Dobre, takže som sa s tým hrajkal skoro pol hodiny, ale na nič som nedošiel. Pri klonovaní, mu vždy vadí, že object sa nedá implicitne konvertovať na Polynomial:
Kód:
Polynomial poly6 = poly2.body.Clone();

respektive
Unable to cast object of type 'System.Decimal[]' to type 'Polynomial':
Kód:
poly1 = (Polynomial)poly2.body.Clone();


Nenapadá ma, ako to vyriešiť, aj keď verím, že je to banalita.

Je mi jasné, že budem musieť preťažiť aj operátor '='. Lebo určite chcem s polynómami pracovať rovnako ako s premennými typu double, či decimal. T.j. keď napíšem poly1 = poly2; tak sa poly2 musí skopírovať do poly1.


Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 29.04.2013 18:16

Pozri si toto: http://stackoverflow.com/questions/7853 ... in-c-sharp
A to, prečo ti to hentak nefunguje, je v tom, že ty chceš priradiť do objektu s typom Polynomial vlastnosť druhého objektu s typom decimal[]. Ak chceš vytvoriť kópiu objektu, musíš kopírovať celý objekt...Alebo kopírovať z jednej vlastnosti do druhej s rovnakým typom...

Čiže buď
poly1 = poly2.Clone();

alebo
poly1.body = poly2.body.Clone();

V prvom prípade sa drž tej otázky na StackOverflow, je to tam pekne vysvetlené...







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 29.04.2013 18:45

poly1 = poly2.Clone;
To je prvé, čo som chcel spraviť, ale taká metóda neexistuje.
To je pravda, že ja som vlastne nešiel klonovať inštanciu, ale len časť inštancie. :-o

No, riešim ďalej, dám vedieť. Dík.


Naposledy upravil SuchSoft dňa 29.04.2013 18:46, celkovo upravené 1

Offline

Skúsený užívateľ
Skúsený užívateľ
C# - ako skryť aktívny formulár a otvoriť druhý formulár

Registrovaný: 24.01.08
Prihlásený: 13.09.17
Príspevky: 14572
Témy: 66
Bydlisko: Žilina
Príspevok NapísalOffline : 29.04.2013 18:46

Neexistuje, lebo tvoj objekt neimplementuje IClonable. Kukni ten StackOverflow ako som povedal, tam máš rovno aj ukážku ;)







_________________
C#, PHP, ...
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 29.04.2013 23:41

Začínam pochybovať o tomto jazyku, veď najprimitívnejšia vec, je tak brutálne komplikovaná.
To, čo si mi dal ten odkaz, ako klonovať objekty (Serializable), vôbec neviem, ako použiť. Pre mňa je ten kód ťažko čitateľný.
Ak si implementujem (v mojom prípade skopírujem :loony: ) tú triedu
Kód:
 public static class ObjectCopier
, tak čo s tým ďalej? Ako to použiť?

Ja chcem iba takú primitívnu vec:
poly1 = poly2; //Aby sa spravila kópia.
Objekty triedy Polynomial, budú obsahovať len hodnoty (nie referencie).
Nedá sa to nejako jednoduchšie implementovať (aj keď typovo nie úplne správne), ako písať 20 riadkov kódu na to, aby sa spravila kópia objektu?
Som skúšal cez ICloneable, ale nerobí kópie, len odkazuje.
Kód:
public class Polynomial : ICloneable
        {
            public Decimal[] Body { get; set; }

            public Object Clone()
            {
                return this.MemberwiseClone();
            }
            private Polynomial(Polynomial other)
            {
                this.Body = other.Body;
            }

            public Polynomial(byte stupen)
            {
                Body = new Decimal[stupen];
            }
            public Polynomial(Decimal[] prvky)
            {
                Body = prvky;
            }

        }


no keď spravím
Kód:
            Polynomial poly1 = new Polynomial(new Decimal[]{1,2,3});
            Polynomial poly2 = new Polynomial(new Decimal[]{4,5,6});
            poly1 = (Polynomial)poly2.Clone();

Tak len skopíruje odkaz.

Radšej by som to síce mal typovo správne, cez to Serializable, to je asi oveľa správnejšie, ale neviem to použiť. Škoda, že tam nie je vzor použitia.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 30.04.2013 8:11

Kód:
public class Polynomial
        {
            public Decimal[] Body { get; set; }

            public Polynomial(byte stupen)
            {
                Body = new Decimal[stupen];
            }
            public Polynomial(Decimal[] prvky)
            {
                Body = prvky;
            }

            public static T Clone<T>(T source)
            {
                if (!typeof(T).IsSerializable)
                {
                    throw new ArgumentException("The type must be serializable.", "source");
                }

                if (Object.ReferenceEquals(source, null))
                {
                    return default(T);
                }
                IFormatter formatter = new BinaryFormatter();
                Stream stream = new MemoryStream();
                using (stream)
                {
                    formatter.Serialize(stream, source);
                    stream.Seek(0, SeekOrigin.Begin);
                    return (T)formatter.Deserialize(stream);
                }
            }
        }

a keď chcem vytvoriť kópiu:
Kód:
poly1 = poly2.Clone();

Error 1 No overload for method 'Clone' takes 0 arguments
Metóda pýta jeden parameter, ak to správne chápem, ale na stránke sa uvádza, že metóda sa dá jednoducho zavolať:
Now the method call simply becomes objectBeingCloned.Clone();
Tak to už nechápem.


keď píšem "poly." neponúka mi metódu Clone().
Tá metóda je statická, pretože je to metóda triedy, ktorá má robiť kópie jej inštancií?
Nerozumiem zatiaľ príkazom s parametrom 'T'.

Dík.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 25.11.07
Prihlásený: 02.07.21
Príspevky: 101
Témy: 21
Bydlisko: Bratislava
Príspevok Napísal autor témyOffline : 30.04.2013 9:46

Jáááááááááj.
Keď je to metóda inštancie, tak potom:
Kód:
poly1 = Polynomial.Clone(poly2);


Ale vyhodí exception, že objekt nie je serializable.

Yupee, dal som pred class [Serializable] a ono to funguje.


Odpovedať na tému [ Príspevkov: 68 ] Choď na stránku: 1, 2, 3 ďalšia


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Ako skryt scrollbar v terminaly

v Operačné systémy Unix a Linux

0

438

02.02.2010 23:40

Ivan11114 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako skryť .html napriklad kuma.sk/info

v HTML, XHTML, XML, CSS

7

524

30.11.2014 19:54

Mego Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako mam skryt moju IP, resp. zmenit

v Sieťové a internetové programy

2

817

15.08.2008 0:23

suchy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. 3Ds Max rigg - ako skryť bipedove kosti po riggingu

v Grafické programy

0

507

29.03.2011 18:03

FxEngine Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Aktívny subwoofer ako nastaviť vysokoúrovňový vstup HI/LOW prevodnik

v Elektronika

2

643

27.12.2019 15:42

jamal Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako otvorit rar?

v Operačné systémy Unix a Linux

4

1698

16.01.2009 19:33

webkar Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ako otvorit port?

v Počítačové hry

1

709

19.03.2010 18:58

kllr007 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. AKo zapojit druhy monitor ?

v Monitory, televízory a projektory

3

412

17.12.2014 22:29

Miso122 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako otvoriť súbor OXPS?

v Ostatné programy

2

1312

19.01.2015 20:12

liveman Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako otvoriť súbor .organ

v Ostatné programy

4

488

08.12.2012 23:04

MiskoMalco Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako nasilu naformatovat druhy HDD?

v Pevné disky a radiče

8

973

01.05.2009 21:45

tairikuokami Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako pridať druhý harddisk + Linux

v Pevné disky a radiče

4

646

20.06.2011 19:16

gamelaster Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako vymazem druhy operačny system ?

v Operačné systémy Microsoft

8

843

02.03.2009 19:22

dsljohn Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako otvoriť exe v ničom

v Ostatné programy

4

1409

25.06.2008 12:24

Gyrxiur Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako otvoriť HDD bez poškodenia?

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Pevné disky a radiče

32

2953

10.02.2007 13:56

Jerry19 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Jeden reproduktor hrá hlasnejšie ako druhý

v Zvuk

1

425

15.06.2013 17:43

shiro Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra