Objekty jako zapozdření dat začneme vytvářet vlastní objekty a třídy
Rekapitulace Každý objekt obsahuje: (např. okno programu) proměnné polejméno, tlačítkoodeslat vlastnosti Text, MinimizeBox, BackColor události Load, Paint metody Close, Refresh
Zapouzdření zapouzdření seskupení logicky souvisejících proměnných do jednoho celku (objektu) př. starší program s panáčkem v programu tři proměnné obrázekpanáčka, xpanáčka, ypanáčka zapouzdřením schováme tyto proměnné do jediného objektu panáček díky příslušnosti k objektu už nemusíme v názvu řešit příslušnost stačí značení: obrázek, x, y efekt ještě lépe vynikne, když budeme mít v programu panáčků třeba dvacet bez zapouzdření 3 x 20 = 60 proměnných panáček obrázek x y
Projekt > Přidat třídu název: Panáček.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace WindowsFormsApplication4 class Panáček public int x, y; public Image obrázek; Vytvoření třídy
Modifikátor přístupu klíčové slovo public před definicí proměnných označuje, že s danou proměnnou lze pracovat z kterékoliv části programu použití static zajistí, že s proměnnou lze pracovat pouze zevnitř objektu samotného, ale nikoliv zvenčí
Práce s instancí panáčka vytvoříme novou instanci klasicky pomocí konstruktoru new Panáček() v Loadu okna public partial class oknoprogramu : Form Panáček petr; public oknoprogramu() InitializeComponent(); private void oknoprogramu_load(object sender, EventArgs e) petr = new Panáček(); petr.x = 50; petr.y = 100; petr.obrázek = Properties.Resources.panacek;
zbytek programu private void oknoprogramu_keydown(object sender, KeyEventArgs e) switch (e.keycode) case Keys.Left: petr.x -= 5; case Keys.Righ: petr.x += 5; case Keys.Up: petr.y -= 5; case Keys.Down: petr.y += 5; Refresh(); private void oknoprogramu_paint(object sender, PaintEventArgs e) Graphics kp = e.graphics; kp.drawimage(petr.obrázek, petr.x, petr.y);
Tři panáčci modifikujeme předchozí příklad budou tři panáčci Dlouhý, Široký, Poloslepý vždy jeden aktivní přepínání klávesami D, S a P přemýšlejte, jak blbě by se to programovalo bez zapouzdření dat
public partial class oknoprogramu : Form Panáček dlouhý, široký, poloslepý; Panáček aktivní;.. private void oknoprogramu_load(object sender, EventArgs e) // Připrav Dlouhého dlouhý = new Panáček(); dlouhý.x = 30; dlouhý.y = 50; dlouhý.obrázek = Properties.Resources.postavička_Dlouhý; // Připrav Širokého široký = new Panáček(); široký.x = 120; široký.y = 40; široký.obrázek = Properties.Resources.postavička_Široký; // Připrav Poloslepého (inicializací objektu) poloslepý = new Panáček() x = 70, y = 180, obrázek = Properties.Resources.postavička_Poloslepý; // Po startu programu půjdou klávesy ke Dlouhému aktivní = dlouhý;
private void oknoprogramu_paint(object sender, PaintEventArgs e) Graphics kp = e.graphics; kp.drawimage(dlouhý.obrázek, dlouhý.x, dlouhý.y); kp.drawimage(široký.obrázek, široký.x, široký.y); kp.drawimage(poloslepý.obrázek, poloslepý.x, poloslepý.y); private void oknoprogramu_keydown(object sender, KeyEventArgs e) switch (e.keycode) // Aktivace příslušného panáčka case Keys.D: aktivní = dlouhý; case Keys.D3: // š je jako trojka case Keys.S: // š jako s (pro ignoranty češtiny) aktivní = široký; case Keys.P: aktivní = poloslepý; // Šipky - pohyb case Keys.Left: aktivní.x -= 5; case Keys.Right: aktivní.x += 5; case Keys.Up: aktivní.y -= 5; case Keys.Down: aktivní.y += 5; Refresh();
Výčtový typ enum Pohlaví Muž, Žena ; -------------------------------------------- namespace Zákazník_jako_objekt enum Pohlaví Muž, Žena ; Třída Zákazník class Zákazník public int číslo; public string příjmení; public string jméno; public Pohlaví pohlaví; public int roknarození; public string místobydliště; public double obratcelkem; public double obratposlední;
private void tlačítkoprocházetvýchozí_click(object sender, EventArgs e) if (oknootevřenísouboru.showdialog() == DialogResult.OK) polevýchozí.text = oknootevřenísouboru.filename; private void tlačítkoprocházetvýsledný_click(object sender, EventArgs e) if (oknouloženísouboru.showdialog() == DialogResult.OK) polevýsledný.text = oknouloženísouboru.filename; private void tlačítkovyber_click(object sender, EventArgs e) // Otevření souborů StreamReader výchozí = new StreamReader(poleVýchozí.Text, Encoding.Default); StreamWriter výsledný = new StreamWriter(poleVýsledný.Text, false, Encoding.Default); // Přeskoč první řádek (se záhlavím) výchozí.readline(); // Zapiš správné záhlaví výsledný.writeline("číslo zákazníka;příjmení;jméno"); // Inicializace objektu zákazník Zákazník zákazník = new Zákazník() číslo = Convert.ToInt32(hodnoty[0]), příjmení = hodnoty[1], jméno = hodnoty[2], roknarození = Convert.ToInt32(hodnoty[4]), místobydliště = hodnoty[5], obratcelkem = Convert.ToDouble(hodnoty[6]), obratposlední = Convert.ToDouble(hodnoty[7]) ; if (hodnoty[3].tolower() == "muž") zákazník.pohlaví = Pohlaví.Muž; else zákazník.pohlaví = Pohlaví.Žena; // Ženy ročník 1970 a starší do výsledného souboru if (zákazník.pohlaví == Pohlaví.Žena && zákazník.roknarození <= 1970) výsledný.writeline(zákazník.číslo.tostring() + ";" + zákazník.příjmení + ";" + zákazník.jméno); // Čtení z výchozího, vyhodnocení a případný zápis do výsledného string řádek; while ((řádek = výchozí.readline())!= null) // Rozbití řádku na jednotlivé hodnoty string[] hodnoty = řádek.split(';'); // Zavření obou souborů výchozí.close(); výsledný.close(); MessageBox.Show("HOTOVO!");
Př. myšince pomocí třídy Bod. class Bod public int x, y; -------------------------------------------------------------------------------------- namespace Myšince public partial class oknoprogramu : Form List<Bod> myšince = new List<Bod>(); int šířkamyšince = 5, výškamyšince = 2; Color barvamyšince = Color.Black; public oknoprogramu() InitializeComponent(); private void oknoprogramu_mousedown(object sender, MouseEventArgs e) Bod bod = new Bodx = e.x, y = e.y; myšince.add(bod); Refresh(); private void oknoprogramu_paint(object sender, PaintEventArgs e) Graphics kp = e.graphics; Brush štětec = new SolidBrush(barvaMyšince); foreach (Bod m in myšince) int xlh = m.x - šířkamyšince / 2; int ylh = m.y - výškamyšince / 2; kp.fillrectangle(štětec, xlh, ylh, šířkamyšince, výškamyšince);