Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стоит ли делать новый класс? 
:(
    Опции темы
xTr1m
Дата 13.2.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

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



У меня такой вопрос : вот есть у меня несколько кнопок. У них должна быть разная реакция на события (OnMouseMove, OnClick, OnLDblClk и т.п.) Стоит ли заводить под каждую кнопку отдельный класс (порожденный от CButton)? Если да, то в большом проекте получится, наверное, около 40 классов (нормально ли это?). Если нет, то какими средствами лучше пользоваться, для различия событий?
PM MAIL WWW ICQ   Вверх
Coocky
Дата 13.2.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Нет...
В обработчике ОДНОГО класса делаешь

Код


void MyButton::OnMouseMove (UINT nFlags, CPoint point)
{

if  (GetDlgCtrlID()==MY_BUTTON1)
{
//.............
//.............

}
if  (GetDlgCtrlID()==MY_BUTTON2)
{
//.............
//.............

}
if  (GetDlgCtrlID()==MY_BUTTON3)
{
//.............
//.............

}



}



или switch
Так я делаю, по крайней мере

Это сообщение отредактировал(а) Coocky - 13.2.2006, 15:43


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
xTr1m
Дата 13.2.2006, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

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



Спасибо большое, очень долго мучился
Кстати, GetDlgCtrlID() используется только если я использую Диалог или в любом случае (для любого окна) ?

Это сообщение отредактировал(а) xTr1m - 13.2.2006, 18:26
PM MAIL WWW ICQ   Вверх
Coocky
Дата 13.2.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(xTr1m @ 13.2.2006, 18:24 Найти цитируемый пост)
(для любого окна)

Для любого окна..
А вот если создаешь диалог динамически, но на основе шаблона, тогда я делаю так
Код

dlg=new MyDlg;
dlg_id++;
dlg->Create(IDD_MYDLG,this);
    dlg->SetDlgCtrlID(dlg_id);

Добавлено @ 18:42
Да, забыл добавить
Цитата

Returns the window or control ID value for any child window, not only that of a control in a dialog box.

Т.е. только если на диалоге..Вроде так..Если верить МСДН или если я правильно перевел..
В любом случае по другому я не пользовался.. smile
Добавлено @ 18:46
А нет...неправильно перевел smile
Цитата

Возвращает окно или индификатор  контрола для любого дочернего окна, не только  из котрола в диалоговом окне.

smile

Это сообщение отредактировал(а) Coocky - 13.2.2006, 18:35


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
xTr1m
Дата 13.2.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

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



А можно еще один вопросик smile
Вот в первом примере (там где на основе if или switch) это работает, если кнопки создаются самостоятельно (т.е. без помощи редактора) А как быть, если я содал проект на основе диалога, кинул на него, скажем, 2 кнопки. Тогда ведь получается, что эти кнопки от CButton, а как мне привязать их к своему классу CMyButton и использовать свои события (OnMouseMove и т.п.) ?
PM MAIL WWW ICQ   Вверх
DeadSoul
Дата 13.2.2006, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

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



Coocky, за switch я бы отрывал руки.


xTr1m, нажатие на кнопку обрабатывается(обычно) в родителе этой кнопки


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Coocky
Дата 14.2.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



DeadSoul,
что-то я не понял...
А какие проблемы? Что за "рукоотрывание" smile ?
Я не понял- а ну-ка приведи свой вариант.. smile
Добавлено @ 11:56
Цитата(xTr1m @ 13.2.2006, 19:51 Найти цитируемый пост)
Тогда ведь получается, что эти кнопки от CButton, а как мне привязать их к своему классу CMyButton и использовать свои события (OnMouseMove и т.п.) ?

Очень просто..Просто в обьывление класса диалога заменяешь CButton на CMyButton..И все smile

Это сообщение отредактировал(а) Coocky - 14.2.2006, 11:57


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
DeadSoul
Дата 14.2.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

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



Цитата(Coocky @ 14.2.2006, 11:55 Найти цитируемый пост)
DeadSoul,
что-то я не понял...
А какие проблемы? Что за "рукоотрывание"  ?

За switch надо отрывать руки.
Есть два варианта:
- несколько полиморвных классов
- switch
Не надо выбирать switch. Полиморвизм для этого и придуман. Ты предстваляешь объем кода в который разрастется этот switch?
Добавлено @ 22:08
xTr1m, ты уверен, что все это не нужно обрабатывать в окне-родителе твоих кнопок? Обычно у кнопки недостаточно данных, чтобы обработать клик


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
WERITAS
Дата 15.2.2006, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

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



xTr1m,

А вообще странно...Если в приложении 40 кнопок, то я бы, скорей всего, писал бы его в С++ Builder smile







--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Aveic
Дата 15.2.2006, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.2.2006
Где: Да все мы из одно й ямы

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



Я за DeadSoul'а. Я так всегда и делал. Однако, это касается только кликов. Остальные сообщения в среднем случае лучше делать через switch. А еще лучше не придумывать таких разнообразных кнопок, а придумать новый элемент управления, который некоторым образом инкапсулирует эти кнопки, с таким разным поведением. Несмотря на все проблемы такой реализации, есть хоть одно преимущество - возможность повторного использования данной компоненты. smile
PM MAIL ICQ   Вверх
Coocky
Дата 15.2.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(DeadSoul @ 14.2.2006, 22:06 Найти цитируемый пост)
Есть два варианта:
- несколько полиморвных классов

smile
Несколько? smile
Если 40 кнопок с разной отработкой, сколько-несколько классов?

Цитата(DeadSoul @ 14.2.2006, 22:06 Найти цитируемый пост)
Полиморвизм для этого и придуман. Ты предстваляешь объем кода в который разрастется этот switch?

Ты че -травишь? smile
А ну покажи пример, как ты СВОЕЙ полиморфностью уменьшищь код? Создашь 39 производных классов?


Цитата(Aveic @ 15.2.2006, 01:00 Найти цитируемый пост)
Я за DeadSoul'а.

Можешь присоединятся к показу примера..



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 15.2.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



DeadSoul прав.
В общем случае вариант с разными классами лучше: поведение должно быть инкапсулировано. Большие switch'и с ~40 вариантами очень трудно поддерживать. А уж смотреть на них просто тошно.
Какая разница, сколько классов? 40 классов для большого приложения - смешная цифра. 400 - уже ближе...
Но это теория. А на практике - не могу себе представить 40 вариантов поведения кнопки на MouseMove или Click. Подозреваю, что имеется в виду что-то типа - выводить разные сообщения, вызывать разные функции обработки. Если так - то достаточно, конечно, одного класса без всяких свичей. Обработка кликов обычно поручается родителю (или фрейму), как уже было сказано. Что касается MouseMove и других сообщений - зависит от задачи.
Так что, спецификацию - в студию!

Это сообщение отредактировал(а) Earnest - 15.2.2006, 20:56


--------------------
...
PM   Вверх
Coocky
Дата 16.2.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @ 15.2.2006, 20:55 Найти цитируемый пост)
DeadSoul прав.
В общем случае вариант с разными классами лучше: поведение должно быть инкапсулировано

Я лишь предложил свой вариант.
ИМХО я не представляю 40 разных кнопок, но вот была ситуация, когда два обьекта одного класса должны были вести себя немного по разному, при определенном действии.
Я испоьзовал их индефикатор при разделении действий.
Я слабо себе представляю, как можно не запутаться в ;) классах(3 часа уйдет на выдумывание имен классов).
Я представляю, время, которое уйдет на копи-пасте кода, который уйдет на отрисовку.
Никто не спорит, что "правильно" делать так ,как надо, а не так ,как ненадо (Вини-Пух smile ),но мой вариант лучше. Пусть смешно выглядит 40 switc_ей, чем 40 классов.
ЭТО мое ИМХО..



--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
takedo
Дата 17.2.2006, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Coocky, соглас.
Тем более, что можно в этом классе завести переменную BYTE m_switch_data и при Create ставить нужный номер, ну а дальше как

Coocky, прописал.


Coocky, че ты себя в старики то записываешь со своим Высоцким? С сигаретой, понимаешь ли? smile Ну ка меняй личико обратно, смотреть на тебя нового тошно, где улыбка?!!! smile smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 17.2.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Весь вопрос в том, что понимается под
Цитата(Coocky @ 16.2.2006, 10:25 Найти цитируемый пост)
должны были вести себя немного по разному, при определенном действии

Вариант 1. При (например) дабл-клике одна кнопка должна три раза подпрыгнуть и пять раз свистнуть. А вторая - показать какой-нибудь диалог для настройки какого-нибудь ресурса. Тут вопросов нет - два разных класса с общей базой (которая в лице CButton) уже есть.

Вариант 2. При том же дабл-клике первая кнопка должна вызвать процедуру F1, а вторая - - тоже вызвать процедуру, но F2. Тут тоже вопросов нет - обойдемся параметризацией.

Coocky, ты, между прочим, совершенно прав: удачные имена классов - это половина хорошего дизайна.
А копи-паст кода - это проблема программиста, хороший дизайн этого избегает.


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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