Эквивалентный код в управляемом C ++ & C # (события в VB6) - PullRequest
1 голос
/ 28 августа 2009

В VB6 события, созданные в компоненте ActiveX, были сформулированы так:

Public Event ProcessingComplete ()

и вызывается в этом компоненте ActiveX, как:

RaiseEvent ProcessingComplete

Я создаю управляемую C ++ DLL, с которой хочу сделать то же самое. Не похоже, что делегаты - это именно то, чего я хочу. Я думаю, что более подходящим пунктом является объявление __event. Помощь?!?

В конце концов, у меня есть приложение на C #, для которого я хочу иметь такую ​​функцию:

MyObject :: ProcessingComplete () <--- Это вызванная функция, когда происходит "RaiseEvent". {</p>

}

Спасибо.

Ответы [ 3 ]

1 голос
/ 28 августа 2009

Звучит так, будто вы хотите событие. В .NET событие - это просто делегат, который по соглашению имеет специальную подпись. Вот пример C # объявления события в классе:

public class MyObject
{
    // ...

    public event EventHandler ProcessingComplete;

    // ...
}

EventHandler - это делегат с двумя параметрами:

public delegate EventHandler(object sender, EventArgs e);

Отправитель - это объект, вызвавший событие, а EventArgs кодируют любую информацию, которую вы хотите передать подписчику события.

Ожидается, что каждое событие будет следовать этой конвенции. Если вы хотите передать специализированную информацию для вашего события, вы можете создать свой собственный класс, полученный из EventArgs. .NET для этой цели определяет типизированный делегат EventHandler EventHandler<TEventArgs>. Пример C #:

class ProcessingCompleteEventArgs : EventArgs
{
    public ProcessingCompleteEventArgs(int itemsProcessed)
    {
        this.ItemsProcessed = itemsProcessed;
    }

    public int ItemsProcessed
    {
        get;
        private set;
    }
}

// ...

// event declaration would look like this:
public event EventHandler<ProcessingCompleteEventArgs> ProcessingComplete;

Чтобы подписаться на событие, используйте оператор +=. Чтобы отписаться, используйте оператор -=.

void Start()
{
    this.o = new MyObject();
    this.o.ProcessingComplete += new EventHandler(this.OnProcessingComplete);

    // ...
}

void Stop()
{
    this.o.ProcessingComplete -= new EventHandler(this.OnProcessingComplete);
}

void OnProcessingComplete(object sender, EventArgs e)
{
    // ...
}

Внутри вашего класса, чтобы вызвать событие, вы можете использовать обычный синтаксис для вызова делегата:

void Process()
{
    // ...

    // processing is done, get ready to fire the event
    EventHandler processingComplete = this.ProcessingComplete;

    // an event with no subscribers is null, so always check!
    if (processingComplete != null)
    {
        processingComplete(this, EventArgs.Empty);
    }
}
0 голосов
/ 28 августа 2009

Полагаю, делегаты - путь.

public delegate void ProcessCompleteEventHandler(object sender, EventArgs e);

Определите вышесказанное где-то за пределами вашего класса. Внутри вашего класса

class MySampleClass{
    public event ProcessCompleteEventHandler ProcessComplete;

    void SomeWork()
    {
        //Do some work, and when its over...
        ProcessComplete.Invoke(this, null);
    }

}

Внутри вашей основной программы:

MySampleClass obj = new MySampleClass();
obj.ProcessComplete += new ProcessCompleteEventHandler(my_handler);

my_handler должен иметь такую ​​же подпись ...

0 голосов
/ 28 августа 2009

События и делегаты.

Мероприятия и делегаты

РЕЗЮМЕ: Делегат - это класс, который может содержать ссылку на метод. В отличие от других классов, класс делегата имеет подпись, и она может содержать ссылки только на методы, которые соответствуют его подпись.

События в управляемом C ++: проблема с событиями, WindowEvents

Управляемые расширения: использование делегатов и событий

РЕЗЮМЕ: .NET программирование включает в себя Концепция делегатов и событий в содействовать наблюдателю или Опубликовать / подписать шаблон дизайна. Наиболее раз, вы используете события практически так же, способ, которым имеют функции обратного вызова годами использовался в стандартном Win32 API или MFC программирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...