Лабораториска вежба 5 - finki-mk/VP GitHub Wiki

Конечен изглед на апликацијата

Конечен изглед на апликацијата

Опис на задачата

Треба да се направи Windows Forms апликација за приказ на резултати од спортски (фудбалски и кошаркарски) натпревари. При избор на натпреварот од листите, треба да се прикажат детали за истиот. За кошаркарскиот натпревар, треба да се прикажат најдобрите стрелци и бројот на поените кои ги постигнале, а за фудбалските натпревари треба да се прикажат стрелците на головите и минутата во која се постигнати. Треба да се направи и форма за додавање нови натпревари.

Деталите за натпреварите треба да бидат генерички, бидејќи за различните типови на натпревари се потребни различни податочни типови - за бројот на поени на кошаркарите е потребен int, а за минутите во кои фудбалерите постигнале гол string (пр. "45 min"). Затоа е потребно да се креира класа со генерички податочни типови.

public class Details<K,V>
{
    public K key;
    public V value;
}

Потоа треба да се направи класа која ќе содржи листа од објекти од класата Details:

public class GameDetails<K,V>
{
    public List<Details<K, V>> gameDetails;
}

Од оваа класа се изведуваат соодветните класи за фудбал и кошарка:

public class Football : GameDetails<string,string>
public class Basketball : GameDetails<int, string>

Потоа, треба да се креира генеричка класа Game<T>:

public class Game<T>
{
    public string homeTeam;
    public string visitorTeam;
    public int scoreHome;
    public int scoreVisitor;
    public T detailsHome;
    public T detailsVisitor;
    public DateTime date;
}

Оваа генеричка класа ќе прима објекти од класите Football и Basketball и преку нив ќе се прикажуваат податоците за стрелците на натпреварите. За да се додаде нов натпревар, треба да се креира нова форма. Таа треба да ги има следниве атрибути:

public Game<Football> fGame;
public Game<Basketball> bGame;
public List<Details<int,string>> detaliD;
public List<Details<int, string>> detaliG; 

Форма за нов натпревар

Форма за нов натпревар

Во двете листи ќе се чуваат деталите додадени од уште една помошна форма за додавање стрелци и минути/поени, кои и ако се фудбалски ќе се запишуваат со key вредност int (потоа ќе се креираат string вредности), а во зависност од типот на натпреварот, ќе биде инстанцирана и пополнeта со податоци една од класите од типот Game.

Форма за стрелецот на голот

Форма за стрелецот на голот

При клик на копчето за додавање натпревар, најпрво ќе треба да стандардно да се провери дали има празни вредности, а потоа да се сетираат вредностите на соодветните атрибути од класата Game<Football> или Game<Basketball> во зависност од тоа кој тип е избран. Дополнително ако се избере фудбалски натпревар, ќе треба да се креираат нови стринг вредности:

Football detailsVisitor = new Football();
for (int j = 0; j < detaliG.Count; j++)
{
    Details<int, string> detali = detaliG[j];
    Details<string, string> dt = new Details<string, string>();
    dt.key = detali.key + " min";
    dt.value = detali.value;
    detailsVisitor.gameDetails.Add(dt);
}
fGame.detailsVisitor = detailsVisitor;

Истото ќе треба да се направи и за detailsVisitor. За date да се зема моменталното време:

fGame.date = DateTime.Now;

Ако се избере кошаркарски натпревар, ќе треба само да се ископираат двете листи:

Basketball detailsVisitor = new Basketball();
for (int j = 0; j < detaliG.Count; j++)
{
    detailsVisitor.gameDetails.Add(detaliG[j]);
}
bGame.detailsVisitor = detailsVisitor;

Откако ќе се креира натпреварот, во главната форма треба да се провери кој тип на натпревар бил креиран и да се додаде во соодветниот ListBox:

if (d.ShowDialog() == DialogResult.OK)
{
    if (d.type == "fudbal")
    {
        lstFudbal.Items.Add(d.fGame);
    }
    else
    {
        lstKosharka.Items.Add(d.bGame);
    }
}

При промена на селекцијата на елемент од листите, треба да се променат и соодветните детали за натпреварот. Најпрво треба да се избришат постоечките елементи во листите на стрелци за да не останат и тие од претходната селекција:

lstStrelciHome.Items.Clear();
lstStrelciAway.Items.Clear();

Потоа треба да се земе селектираниот елемент:

Game<Football> game = (Game<Football>)lstFudbal.SelectedItem;

или

Game<Basketball> game = (Game<Basketball>)lstKosharka.SelectedItem;

и потоа ќе треба да се пополнат вредностите од овој елемент во соодветните TextBox елементи и листите со стрелци. Листите со стрелци може да се пополнат на следниов начин:

List<Details<int,string>> strelciDoma = game.detailsHome.gameDetails;
for (int i = 0; i < strelciDoma.Count; i++)
{
    lstStrelciHome.Items.Add(strelciDoma[i]);
}

Забелешка: Секаде каде што се користат List<> елементи, истите треба да се инстанцираат во конструкторите, како на пример:

detaliD = new List<Details<int, string>>();

Исто така, во сите креирани класи ќе треба да се преоптоварат ToString() методите за да се прикажуваат податоците во саканиот формат.

⚠️ **GitHub.com Fallback** ⚠️