Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание события для своего компонента, WindowsForms, CLR 
V
    Опции темы
maxfox
Дата 29.11.2010, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



 Приветствую!
Есть ли у кого простой пример, как создать своё событие для создаваемого компонента?
В MDSN есть простой пример создания своего компонента ( http://msdn.microsoft.com/ru-ru/library/ms235628.aspx ), но там указано только добавление свойства.
Начал копать сам, и нашёл несколько источников, в которых всё сводится к одному:
Код

public ref class myEventArgs : EventArgs{....}    // - создать класс для собстенных аргументов

public ref class textAndBarControl : public System::Windows::Forms::UserControl
    {
    public:
        int ReturnVal;
        event EventHandler<myEventArgs^>^ RaiseCustomEvent;    // - объявить событие

protected:
        void OnRaiseCustomEvent(myEventArgs^ e)     // - вот это мне не понятно, да ещё и не работает.
        {
            if(RaiseCustomEvent!=null)
            {
                RaiseCustomEvent(this, e);

            }
                 }


если говорить о практике, то хочется понять, как например, сделать событие компонента, которое бы вызывалось при срабатывании какого либо из событий "внутреннего" контрола textBox, который расположен на этом компоненте.

Это сообщение отредактировал(а) maxfox - 29.11.2010, 19:04
PM MAIL   Вверх
jonie
Дата 29.11.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



Цитата

Код

        void OnRaiseCustomEvent(myEventArgs^ e)     // - вот это мне не понятно, да ещё и не работает.


ну этот метод вы как раз будете вызывать чтобы сделать:
Цитата

как например, сделать событие компонента, которое бы вызывалось при срабатывании какого либо из событий "внутреннего" контрола textBox, который расположен на этом компоненте.


Т.е. 1) вы подписываетесь на событие внутреннего TextBox 2)по его наступлении в обработчике вызываете метод, указанный выше... который в свою очередь (если есть подписчики) вызывает их.


насчет "не работает" не подскажу, ибо c++\CLR это какой-то "нехороший" c++ ...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
maxfox
Дата 30.11.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



да, я понял, что OnRaiseCustomEvent - это по сути должен быть обработчик события, но я не понимаю - как он связан с RaiseCustomEvent?? где эта связь прописывается??
Когда я вытаскиваю этот компонент на новую форму, то среди событий появляется событие с именем: RaiseCustomEvent. А функция  OnRaiseCustomEvent - это же по сути обычный метод в классе. и почему он должен срабатывать при вызове события RaiseCustomEvent - мне не понятно....((((
PM MAIL   Вверх
jonie
Дата 30.11.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



Цитата

А функция  OnRaiseCustomEvent - это же по сути обычный метод в классе. и почему он должен срабатывать при вызове события RaiseCustomEvent - мне не понятно....(((( 
потому что вы должны так спрограммировать. Нечто вроде:
Код

class myTextBox{
 TextBox inner = new TextBox();

 public myTextBox()
 { 
   inner.OnTextChanged += OnTextChanged;
 }
 
 private void OnTextChanged(sender, EventArgs) {
   OnRaiseCustomEvent (); //вызываем нашу функцию, чтобы та вызвала делегат, если к нему есть подписчики.
  }
}



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
maxfox
Дата 30.11.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



с этим я полностью согласен, и так и пытаюсь сделать.
но вопрос в самом методе OnRaiseCustomEvent
Код

/*1*/        void OnRaiseCustomEvent(myEventArgs^ e)     
/*2*/        {
/*3*/            if( RaiseCustomEvent != nullptr )       // - вот это мне не понятно - не работает.
/*4*/            {
/*5*/                RaiseCustomEvent(this, e);
/*6*/            }
/*7*/       }

- компилятор ругается на строку 3. Говорит, что для сравнения ( != ), RaiseCustomEvent  должен быть данными-членом

Это сообщение отредактировал(а) maxfox - 30.11.2010, 15:39
PM MAIL   Вверх
maxfox
Дата 30.11.2010, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 29.7.2009

Репутация: нет
Всего: нет



оу! пардон. я убрал это условие вообще - и всё заработало!! Возможно, это не совсем корректно, и нужно будет добавить обработку сообщения  об ошибках не предмет пустого элемента...но главное, что работает!!! спс за внимание!
да - и забыл сказать, что добавил делегата для события:
Код

в теле формы:
public:
    delegate void aEventHandler( Object^ sender, EventArgs^ e );    
    event aEventHandler^ MyCustomEvent;    
protected:
        void OnMyCustomEvent( Object^ sender, EventArgs^ e )
        {
                MyCustomEvent(this, e);
        }

ну и - событие срабатывает, когда пишу что то в textbox на этом компоненте..
void InitializeComponent(void)
{
...
this->textBox1->TextChanged += gcnew System::EventHandler(this, &textAndBarControl::textBox1_TextChanged);
...
}

private: System::Void textBox1_TextChanged(System::Object^  sender, System::EventArgs^  e) {
                 //
                 OnMyCustomEvent(sender, e);

             }


Это сообщение отредактировал(а) maxfox - 30.11.2010, 16:13
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0459 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.