Форум программистов, компьютерный форум CyberForum.ru

Реализация событий в С++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Нужен учебник по стандартным функциям/классам http://www.cyberforum.ru/cpp/thread184511.html
Нужен учебник по стандартным функциям/классам C и C++, Борланд С++ буилдер, etc на русском. Во-первых не дублируйте темы. Во-вторых разберитесь как-нибудь с транслитом. И кстати почитайте правила форума, в частности пункт 3.10
C++ Ввод зарезервированных символов ASCII Здраствуйте! Есть консольная программа(си++,ос хр)... как в консоли ввести "крякодзябы"? мне нужно ввести в консоль символы которые за таблицей ascii кодов имеют коды(dec): 181,192,202...ето символы для графики...зарезервированые... (!) мне нада ето ввести в консоли.. как нажать ети символы? я тут уже полчаса жму на клаве комбинации клавиш и никак не могу...... http://www.cyberforum.ru/cpp/thread184481.html
MPI, нахождение простых чисел C++
Здравсвуйте! Пишу программу для нахождения простых чисел. Пишу в Visual Studio 2008 на C++. Программу написал и она работает на нескольких ПК. Но проблема в том, что результаты в главный процесс возвращаются неправильно. Допустим запускаем: компьютер с главным процессом: 5 процессов компьютер раб: 5 процессов. В результате в главный файл запишутся результаты от первых 5 и только от...
C++ Как написать плагин для notepad++?
как написать плагин для notepad++? есть какой-нибудь мануал?
C++ Распознать символы с картинки (капчи) http://www.cyberforum.ru/cpp/thread183287.html
здравствуйте! вопрос такой: имеется заранее известная картинка. картинка четкая (это НЕ капча). на картинке в известных местах находятся 5 цифр. делается скриншот. необходимо по нему узнать эти 5 чисел. в какую сторону копать? есть идеи/примеры?
C++ Книга для начинающего Посоветуйте книгу для первокурсника по c++. препод посоветовал гебрерда шилдта "C++. Базовый курс". но сейчас не могу найти ее в продаже а срочно надо. посоветуйте альтернативу. http://oz.by/books/topic10111.html - вот из этих. заранее спасибо подробнее

Показать сообщение отдельно
sofen
0 / 0 / 0
Регистрация: 31.10.2010
Сообщений: 45
02.11.2010, 14:51  [ТС]     Реализация событий в С++
void print_x () const { std::cout << x << std::endl; }
если убираю const, то не работает )

а мне надо вызывать ещё и виртуальную функцию)

полиморфизм и статические функции не катят)
буст тоже не подходит... Так как я пишу свою библиотеку, то завязывание на чужие либы (будь то буст или другая) никак не приемлемо... Я всем представляю либу, которая будет весить едва ли метр, но для её работы необходимо скачать несколько различных других библиотек на десятки или сотни килобайтов)))

К сожалению, админ удалил ссылку на мой блог ))) скидываю с него текст...


Реализация событий в С++

Опять столкнулся с проблемой, что в стандартном С++ нет указателя на функции, являющиеся членами класса (хотя есть указатель на обычную функцию). Для чего они могут понадобиться? На них можно было бы реализовать события, например, событие нажатия кнопки.

Пришлось пойти громоздким, но более-менее понятным путём. Для начала описываем класс события.

C++
1
2
3
4
5
6
7
8
9
10
11
template  class Event
{
public:
    Object *owner;
    T event;
    void set(Object *owner, T event)
    {
        this->owner = owner;
        this->event = event;
    }
};
Теперь опишем, тип “указатель на функцию”.

C++
1
typedef void (*ClickFunc)(Object *owner, Object *sender);
Затем, опишем тип «событие нажатия».

C++
1
typedef Event ClickEvent;
Ну пусть будет так… Как же теперь этим пользоваться?

Описываем классе кнопке Button событие onClick.

C++
1
2
3
4
class Button : Control {
public:
    ClickEvent onClick;
};
Во классе форме Form, где будет располагаться кнопка, описываем статическую функцию и обычную нормальную функцию, которую необходимо вызвать по событию.

C++
1
2
3
4
5
6
7
8
9
10
11
12
class Form {
public:
    static void stMyClick(Object *owner, Object *sender);
    virtual void myClick(Object *sender);
};
void Form::stMyClick(Object *owner, Object *sender) {
    ((CMy2*)owner)->myClick(Sender);
    
}
void Form::myClick(Object *sender) {
    //Код, выполняющийся по событию
}
Далее, в реализации какой-либо функции (или, например, в конструкторе) класса Form пишем следующее:

C++
1
2
Button *btn = new Button();
btn->onClick.set(this, stMyClick);
А уже в менеджере, который будет обрабатывать события, пишем следующее:

C++
1
if  (control->OnClick.event != NULL) control->OnClick.event(owner, sender);
Мдааа... Жесть...
 
Текущее время: 05:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru