Dvourozměrné pole - WPF
4. C#
4.1. Nastavení atributů pole
Metodu Inicializace umístíme do regionu Nastavení atributů pole, který bude součástí regionu Pomocné metody. Jak již bylo řečeno, tato metoda nám zajistí potřebnou inicializaci datových složek třídy a také vyplnění hodnot v objektech na formuláři pomocí těchto hodnot - viz Kód 1. K přístupu k jednotlivým datovým složkám třídy využijeme klíčové slovo this spolu s tečkou za tímto slovem (tečková notace).
Budeme také muset vytvořit instanci třídy - objekt - dvourozměrného pole (matice) s definovanou délkou. Do této matice budeme ukládat hodnoty, vypisovat hodnoty a nebo s ní budeme provádět různé operace. Vytvoření matice provedeme pomocí implicitního konstruktoru (VS ho vytvořil za nás), který přijímá parametr (hodnotu v datové složce pocetRadku a pocetSloupcu) určující velikosti v každé ose naší celočíselné matice. Tyto parametry jsou umístěny v hranatých závorkách, kde první parametr určuje počet řádků a druhý počet sloupců vytvořené matice. Konstruktor matice voláme pomocí klíčového slova new. Vytvořenou instanci přiřadíme do datové složky pole v naší třídě.
#region Nastavení atributů pole /// <summary> /// Inicializace atributů pole a prvků na formuláři /// </summary> private void Inicializace() { // Přiřazení maximálního počtu řádků matice do datové složky this.pocetRadku = Max; // Přiřazení maximálního počtu sloupců matice do datové složky this.pocetSloupcu = Max; // Vytvoření instance (objektu) matice s definovanými rozměry this.pole = new int[this.pocetRadku, this.pocetSloupcu]; // Přiřazení počtu řádků matice do objektu na formuláři this.TxtPocetRadku.Text = this.pocetRadku.ToString(); // Přiřazení počtu sloupců matice do objektu na formuláři this.TxtPocetSloupcu.Text = this.pocetSloupcu.ToString(); /* Přiřazení přípustné minimální hodnoty prvku v matici do objektu * na formuláři určujícího mezní hodnotu */ this.TxtMinHodnota.Text = this.minHodnota.ToString(); /* Přiřazení přípustné maximální hodnoty prvku v matici do objektu (pole) * na formuláři určujícího mezní hodnotu */ this.TxtMaxHodnota.Text = this.maxHodnota.ToString(); } #endregion Nastavení atributů pole
Kód 1: Deklarace metody bez návratu s názvem Inicializace
Pojďme se nyní podívat na metody umístěné v regionu Události, tj. metody pro obsluhu událostí objektů formuláře. Tento region obsahuje další regiony, ale my se nyní zaměříme na region Nastavení atributů pole, který bude obsahovat následující metody:
- TxtPocetRadku_LostFocus
- TxtPocetSloupcu_LostFocus
- TxtMinHodnota_LostFocus
- TxtMaxHodnota_LostFocus
- TxtPrvekIndexRadku_LostFocus
- TxtPrvekIndexSloupce_LostFocus
- TxtHodnota_LostFocus
První metodou, kterou budeme muset upravit je metoda obsluhy události opuštění objektu TxtPocetRadku pro specifikaci počtu řádků matice, tj. vertikální rozměr dvourozměrného pole - viz Kód 2. Pro popis metody využijeme trojitého lomítka, po jehož zadání nad název metody Visual Studio vygeneruje poznámky k dokumentaci ve formě XML prvků přidaných do zdrojového kódu. U těchto prvků budeme specifikovat pouze popis účelu metody. Parametr sender u metody představuje objekt, ke kterému je přidružena metoda obsluhy události v tomto případě TxtPocetRadku. Další formální parametr e představuje data o události. Tyto popisy jsou u metod obsluhy události přidružených k objektům stejné, proto je již v dalších XML značkách nebudeme popisovat.
V metodě deklarujeme lokální proměnnou novaHodnota, do níž budeme ukládat načtenou hodnotu z objektu na formuláři pro specifikaci počtu řádků matice. Po načtení textu z objektu na formuláři (vlastnost Text) provedeme test, zda lze text převést na celé číslo pomocí metody TryParse přidružené k třídě (datovému typu) int. Metoda navrací logickou hodnotu (true nebo false), zda lze konverzi provést, či nikoliv. U metody využijeme výstupní parametr (klíčové slovo out) novaHodnota. Znamená to, že pokud nebude provedena konverze, do parametru bude uložena předdefinovaná hodnota pro typ int, tj. hodnota 0. V následující podmínce testujeme, zda hodnota náleží intervalu 1 až maximální rozměr matice (hodnota je uložena v konstantě Max). Pokud není, přiřadíme do lokální proměnné novaHodnota maximální rozměru ve vertikální směru, tj. počtu řádků matice. Pokud uživatel provedl chybné nastavení rozměru matice, je vhodné ho o této situaci informovat. To provedeme pomocí dialogového okna (třída MessageBox metoda Show). Pro konverzi číselné hodnoty na text uvedené ve výpisu můžeme použít metodu Format třídy String (pokud Vám tento přístup nevyhovuje, můžete místo něho využít metodu ToString). Výhodou této metody je, že ve výpisu využijeme indexaci proměnných pomocí složené závorky, do níž uvedeme index proměnné, jejíž hodnotu chceme v textu vypsat. Chybu vyřešíme nastavením rozměru matice na maximální povolený rozměr, tj. konstanta Max. Musíme zároveň vypsat tento nový rozměr do objektu pro specifikaci počtu řádků matice umístěného na formuláři.
Pokud nový počet řádků matice není stejný jako stávající počet řádků matice, pak touto novou hodnotou musíme přepsat stávající počet řádků matice uložený v datové složce třídy s názvem pocetRadku. S tím také souvisí vytvoření nové instance pole s novým rozměrem (v podstatě staré pole je odstraněno tak, že je vytvořeno nové pole a datová složka pole nyní odkazuje na toto nové pole. Nová matice obsahuje samé 0, což je předefinovaná hodnota pro datový typ int). Pro zobrazení hodnot nové matice použijeme dvě metody. První metoda ZobrazitPoleJakoText zobrazí prvky nové matice (které budou odděleny čárkou) v objektu TextBox umístěného na formuláři. Další volání metody ZobrazitPoleVListView zobrazí prvky jednotlivé řádky matice v objektu LstMatice typu ListView. Parametrem je samotná matice. Obě metody si budeme deklarovat později v kapitole Zobrazení pole.
/// <summary> /// Validace počtu řádků matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtPocetRadku_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 'novaHodnota' - nový počet řádků matice int novaHodnota; /* Přiřazení počtu řádků z objektu na formuláři do lokální proměnné * určující počet řádků matice */ int.TryParse(this.TxtPocetRadku.Text, out novaHodnota); /* Pokud počet řádků je větší než maximální počet řádků matice, nebo počet * řádků matice je menší než 1, pak... */ if ((novaHodnota > Max) || (novaHodnota < 1)) { // Zobrazení dialogového okna s textem a hodnotou max. počtu řádků matice MessageBox.Show(String.Format("Chyba rozměru matice, nastavení na max. počet řádků: {0}", Max)); /* Přiřazení maximálního rozměru matice do lokální proměnné určující * počet řádků matice */ novaHodnota = Max; // Přiřazení maximálního počtu řádků matice do objektu na formuláři this.TxtPocetRadku.Text = Max.ToString(); } // Pokud nový počet řádků matice není stejný jako stávající počet řádků matice, pak... if (novaHodnota != this.pocetRadku) { // Uložení nového počtu řádků matice do datové složky třídy this.pocetRadku = novaHodnota; // Vytvoření nové instance matice s novým počtem řádků this.pole = new int[this.pocetRadku, this.pocetSloupcu]; // Zavolání metody pro zobrazení matice do objektu TextBox na formuláři this.ZobrazitPoleJakoText(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice do objektu ListView na formuláři this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole); }
Kód 2: Deklarace metody při opuštění objektu pro specifikaci počtu řádků matice (TxtPocetRadku_LostFocus)
/// <summary> /// Validace počtu sloupců matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtPocetSloupcu_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 'novaHodnota' - nový počet sloupců matice int novaHodnota; /* Přiřazení počtu sloupců z objektu na formuláři do lokální proměnné * určující počet sloupců matice */ int.TryParse(this.TxtPocetSloupcu.Text, out novaHodnota); /* Pokud počet sloupců je větší než maximální počet sloupců matice, nebo počet * řádků sloupců je menší než 1, pak... */ if ((novaHodnota > Max) || (novaHodnota < 1)) { // Zobrazení dialogového okna s textem a hodnotou max. počtu sloupců matice MessageBox.Show(String.Format("Chyba rozměru matice, nastavení na max. počet sloupců: {0}", Max)); /* Přiřazení maximálního rozměru matice do lokální proměnné určující * počet sloupců matice */ novaHodnota = Max; // Přiřazení maximálního počtu sloupců matice do objektu na formuláři this.TxtPocetSloupcu.Text = Max.ToString(); } // Pokud nový počet sloupců matice není stejný jako stávající počet sloupců matice, pak... if (novaHodnota != this.pocetSloupcu) { // Uložení nového počtu sloupců matice do datové složky třídy this.pocetSloupcu = novaHodnota; // Vytvoření nové instance matice s novým počtem sloupců this.pole = new int[this.pocetRadku, this.pocetSloupcu]; // Zavolání metody pro zobrazení matice do objektu TextBox na formuláři this.ZobrazitPoleJakoText(this.pocetRadku, this.pocetSloupcu, this.pole); // Zavolání metody pro zobrazení matice do objektu ListView na formuláři this.ZobrazitPoleVListView(this.pocetRadku, this.pocetSloupcu, this.pole); } }
Kód 3: Deklarace metody při opuštění objektu pro specifikaci počtu sloupců matice (TxtPocetSloupcu_LostFocus)
Další metodou v regionu je metoda obsluhy události opuštění objektu TxtMinHodnota pro specifikaci dolní meze intervalu přípustných hodnot prvků matice - viz Kód 4. Po provedení konverze (v případě neprovedení konverze je do dolní meze uložena předdefinovaná hodnota pro typ int, tedy 0 - využití výstupního parametru out) je dolní mez testována, zda nepřekračuje hodnotu horní meze. Pokud ano, je dolní mez nastavena na hodnotu horní meze včetně zobrazení informace pro uživatele o této chybě pomocí dialogového okna. Hodnota dolní meze je také přepsána v objektu na formuláři.
/// <summary> /// Validace dolní meze intervalu přípustných hodnot prvků matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtMinHodnota_LostFocus(object sender, RoutedEventArgs e) { /* Přiřazení dolní meze z objektu na formuláři do datové složky třídy určující * dolní mez intervalu přípustných hodnot */ int.TryParse(this.TxtMinHodnota.Text, out this.minHodnota); // Pokud nová dolní mez je větší než stávající horní mez, pak... if (this.minHodnota > this.maxHodnota) { // Zobrazení dialogového okna s chybou a nastavení dolní meze na horní mez MessageBox.Show(String.Format("Chyba hodnoty dolní meze - dolní mez nastavena na horní mez: {0}", this.maxHodnota)); // Dolní mez je nastavena na hodnotu horní meze this.minHodnota = this.maxHodnota; // Zobrazení hodnoty dolní meze na formuláři this.TxtMinHodnota.Text = minHodnota.ToString(); } }
Kód 4: Deklarace metody při opuštění objektu pro dolní mez intervalu přístupných hodnot prvků matice (TxtMinHodnota_LostFocus)
Další obdobnou metodou je metoda obsluhy události opuštění objektu TxtMaxHodnota pro specifikaci horní meze intervalu přípustných hodnot prvků matice - viz Kód 5. Princip metody je obdobný jako v předchozí metodě.
/// <summary> /// Validace horní meze intervalu přípustných hodnot prvků matice /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtMaxHodnota_LostFocus(object sender, RoutedEventArgs e) { /* Přiřazení horní meze z objektu na formuláři do datové složky třídy určující * horní mez intervalu hodnot, kterých mohou nabývat prvky v matici */ int.TryParse(this.TxtMaxHodnota.Text, out this.maxHodnota); // Pokud nová horní mez je menší než stávající dolní mez, pak... if (this.maxHodnota < this.minHodnota) { // Zobrazení dialogového okna s chybou a nastavení horní meze na dolní mez MessageBox.Show(String.Format("Chyba hodnoty horní meze - horní mez nastavena na dolní mez: {0}", this.minHodnota)); // Horní mez je nastavena na hodnotu dolní meze this.maxHodnota = this.minHodnota; // Zobrazení hodnoty horní meze na formuláři this.TxtMaxHodnota.Text = maxHodnota.ToString(); } }
Kód 5: Deklarace metody při opuštění objektu pro horní mez intervalu přístupných hodnot prvků matice (TxtMaxHodnota_LostFocus)
Další metodou v regionu je metoda obsluhy události opuštění objektu TxtPrvekIndexRadku pro specifikaci indexu řádku u prvku při ručním plnění matice- viz Kód 6. Po provedení konverze (v případě neprovedení konverze je do indexu uložena předdefinovaná hodnota pro typ int, tedy 0 - využití výstupního parametru out) je index testován, zda nepřekračuje počet řádků matice - 1, nebo zda není menší než 0 (index počátečního prvku je 0). Pokud ano, je index nastaven na horní přípustnou mez, tj. počet řádků matice - 1 a tato hodnota je vypsána do objektu na formuláři. Zároveň je provedeno zobrazení informace pro uživatele o této chybě pomocí dialogového okna.
/// <summary> /// Validace indexu řádku prvku matice při ručním plnění /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtPrvekIndexRadku_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 'index' - index řádku prvku matice int index; // Uložení indexu řádku prvku do lokální proměnné (konverze textu na celé číslo) int.TryParse(this.TxtPrvekIndexRadku.Text, out index); /* Pokud index řádku prvku je větší než počet řádků matice - 1, nebo index řádku prvku je * menší než 0, pak... */ if ((index > this.pocetRadku - 1) || (index < 0)) { // Zobrazení dialogového okna s chybou a nastavení indexu na počet řádků matice - 1 MessageBox.Show(String.Format("Chybný index řádku prvku. Index nastaven na horní mez: {0}", this.pocetRadku - 1)); // Přiřazení horní meze indexu do objektu na formuláři určujícího index řádku prvku matice this.TxtPrvekIndexRadku.Text = String.Format("{0}", this.pocetRadku - 1); } }
Kód 6: Deklarace metody při opuštění objektu pro specifikaci indexu řádku prvku matice při ručním plnění (TxtPrvekIndexRadku_LostFocus)
Další obdobnou metodou je metoda obsluhy události opuštění objektu TxtPrvekIndexSloupce pro specifikaci indexu sloupce prvku matice při ručním plnění - viz Kód 7. Princip metody je obdobný jako v předchozí metodě.
/// <summary> /// Validace indexu sloupce prvku matice při ručním plnění /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtPrvekIndexSloupce_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 'index' - index sloupce prvku matice int index; // Uložení indexu sloupce prvku do lokální proměnné (konverze textu na celé číslo) int.TryParse(this.TxtPrvekIndexSloupce.Text, out index); /* Pokud index sloupce prvku je větší než počet sloupců matice - 1, nebo index sloupce prvku je * menší než 0, pak... */ if ((index > this.pocetSloupcu - 1) || (index < 0)) { // Zobrazení dialogového okna s chybou a nastavení indexu na počet sloupců matice - 1 MessageBox.Show(String.Format("Chybný index sloupce prvku. Index nastaven na horní mez: {0}", this.pocetSloupcu - 1)); // Přiřazení horní meze indexu do objektu na formuláři určujícího index sloupce prvku matice this.TxtPrvekIndexSloupce.Text = String.Format("{0}", this.pocetSloupcu - 1); } }
Kód 6: Deklarace metody při opuštění objektu pro specifikaci indexu sloupce prvku matice při ručním plnění (TxtPrvekIndexSloupce_LostFocus)
Poslední metodou v regionu je metoda obsluhy události opuštění objektu TxtHodnota pro specifikaci hodnoty prvku na určené pozici (index řádku a sloupce) při ručním plnění matice- viz Kód 7. Po provedení konverze je hodnota prvku testována, zda nepřekračuje horní mez intervalu přípustných hodnot prvků, nebo zda není menší než dolní mez intervalu přípustných hodnot prvků matice. Pokud ano, je zadaná hodnota prvku v objektu na formuláři vymazána pomocí metody Clear objektu TxtHodnota. Zároveň uživateli v dialogovém okně zobrazena tato chyba, včetně výpisu dolní a horní meze intervalu přípustných hodnot prvků matice.
/// <summary> /// Validace hodnoty prvku matice při ručním plnění /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TxtHodnota_LostFocus(object sender, RoutedEventArgs e) { // Lokální proměnná: 't' - hodnota prvku int t; // Uložení hodnoty prvku do lokální proměnné (konverze textu na celé číslo) int.TryParse(this.TxtHodnota.Text, out t); /* Pokud hodnota prvku je větší než horní mez, nebo hodnota prvku je * menší než dolní mez intervalu hodnot v matici, pak... */ if ((t > this.maxHodnota) || (t < this.minHodnota)) { // Zobrazení dialogového okna s textem chyby a hodnotami mezí MessageBox.Show(String.Format("Hodnota prvku není v intervalu: {0} až {1}", this.minHodnota, this.maxHodnota)); // Vymázání obsahu objektu na formuláři s hodnotou prvku this.TxtHodnota.Clear(); } }
Kód 7: Deklarace metody při opuštění objektu pro specifikaci hodnoty prvku při ručním plnění prvku matice (TxtHodnota_LostFocus)