Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2011, 13:13   #1
dezmond06
Новичок
Джуниор
 
Регистрация: 20.12.2010
Сообщений: 1
По умолчанию Событие на массив объектов.

Есть учебная работа по С#. Задание такое - есть массив объектов Студент с полями Стипендия, факультет и т.д., в общем стандартная мура.
Задача проги, чтобы при нажатии кнопок PgUp, PgDn и Esc. стипендия студента увелич. на 20%, уменьшалась на 20% и программа закрывалась соответственно. Реализовать надо событиями и делегатами.
В общем что-то оно пытается работать, но вяленько. Принудительно вызываю событие, нажатие кнопок оно принимает, но меняет поле только у одного (первого) члена массива. Остальные на месте. Мне кажется тут что-то с областью видимости переменных, но где - не могу понять. В отладчике прогоняю, все члены инициализируются, обработчики цепляются.

Вот исх. код:
Класс, объявляющий события:

Код:
public delegate void Pushing(object sender, ChangedEventArgs chgargs);
    public delegate void LooserDeleting(ref Student[] stt);

    public class Eventing
    {
        Pushing[] ButtonChange = new Pushing[3];

        private ChangedEventArgs evargs = new ChangedEventArgs(); //класс, производный от EventArgs

        public event Pushing KeyPush
        {
            add
            {
                for (int i = 0; i < 3; i++)
                {
                    if (ButtonChange[i]==null)
                    {
                        ButtonChange[i] = value;
                        break;
                    }
                }
            }
            remove
            {
                for (int i = 0; i < 3; i++)
                {
                    if (ButtonChange[i] == value)
                    {
                        ButtonChange[i] = null;
                        break;
                    }
                }
            }
        }

        public event LooserDeleting LooDel;

        public void OnPush(ChangedEventArgs args)
        {
            ConsoleKeyInfo rk = new ConsoleKeyInfo();
            rk = Console.ReadKey(true);
            switch (rk.Key)
            {
                case ConsoleKey.PageUp: { if (ButtonChange[0] != null) ButtonChange[0](this, args); break; }
                case ConsoleKey.PageDown: { if (ButtonChange[1] != null) ButtonChange[1](this, args); break; }
                case ConsoleKey.Escape: { if (ButtonChange[2] != null) ButtonChange[2](this, args); break; }
                default:
                    break;
            }
        }
    }
Фрагмент класса-приемника с обработчиками (Студент):
Код:
 public class Student : IComparable
    {
        string fam, studfac;
        double scholarship;
        public int[] marks = new int[6];
        Eventing StudEvent;

        public Student(Eventing ev)
        {
          StudEvent = ev;
          StudEvent.KeyPush += new Pushing(PgUp);
          StudEvent.KeyPush += new Pushing(PgDn);
          StudEvent.KeyPush += new Pushing(ExitAppDel);
        }
        public void PgDn(object sender, ChangedEventArgs args)
        { this.grant *= 0.8; }

        public void PgUp(object sender, ChangedEventArgs args)
        { this.grant *= 1.2; }

        public void ExitAppDel(object sender, ChangedEventArgs args)
        { Environment.Exit(0); }
Фрагменты процедуры Main:
Код:
...
Student[] studs = new Student[sts.Length-1];
Eventing evv = new Eventing(); //событийный класс
for (int i = 0; i < sts.Length-1; i++)
            {
                studs[i] = new Student(evv); }
...
            output(facults, studs, mt); //вывод значений массива
            ChangedEventArgs argss = new ChangedEventArgs();
            int k = 1;
            while (k > 0)
            {
                evv.OnPush(argss); //в цикле принудительно вызываем событие
                                          //понимаю, что маразм, но как                  //правильно  сделать - заклинило.
                output(facults, studs, mt);
            }
Смысл такой, надо чтобы прога постоянно ждала нажатия клавиши, при нажатии увелич/уменьшала стипендию сразу выводила результаты и опять продолжала ждать.
Помогите, плиз!
dezmond06 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив объектов Freddi Krjuger Общие вопросы по Java, Java SE, Kotlin 3 18.02.2011 19:55
Массив объектов - вернуть индекс boris-blade Общие вопросы .NET 1 07.03.2010 20:00
Массив из объектов TImage (delphi) Alt Помощь студентам 4 07.02.2010 22:20
Массив объектов _bAd_ Помощь студентам 10 20.01.2010 08:33
массив объектов balamut JavaScript, Ajax 4 29.05.2009 14:49