4. C#

4.1. Nastavení atributů pole

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: 

  • TxtPocetPrvku_LostFocus
  • TxtMinHodnota_LostFocus
  • TxtMaxHodnota_LostFocus
  • TxtPrvekIndex_LostFocus
  • TxtHodnota_LostFocus

První metodou, kterou budeme muset upravit je metoda obsluhy události opuštění objektu TxtPocetPrvku pro specifikaci počtu prvků vektoru, tj. rozměru jednorozměrného pole - viz Kód 1. 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ě TxtPocetPrvku. 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.

Pro metodu deklarujeme lokální proměnnou novaHodnota, do níž budeme ukládat načtenou hodnotu z objektu na formuláři pro specifikaci počtu prvků vektoru. 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 vektoru, jehož hodnota je uložena v konstantě Max. Pokud není, přiřadíme do lokální proměnné novaHodnota maximální rozměr vektoru. Pokud uživatel provedl chybné nastavení rozměru vektoru, 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 vektoru na maximální povolený rozměr, tj. konstanta Max. Musíme zároveň vypsat tento nový rozměr do objektu pro specifikaci rozměru vektoru umístěného na formuláři. 

Pokud nový rozměr vektoru není stejný jako stávající počet prvků vektoru, pak touto novou hodnotou musíme přepsat stávající rozměr vektoru uloženého v datové složce třídy s názvem pocetPrvku. 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ý vektor obsahuje samé 0, což je předefinovaná hodnota pro datový typ int). Pro zobrazení hodnot nového vektoru použijeme dvě metody. První metoda ZobrazitPoleVListView deklarovaná v rámci třídy zobrazí prvky vektoru jako jednotlivé řádky v objektu LstVektor typu ListView. Parametrem je vektor samotný. Nový vektor také zobrazíme jako jednotlivé prvky oddělené čárkou. K tomu využijeme metodu ZobrazitPoleJakoText. Obě metody si budeme deklarovat později v kapitole Zobrazení pole.

/// <summary>
/// Validace rozměru vektoru
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtPocetPrvku_LostFocus(object sender, RoutedEventArgs e)
{
    // Lokální proměnná pro uložení nového počtu prvků vektoru
    int novaHodnota;
    /* Přiřazení počtu prvků z objektu na formuláři do lokální proměnné
     * určující počet prvků vektoru */
    int.TryParse(this.TxtPocetPrvku.Text, out novaHodnota);
    /* Pokud počet prvků je větší než maximální rozměr vektoru, nebo počet
     * prvků vektoru je menší než 1, pak... */
    if ((novaHodnota > Max) || (novaHodnota < 1))
    {
        /* Zobrazení dialogového okna s textem "Chyba velikosti vektoru" a hodnoty 
         * max. rozměru vektoru */
        MessageBox.Show(String.Format("Chyba velikosti vektoru, nastavení na max. rozměr: {0}", Max));
        /* Přiřazení maximálního rozměru vektoru do lokální proměnné určující
         * počet prvků vektoru */
        novaHodnota = Max;
        /* Přiřazení maximálního rozměru vektoru do objektu na formuláři
         * určující počet prvků vektoru */
        this.TxtPocetPrvku.Text = Max.ToString(); 
    }
 
    // Pokud nový rozměr vektoru není stejný jako stávající počet prvků vektoru, pak...
    if (novaHodnota != this.pocetPrvku)
    {
        // Uložení nového rozměru pole do datové složky třídy
        this.pocetPrvku = novaHodnota;
        // Vytvoření nové instance pole s novým rozměrem
        this.pole = new int[this.pocetPrvku];
        // Zavolání metody pro zobrazení vektoru do objektu ListView na formuláři
        this.ZobrazitPoleVListView(this.pole);
        // Zavolání metody pro zobrazení vektoru do objektu TextBox na formuláři
        this.ZobrazitPoleJakoText(novaHodnota, this.pole);
    }
}

Kód 1: Deklarace metody při opuštění objektu pro rozměr pole (TxtPocetPrvku_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ů vektoru - viz Kód 2. 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ů vektoru
/// </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 2: Deklarace metody při opuštění objektu pro dolní mez intervalu přístupných hodnot prvků vektoru (TxtMinHodnota_LostFocus)

Další podobnou metodou je metoda obsluhy události opuštění objektu TxtMaxHodnota pro specifikaci horní meze intervalu přípustných hodnot prvků vektoru - viz Kód 3. Princip metody je obdobný jako v předchozí metodě.

/// <summary>
/// Validace horní meze intervalu přípustných hodnot prvků vektoru
/// </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 ve vektoru */
    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 3: Deklarace metody při opuštění objektu pro horní mez intervalu přístupných hodnot prvků vektoru (TxtMaxHodnota_LostFocus)

Další metodou v regionu je metoda obsluhy události opuštění objektu TxtPrvekIndex pro specifikaci indexu prvku při ručním plnění vektoru - viz Kód 4. 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 prvků vektoru - 1 (index počátečního prvku je 0), nebo zda není menší než 0. Pokud ano, je index nastaven na horní přípustnou mez, tj. počet prvků - 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 prvku vektoru při ručním plnění
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtPrvekIndex_LostFocus(object sender, RoutedEventArgs e)
{
    // Lokální proměnná: index - index prvku
    int index;
    // Uložení indexu prvku do lokální proměnné (konverze textu na celé číslo)
    int.TryParse(this.TxtPrvekIndex.Text, out index);
    /* Pokud index prvku je větší než počet prvků vektoru - 1, nebo index prvku je
     * menší než 0, pak... */
    if ((index > this.pocetPrvku-1) || (index < 0))
    {
        // Zobrazení dialogového okna s chybou a nastavení indexu na rozměr vektoru - 1
        MessageBox.Show(String.Format("Chybný index prvku. Index nastaven na horní mez: {0}", this.pocetPrvku-1));
        /* Přiřazení horní meze indexu do objektu na formuláři určujícího index prvku vektoru */
        this.TxtPrvekIndex.Text = String.Format("{0}", this.pocetPrvku-1);
    }
}

Kód 4: Deklarace metody při opuštění objektu pro specifikaci indexu při ručním plnění vektoru (TxtPrvekIndex_LostFocus)

Poslední metodou v regionu je metoda obsluhy události opuštění objektu TxtHodnota pro specifikaci hodnoty prvku určeného zadaným indexem při ručním plnění vektoru - viz Kód 5. 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. 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ů vektoru. 

/// <summary>
/// Validace hodnoty prvku vektoru 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 ve vektoru, 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 5: Deklarace metody při opuštění objektu pro specifikaci hodnoty prvku při ručním plnění vektoru (TxtHodnota_LostFocus)