Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Poggy
Člen
Avatar
Poggy:4.3.2017 11:06

Ahoj všichni,

studuji učebnice od Radka Vystavěla, Moderní programování pro středně pokročilé - druhý díl. Mám velký problém s pochopením kapitoly 10 designer. Chápu to snad dobře do strany 146. Můj problém je mezi stranami 147 - 150. Snažím se předělat jeden z jeho předešlých programů (Kruhový pohyb) dle návodu na těchto stranách. Bohužel absolutně nechápu kam mám napsat kód (metodu) na straně 149. void KoleckoStredem(­......)
Mátě někdo tyto učebnice a poradíte? V dalších kapitolách totiž s tímto pracuje a bez pochopení tohoto se dál nedosatnu.
Budu vdečný za radu. Zdroják sem dávat nebudu, nechci provokovat kvůli autorským právům. Děkuji.

 
Odpovědět
4.3.2017 11:06
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Poggy
ostrozan:4.3.2017 17:00

Nevím kolik lidí vlastní tu učebnici, ale možná bys měl větší šanci dát sem konkrétní kód - použij </> pro vložení - s popisem, čemu nerozumíš. A s tím autorským pravém to tak neprožívej - stačí pro klid duše (tvojí) když uvedeš zdroj.

Mimochodem, je pěkné, že tě trápí autorova práva, ale že mu tu děláš reklamu - to ti nevadí?

 
Nahoru Odpovědět
4.3.2017 17:00
Avatar
Poggy
Člen
Avatar
Odpovídá na ostrozan
Poggy:4.3.2017 17:18

Za tu reklamu se omlouvám, jsem samouk a bohužel se nemám koho zeptat. Pokud je to pro server problém, klidně toto vlákno smaž a nebo požádám admina o smazání.
Jedná se o jednoduchý program s kuličkou co obíhá po kružnici. Rychlost a směr je definován tlačítky. Původně byl prográm definová bez třídy a metod. Jen s tím co je součástí VS. Jeho úprava měla spočívat ve dvou parametrech. První definice samostatné třídy (první zdroják níže). To se mi nakonec povedlo. Druhá metoda měla být bez založení třídy v okneprogramu (Form1.cs) a tam právě netuším kam metodu z té třídy vložit. To je to co jsem asi nepochopil správně ve výkladu.

Založená třída (tu chci "smazat"):

namespace Kruhovy_pohyb
{
    static class VlastniNastroje
    {
        public static void KoleckoStredem(this Graphics kp, Color barva, bool vyplnene, double xStredu, double yStredu,
                                          int polomer)
        {
            int xLH = Convert.ToInt32(xStredu - polomer);
            int yLH = Convert.ToInt32(yStredu - polomer);
            int sirka = 2 * polomer;
            int vyska = sirka;
            // kresba
            if (vyplnene)
            {
                Brush stetec = new SolidBrush(barva);
                kp.FillEllipse(stetec, xLH, yLH, sirka, vyska);
            }
            else
            {
                Pen pero = new Pen(barva);
                kp.DrawEllipse(pero, xLH, yLH, sirka, vyska);
            }
        }
    }
}

Zestručněný zdroják, je v něm okomentována i původní verze bez třídy. Někam se bych měl vložit následující:

void KoleckoStredem(this Graphics kp, Color barva, bool vyplnene, double xStredu, double yStredu,
                                          int polomer)
        {
            int xLH = Convert.ToInt32(xStredu - polomer);
            int yLH = Convert.ToInt32(yStredu - polomer);
            int sirka = 2 * polomer;
            int vyska = sirka;
            // kresba
            if (vyplnene)
            {
                Brush stetec = new SolidBrush(barva);
                kp.FillEllipse(stetec, xLH, yLH, sirka, vyska);
            }
            else
            {
                Pen pero = new Pen(barva);
                kp.DrawEllipse(pero, xLH, yLH, sirka, vyska);
            }
        }

Ať to ale vložím kamkoliv, tak mi to VS podtrhe. Asi jsem něco nepobral a nevím co.

Kompletní zdroják (Form1.cs):

namespace Kruhovy_pohyb
{
    public partial class oknoProgramu : Form
    {
            // paramerty kružnice
            double xstredu = 250, ystredu = 250;// kvůli tříde změněno na double
            int polomer = 200;
            // parametry kuličky
            double uhel = 270, omega = 0; // omega - úhlová rychlost stupně/sekundu
            int polomerkulicky = 5;

        public oknoProgramu()
        {
            InitializeComponent();
        }

        private void oknoProgramu_Paint(object sender, PaintEventArgs e)
        {
            Graphics kp = e.Graphics;

            // výpočet hodnot pro kružnici
            /*int xLH = xstredu - polomer;
            int yLH = ystredu - polomer;
            int sirka = 2 * polomer;
            int vyska = sirka;
            // vykreslední kružnice
            kp.DrawEllipse(Pens.Black, xLH, yLH, sirka, vyska); // před zevedením třídy*/
            kp.KoleckoStredem(Color.Black, false, xstredu, ystredu, polomer);
            // výpočet středu kuličky, používat double, dělení se zbytkem!
            double uhelradiany = uhel * Math.PI / 180; // 1stupen = Pí/180rad => 30stupňů = 30*Pí/180rad
            double deltax = Math.Cos(uhelradiany) * polomer;
            double deltay = Math.Sin(uhelradiany) * polomer;
            double xstredkulicky = xstredu + deltax;
            double ystredukulicky = ystredu + deltay;
            // výpočet pomocných hodnot pro kuličku, vychází z parametrů pro kružnici
            /*xLH = Convert.ToInt32(xstredkulicky - polomerkulicky);
            yLH = Convert.ToInt32(ystredukulicky - polomerkulicky);
            sirka = 2 * polomerkulicky;
            vyska = sirka;
            // vykreslení kuličky
            kp.FillEllipse(Brushes.Black, xLH, yLH, sirka, vyska);*/
            kp.KoleckoStredem(Color.CornflowerBlue, true, xstredkulicky, ystredukulicky, polomerkulicky);
        }

Zdroj: Radek Vystavěl - Moderní programování pro středně pokročilé.

Editováno 4.3.2017 17:21
 
Nahoru Odpovědět
4.3.2017 17:18
Avatar
HONZ4
Člen
Avatar
Odpovídá na Poggy
HONZ4:4.3.2017 18:07

void KoleckoStredem(this Graphics kp....
je rozšíření Graphics, takže to musí být pouze ve statické třídě (tak jak je to v prvním kódu) a ta metoda musí být taky statická

Editováno 4.3.2017 18:09
 
Nahoru Odpovědět
4.3.2017 18:07
Avatar
HONZ4
Člen
Avatar
HONZ4:4.3.2017 18:14
namespace Kruhovy_pohyb
{
    public partial class oknoProgramu : Form
    {
            // paramerty kružnice
            double xstredu = 250, ystredu = 250;// kvůli tříde změněno na double
            int polomer = 200;
            // parametry kuličky
            double uhel = 270, omega = 0; // omega - úhlová rychlost stupně/sekundu
            int polomerkulicky = 5;

        public oknoProgramu()
        {
            InitializeComponent();
        }

        private void oknoProgramu_Paint(object sender, PaintEventArgs e)
        {
            Graphics kp = e.Graphics;
            kp.KoleckoStredem(Color.Black... atd.
        }
   }

    static class VlastniNastroje
    {
        public static void KoleckoStredem(this Graphics kp, Color barva, bool vyplnene, double xStredu, double yStredu,
                                          int polomer)
        {
            //kód
        }
    }
}
 
Nahoru Odpovědět
4.3.2017 18:14
Avatar
HONZ4
Člen
Avatar
HONZ4:4.3.2017 18:39

ještě ti doplním příklad toho, oč ses snažil ty:

namespace Kruhovy_pohyb
{
    public partial class oknoProgramu : Form
    {
            // paramerty kružnice
            double xstredu = 250, ystredu = 250;// kvůli tříde změněno na double
            int polomer = 200;
            // parametry kuličky
            double uhel = 270, omega = 0; // omega - úhlová rychlost stupně/sekundu
            int polomerkulicky = 5;

        public oknoProgramu()
        {
            InitializeComponent();
        }

        private void oknoProgramu_Paint(object sender, PaintEventArgs e)
        {
            Graphics kp = e.Graphics;
            KoleckoStredem(Color.Black, false, xstredu, ystredu, polomer, kp);
            //atd.
        }

void KoleckoStredem(Color barva, bool vyplnene, double xStredu, double yStredu,
                                          int polomer, Graphics kp)
        {
            int xLH = Convert.ToInt32(xStredu - polomer);
            int yLH = Convert.ToInt32(yStredu - polomer);
            int sirka = 2 * polomer;
            int vyska = sirka;
            // kresba
            if (vyplnene)
            {
                Brush stetec = new SolidBrush(barva);
                kp.FillEllipse(stetec, xLH, yLH, sirka, vyska);
            }
            else
            {
                Pen pero = new Pen(barva);
                kp.DrawEllipse(pero, xLH, yLH, sirka, vyska);
            }
        }
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
4.3.2017 18:39
Avatar
Poggy
Člen
Avatar
Odpovídá na HONZ4
Poggy:4.3.2017 18:58

To je přesně ono co mi nešlo. Nějak podobně jsem se o to snažil, ale nikdy neuspěl. Vždy jsem tam měl něco malinko jinak a VS mi to podtrhávalo a já nevěděl proč. Moc děkuji za tvůj čas. Už podruhé super odpověď!

 
Nahoru Odpovědět
4.3.2017 18:58
Avatar
HONZ4
Člen
Avatar
Odpovídá na Poggy
HONZ4:4.3.2017 19:18

Proto, ti to podtrhávalo, protože když dáš před první parametr this, tak jde o rozšíření. A rozšíření musí být ve statické třídě a statické. Viz. můj 1. kód.

ps, V kódu nechápu smysl parametrů typu double, když s tím pak pracuješ jako int.

 
Nahoru Odpovědět
4.3.2017 19:18
Avatar
Poggy
Člen
Avatar
Odpovídá na HONZ4
Poggy:4.3.2017 19:36

To je dobrý postřeh. Je možné, že v dalších kapitolách bude tento příklad s nějakou další změnou vyžadující double.
Evidentně bych měl znovu projít třídy. Mám mezery. Děkuji.

Editováno 4.3.2017 19:36
 
Nahoru Odpovědět
4.3.2017 19:36
Avatar
HONZ4
Člen
Avatar
Odpovídá na Poggy
HONZ4:4.3.2017 19:47

To, že v další kapitole to bude tak nebo tak, je irelevantní. Na mě to dělá dojem, že ta kniha asi moc kvalitní nebude..

 
Nahoru Odpovědět
4.3.2017 19:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.