Diskuze: Moderní programování pomůže někdo s kapitolou?
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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í?
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é.
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á
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
}
}
}
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);
}
}
}
}
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ěď!
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.
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.
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..
Zobrazeno 10 zpráv z 10.