Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Нотификаторы в MS VS.  (Прочитано 19023 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zubr
Гость
« : 10-09-2009 09:43 » 

Вопрос в следующем. Есть ли возможность у самой IDE VS определять события (действия пользователя) в DesignTime. К примеру, в Delphi есть классы-нотификаторы, позволяющие отследить момент загрузки проекта, сохранения файла, событие перед компиляцией, после компиляции и т. п. Это зачастую нужно при работе с компонентами в DesignTime. Так вот есть ли такая возможность в VS?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 10-09-2009 10:47 » 

Да для .NET. В собственных UserControl'ах с помощью подмножества атрибутов можно определять свойства, используемые дизайнером форм, и не используемые в runtime. А при обращении к этим свойствам выполнять нужные действия.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 10-09-2009 11:14 » 

Эммм насчёт загрузки-сохранения не знаю, а вот Pre-Build, Pre-Link и Post-Build Event-ы есть.
В свойствах проекта Build Events (2003, 2005 и 2008) в шохе не помню. Ща под рукой нет.

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


« Последнее редактирование: 10-09-2009 11:15 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #3 : 12-09-2009 08:30 » 

Спасибо.
Теперь такой вопрос, есть ли возможность в MFC получать информацию о типах времени исполнения (RTTI). Метод CObject::IsKindOf меня не устраивает. Мне надо определять по адресу функции имя функции и наоборот по имени функции вызывать метод класса производного от MFC-класса.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 12-09-2009 10:30 » 

По адресу имя ф-ции... Хм... Вобще-то имя ф-ции и является адресом (указателем на ф-цю). Во всяком случае такого точно нет:

CString stFunName = GetFuntionName((DWORD)pPtr);

Можно попоробовать прогуляться по таблице ф-ций, но если это классные ф-ции то...

А что за задачи стоят с такими требованиями?

2. Вот это совсем не понял:
"по имени функции вызывать метод класса производного от MFC-класса."

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

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #5 : 12-09-2009 14:15 » 

Цитата
2. Вот это совсем не понял:
"по имени функции вызывать метод класса производного от MFC-класса."
Скорее всего это будет класс производный от CWnd
Мне надо будет вызывать пользовательские функции, подключаемые к переменным-членам класса, зная их наименование в виде строки.
Подробнее: Я недавно под заказ писал ряд Delphi-компонентов, представляющие flash-скины. То есть это комбинация exe-приложения с располагающимися на окне(ах) приложения флешками (swf) через флеш-плеер. Представление и пользовательский ввод располагается в флешевой части, а обработка и данные в exe. Обмен информацией (события пользовательского ввода, вывод обработанных данных) осуществляется функциями флеш-плеера (теми же которые предназначены для обмена со скриптами). Поэтому при пользовательском вводе (к примеру щелчок на кнопке) через флеш-плеер передается строка с названием функции-обработчика. В Delphi RTTI позволяет получать адрес метода по его наименованию. Сейчас заказчик просит перевести проект в VC++.
Судя по всему придется городить свой функционал, позволяющий сопоставлять строку имени функции с ее адресом.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 12-09-2009 14:41 » 

мне кажется, предусмотреть надо в классе приём строки (отвести под это некое сообщение)
Передавать в сроке имя функции и параметры в строковом виде (если это возможно)
Записан

zubr
Гость
« Ответ #7 : 12-09-2009 15:05 » 

Думаю надо будет создать в своем классе метод void AddActionHandler(HandlerFunc handler, CString nameFunc, TypeHandler type);
где handler - указатель на пользовательский обработчик, nameFunc - имя функции, TypeHandler - тип обрабатываемого сообщения (OnLButtonDown, OnKeyDown и т. д.).
В теле метода загонять данные по функции (адрес, имя) в массив структур. Ну а при получении строки от флеш-плеера по имени функции искать в массиве соответствующий адрес обработчика.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 12-09-2009 15:16 » 

а не проще сразу отправлять объекту-окну (я же правильно понял, что будет дитё от CWnd ?)  нужное сообщение

Код:
SendMessage(h,...,...);
или
PostMessage(h,...,...);
Записан

zubr
Гость
« Ответ #9 : 12-09-2009 15:32 » 

Алексей1153++, представь флешку у которой несколько кнопок, окошек ввода, таблиц, тривью и т. д. Каждый элемент умеет реагировать на действия пользователя (клик мыши, ввод с клавиатуры, изменения текста и т. д.). Идеология такова, что под нужное действие во флеше, в коде приложения (его exe-части) должен создаваться обработчик. Согласен можно передавать окну SendMessage с пользовательскими сообщениями, но чем это проще? Для этого надо будет создавать пользовательские сообщения и все равно создавать массив (таблицу) соответствий номера сообщения строке, которая возвращается от флешки.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 12-09-2009 15:33 » 

Аааа вот для чего. Нуу тут нет смысла городить такую сложность. Я бы с адресами не заморачивался.
Тут на вскидку прходят как минимум три простых варианта решения.

1. Можно сделать простую ф-цию, которая будет вызывать нужную ф-цю и передавать ей имя этой ф-ции и параметры. Этот метод хорош ещё и тем, что позволяет "чисто" проверить соответствие параметров, иначе любое изменение структуры с любой стороны приведут к крэшу. А городить ничего не надо, всё очень просто. типа такого:

Код:
BOOL CMyWnd::ExecuteMethod(CString stMethodName, int nParamCount, ...)
{
         // выбор метода и проверка соответствия параметров
}

2. Ещё проще ИМХО это можно (нужно) было бы сделать через сообщения, тем более что классы типа CWnd, таким образом позволяя классу самому решать, что делать в той или иной ситуации. И такая вещь будет портироваться на любые среды. Это конечно потребует немного другой организации логики со стороны флэшной части, но если проект живой, то в будущем это с лихвой окупится.

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

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 12-09-2009 15:36 » 

Пока сочинял, ещё ответ пришёл.

Согласен можно передавать окну SendMessage с пользовательскими сообщениями, но чем это проще?

Проще тем, что в этом случае ты можешь писать и изменять класс как тебе захочется. Обработчик находится внутри класса.

зы С уточнёнными данными, ИМХО интерфейс именно то, что тебе надо.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #12 : 12-09-2009 15:58 » 

В том то и дело, что я не хочу чтобы пользователь вникал в реализацию взаимодействия.
Все должно происходить внутри класса автоматически.
Пользователю надо только к примеру в OnInitDialog прописать нужные свойства и обработчики:
Код:
FlashButton->Left = 20;
FlashButton->Top = 20;
FlashButon->Width = 80;
FlashButton->Height = 30;
FlashButton->Text = "Button";
FlashButton->AddActionHandler(&FlashButtonClick, "FlashButtonClick", ONCLICK); //подключение обработчика нажатия флеш-кнопки

FlashEdit->Left = 120;
FlashEdit->Top = 80;
FlashEdit->Width = 80;
FlashEdit->Height = 30;
FlashEdit->Text = "";
FlashEdi->.AddActionHandler(&FlashEditClick, "FlashEditClick", ONCLICK); //подключение обработчика нажатия флеш-контрола текстового ввода
То есть тогда пользователю компонента не надо будет самому реализовывать ExecuteMethod или устанавливать пользовательские сообщения.
« Последнее редактирование: 12-09-2009 16:16 от zubr » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 12-09-2009 16:02 » 

FlashButton это "твой" объект? Сиплюснутый?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 12-09-2009 16:05 » 

То есть тогда пользователю компонента не надо будет самому реализовывать ExecuteMethod или устанавливать пользовательские сообщения.

Эммм подожди. Но ведь он всё-равно должен вызвать эти FlashEditClick и  FlashButtonClick (если я правильно понял это ф-ции члены класса, OnINitDailog которого ты вызываешь?) или?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #15 : 12-09-2009 16:10 » 

Да. И все его свойства (Left, Top, и много других) псевдо-свойства, то есть они нужны только для формирования флешки (на их основе формируется специальный mxml-файл который подается Flex-компилятору), сам объект FlashButton - это окно внутри которого располагается ActiveX-контрол флеш-плеера и проигрывает получившуюся флешку.
Записан
zubr
Гость
« Ответ #16 : 12-09-2009 16:14 » 

Эммм подожди. Но ведь он всё-равно должен вызвать эти FlashEditClick и  FlashButtonClick (если я правильно понял это ф-ции члены класса, OnINitDailog которого ты вызываешь?) или?
OnINitDailog- это диалоговое окно на котором размещаются мои флеш-компоненты (FlashButton, FlashEdit)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #17 : 12-09-2009 17:03 » 

Ну тогда в объекте FlashEdit должен быть вызов FlashEditClick().

Я не совсем понял смысл передаваемых параметров: указатель на ф-ю, имя ф-ции и ID?

Но как бы то ни было. FlashEdit вызывает эти ф-ци при получении события от флэшки.
Так на этом месте можно просто вызывать ф-ции интрефейса. Тогда иницаилизация в диалоге будет выглядеть так: FlashButton->AddActionHandler(this); и всё.


Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #18 : 12-09-2009 17:08 » 

зы А вобще-то если ты хочешь сделать правильный контрол, то он (FlashEdit, FlashButton и тд) должен отправляет даже не сообщения, а NOTIFICATION. Это нечто похожее на сообщения, только распространяется от контрола родителю. Тогда ты эти кнопки можешь кидать на любую форму, даже если на ней нет ф-ции FlashButtonClick или она называется по-другому.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 23-09-2009 13:37 » 

Вот наткнулся случайно по превому вопросу. Может пригодится:
http://visualstudiohacks.com/articles/general/customize-your-project-build-process/
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #20 : 23-09-2009 15:52 » 

Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines