Re[5]: Проблема с переопределением EventArgs
От: Lloyd Россия  
Дата: 07.09.05 08:41
Оценка: 3 (1) +1
Здравствуйте, Дмитрий Осипов, Вы писали:

ДО>Просто я не совсем понимаю, где мне передать значения DateTime и Timer в саму WorkingDayEventArgs.


Кажется понял что ты имеешь в виду.

Попробуй создать свой класс для обработки события Timer.Tick. В конструкторе этого класса передавай нужные тебе данные и сохряняй их в полях этого класса. И, соответственно, подписывай на событие метод этого класса.

public class WorkingDayHandler {
  private DatetTime _dateTime;
    public WorkingDayHandler(DatetTime dateTime) {
      _dateTime = dateTime;
    }
    
    public void HandleEvent(object sender, EventArgs e) {
      // Your logic here
    }
}

...

WorkingDayHandler handler = new WorkingDayHandler(DateTime.Now);

Timer waitForWorkingDayTimer = new Timer();
waitForWorkingDayTimer.Interval = 5000;
waitForWorkingDayTimer.Tick += new EventHandler(handler.HandleEvent);
waitForWorkingDayTimer.Start();
... << RSDN@Home 1.1.4 stable rev. 510>>
Проблема с переопределением EventArgs
От: Дмитрий Осипов Россия  
Дата: 06.09.05 00:11
Оценка:
Господа коллеги ( ), у меня проблема. Мне нужен таймер, который через заданное время проверяет определенную функцию. Но дело в том, что в эту функцию мне надо передать экземпляр этого таймера, чтобы в нужный момент выключить его. Заодно я передаю и экземпляр DateTime, чтобы каждый раз в функции не создавать новый объект.
Я переопределил EventArgs:

using System;
using System.Windows.Forms;

public class WorkingDayEventArgs: System.EventArgs
    {
        public DateTime dtnow;
        public Timer waitForWorkingDayTimer;

        public WorkingDayEventArgs(DateTime dtnow, Timer waitForWorkingDayTimer)
        {
            this.dtnow = dtnow;
            this.waitForWorkingDayTimer = waitForWorkingDayTimer;
        }
    }


Добавил класс с делегатом:

using System;
using System.Windows.Forms;

    public class WorkingDayEvent
    {
        public delegate void WorkingDayEventHandler(Object obj, WorkingDayEventArgs ea);
        //вот тут вот меня большие сомнения терзают
        public event EventHandler DayEvent;

        public void WaitForWorkingDay(DateTime dtnow, Timer waitForWorkingDayTimer)
        {
            WorkingDayEventArgs workingDayArgs = new WorkingDayEventArgs(dtnow, waitForWorkingDayTimer);
            DayEvent(this, workingDayArgs);
        }
    }


Структура программы получилась такова (в общих чертах):

...
бла-бла-бла, много кода
...

private void buttonStart_OnClick(object sender, System.EventArgs e)
        {
            WorkingDayEvent dayEvent = new WorkingDayEvent();
            dayEvent.WaitForWorkingDay(dtnow, waitForWorkingDayTimer);

            Timer waitForWorkingDayTimer = new Timer();
            waitForWorkingDayTimer.Interval = 5000;
            waitForWorkingDayTimer.Tick += new WorkingDayEvent.WorkingDayEventHandler(WaitForWorkingDayTest);
            waitForWorkingDayTimer.Start();
        }

//функция, которую мне надо вызывать через таймер каждые 5 сек.
private void WaitForWorkingDayTest(object obj, WorkingDayEventArgs ea)
        {
            ea.dtnow = DateTime.Now;
            if(ea.dtnow.Hour > (AutoHitKernel.iWorkingDayEndHours - 1) || ea.dtnow.Hour < (AutoHitKernel.iWorkingDayBeginHours + 1))
            {
            }
            else
            {
                WorkingDay();
                //а для этого я как раз и тащу экземпляр таймера.
                ea.waitForWorkingDayTimer.Stop();
            }
        }

...
бла-бла-бла, много кода
...


Но при попытке откомпилить получаю облом:

waitForWorkingDayTimer.Tick += new WorkingDayEvent.WorkingDayEventHandler(WaitForWorkingDayTest);
// MainForm.cs(340): Cannot implicitly convert type 'AutoHitNamespace.WorkingDayEvent.WorkingDayEventHandler' to 'System.EventHandler'


Я подозреваю, что как-то не так переопределил стандартный делегат EventHandler. Как сделать это правильно?
Hello World!
------------------------------
17 Error(s) 37 Warning(s)
Re: Проблема с переопределением EventArgs
От: S_Ivanov Россия  
Дата: 06.09.05 04:49
Оценка:
Здравствуйте, Дмитрий Осипов, Вы писали:

ДО> //вот тут вот меня большие сомнения терзают

ДО> public event EventHandler DayEvent;

ИМХО, правильно терзают сомнения. Надо бы:

public event WorkingDayEventHandler DayEvent;
Re[2]: Проблема с переопределением EventArgs
От: Дмитрий Осипов Россия  
Дата: 06.09.05 10:21
Оценка:
Здравствуйте, S_Ivanov, Вы писали:

S_I>ИМХО, правильно терзают сомнения. Надо бы:


S_I>
S_I>public event WorkingDayEventHandler DayEvent;
S_I>


Да я уж по всякому пробовал, и так в том числе — не помогает.
Hello World!
------------------------------
17 Error(s) 37 Warning(s)
Re: Проблема с переопределением EventArgs
От: Lloyd Россия  
Дата: 06.09.05 11:26
Оценка:
Здравствуйте, Дмитрий Осипов, Вы писали:

ДО>Господа коллеги ( ), у меня проблема. Мне нужен таймер, который через заданное время проверяет определенную функцию. Но дело в том, что в эту функцию мне надо передать экземпляр этого таймера, чтобы в нужный момент выключить его. Заодно я передаю и экземпляр DateTime, чтобы каждый раз в функции не создавать новый объект.

ДО>Я переопределил EventArgs:

ДО>Я подозреваю, что как-то не так переопределил стандартный делегат EventHandler. Как сделать это правильно?


Не надо создавать свой делегат. Испольуй EventHandler. А в метод передавай WorkingDayEventArgs.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Проблема с переопределением EventArgs
От: snk Узбекистан  
Дата: 06.09.05 11:31
Оценка:
Здравствуйте, Дмитрий Осипов, Вы писали:

ДО>Здравствуйте, S_Ivanov, Вы писали:


S_I>>ИМХО, правильно терзают сомнения. Надо бы:


S_I>>
S_I>>public event WorkingDayEventHandler DayEvent;
S_I>>


ДО>Да я уж по всякому пробовал, и так в том числе — не помогает.


там должен быть обязательно EventHandler, Вы все таки подписываетесь на Tick, тип которого EventHandler
а в вашем хендлере уже должен быть код просто вызывающий ваш метод и передающий ему this и DateTime.Now
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Проблема с переопределением EventArgs
От: Дмитрий Осипов Россия  
Дата: 06.09.05 17:44
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Не надо создавать свой делегат. Испольуй EventHandler. А в метод передавай WorkingDayEventArgs.

А как я буду передавать в него WorkingDayEventArgs, если стандартный делегат просит System.EventArgs? При попытке откомпилить возникает ошибка (что, в общем, логично):
MainForm.cs(342): Method 'MainForm.WaitForWorkingDayTest(object, WorkingDayEventArgs)' does not match delegate 'void System.EventHandler(object, System.EventArgs)'
Hello World!
------------------------------
17 Error(s) 37 Warning(s)
Re[3]: Проблема с переопределением EventArgs
От: Lloyd Россия  
Дата: 06.09.05 17:54
Оценка:
Здравствуйте, Дмитрий Осипов, Вы писали:

ДО>А как я буду передавать в него WorkingDayEventArgs, если стандартный делегат просит System.EventArgs? При попытке откомпилить возникает ошибка (что, в общем, логично):


private void WaitForWorkingDayTest(object obj, EventArgs ea) {
    WorkingDayEventArgs wdea = (WorkingDayEventArgs)ea;
        // Далее работаешь с wdea
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: Проблема с переопределением EventArgs
От: Дмитрий Осипов Россия  
Дата: 06.09.05 19:06
Оценка:
Теперь на этой строке в процессе выполнения обнаруживается ошибка "Specified cast is not valid".
private void WaitForWorkingDayTest(object obj, EventArgs ea)
{
    WorkingDayEventArgs wdea = (WorkingDayEventArgs)ea; // "Specified cast is not valid"
}


Я вообще-то правильно делаю так:
private void buttonStart_OnClick(object sender, System.EventArgs e)
        {
            WorkingDayEvent dayEvent = new WorkingDayEvent();
            dayEvent.WaitForWorkingDay(dtnow, waitForWorkingDayTimer);

            Timer waitForWorkingDayTimer = new Timer();
            waitForWorkingDayTimer.Interval = 5000;
            waitForWorkingDayTimer.Tick += new WorkingDayEvent.WorkingDayEventHandler(WaitForWorkingDayTest);
            waitForWorkingDayTimer.Start();
        }

и так:
public class WorkingDayEvent
    {
        public event EventHandler DayEvent;

        public void WaitForWorkingDay(DateTime dtnow, Timer waitForWorkingDayTimer)
        {
            WorkingDayEventArgs workingDayArgs = new WorkingDayEventArgs(dtnow, waitForWorkingDayTimer);
            DayEvent(this, workingDayArgs);
        }
    }

?
Просто я не совсем понимаю, где мне передать значения DateTime и Timer в саму WorkingDayEventArgs.
Hello World!
------------------------------
17 Error(s) 37 Warning(s)
Re: Проблема с переопределением EventArgs
От: Andrbig  
Дата: 07.09.05 09:08
Оценка:
Здравствуйте, Дмитрий Осипов, Вы писали:

ДО>в эту функцию мне надо передать экземпляр этого таймера, .


public event EventHandler Tick;
public delegate void EventHandler(object sender, EventArgs e);

А sender — это случайно не Timer, пославший сообщение?

ДО>Заодно я передаю и экземпляр DateTime, чтобы каждый раз в функции не создавать новый объект.


Про DateTime не понял.
Re[6]: Спасибо!
От: Дмитрий Осипов Россия  
Дата: 07.09.05 12:54
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Кажется понял что ты имеешь в виду.


Спасибо что уделили мне время и помогли разобраться в этой ерунде. Я начал делать приблизительно так, но потом под влиянием мсдна запутался и начал воротить всякие ужасы.
Hello World!
------------------------------
17 Error(s) 37 Warning(s)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.