реклама на сайте
подробности

 
 
> Visual C++. Основа основ., Требуется помощь новичку
InvisibleFed
сообщение Apr 16 2007, 12:18
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469



Начинал программировать под Delphi. Потом перебрался на Builder. Имею небольшой опыт программирования под X Window. Под Windows все в основном писал на Builder-e. Там где нужно было чего-то особенное, но не связанное с GUI, писал на Visual C++ и оформлял в виде dll. Но вот возникло требование (слава богу временное) - GUI на MFC. У меня шок... Открываю учебники и вижу помимо всяких там иерархий классов (это все понятно вроде) набор шаманских действий. Вопросы по существу:

1. Основная идеология с практической точки зрения (Пример для Builder-a: Создаете форму, кидаете на нее компоненты, назначаете свойства в инспекторе, описываете Events. Все названия свойств четко соответствуют именам членов класса)
2. Как получить доступ к конкретному объекту. Например кинул я на форму Button (класс CButton или наследник), вижу его ID типа IDC_Button1 (всего-навсего число). У класса CButton есть определенные поля, методы, свойства и пр. Как к ним достучаться? Или здесь как-то все по иному? Я например не моу пока даже поместить текст в Edit (CEdit) (Кроме как методом тыка - SetDlgItemText(...) - это ваще чё?)

Пока все. Прошу помоч.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
InvisibleFed
сообщение Apr 19 2007, 03:16
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469



Уважаемый Demeny. Я честно очень благодарен Вам за ответ. Вторая половина - то самое. Но. Я же написал, что я прогал долго под билдер. Я отлично знаю идеологию объектной-ориентированности не на словах, а на деле.

Цитата
Не смейтесь - основа основ здесь C++ - объекты, классы, конструкторы/деструкторы, виртуальные функции.


Так я и хотел это себе видеть. Так я это видел в билдере. Цитата

Цитата
Если всё же захотелось "достучаться" до объекта по идентификатору, например, установить другой текст кнопки на летy...
Код
CButton* pMyButton1 = GetDlgItem(IDC_Button1);
pMyButton1->SetWindowText("My New Button");


Это противоречие Вашим собственным словам и моя проблема на первом этапе пользования вижака. Чтобы достучаться до объекта, который уже создан, я должен зачем-то вызывать какую-то непонятную функцию по идентификатору! С ОО это не имеет ничего общего и с пониманием ОО тоже.

Во вторых, Вы обращали внимание, что среди членов того или иного класса в основном одни только функции (SetWindowText, AddString, и пр.)? Как таковых свойств или полей-переменных нет почти. Я лично не верю, что их нет на самом деле. Почему бы не сделать, например

Код
pMyButton1->Text = "My New Button";

?

Это конечно может придирки, но мое мнение, что закрытие этих членов, доступ к ним только через функции - долбанутая политика MS по части безопасного кода. От кого их скрывать? От разработчика? А то что их якобы как бы вовсе нет (все реализуется через функции) - я не верю - в таком случае, чтобы сделать банальную перерисовку надо на ежа сесть.

Цитата
И не надо ничего учить наизусть - ставим и читаем MSDN - там - как в Греции - есть всё.


Не все. Почитайте, например, в нем о том как назначить группу RadioButton-у (CRadioButton, если не запамятовал). Я смеялся и плакал.

Я вот тут попробовал на С# чего написать... Вот это то что надо! Все прозрачно и понятно. Мое мнение, что MS наконец-то реализовали то, что в борланде не формально было сделано еще тыщу лет назад. Это модная "компоненто-ориентированность" (наследие ОО). И теперь они это как нечто новое преподносят. ХЗ.

А за вторую часть сообщения спасибо. Если желаете, есть место для дискуссии - в ней того гляди родиться истина. smile.gif
Go to the top of the page
 
+Quote Post
Demeny
сообщение Apr 23 2007, 10:08
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237



Цитата(InvisibleFed @ Apr 19 2007, 04:16) *
Код
CButton* pMyButton1 = GetDlgItem(IDC_Button1);
pMyButton1->SetWindowText("My New Button");

Это противоречие Вашим собственным словам и моя проблема на первом этапе пользования вижака. Чтобы достучаться до объекта, который уже создан, я должен зачем-то вызывать какую-то непонятную функцию по идентификатору! С ОО это не имеет ничего общего и с пониманием ОО тоже.

Никакого противоречия ! Функция GetDlgItem(...) - это тоже метод класса Вашего диалога, из которого Вы её вызываете! Перепишем для ясности
Код
CButton* pMyButton1 = this->GetDlgItem(IDC_Button1);
pMyButton1->SetWindowText("My New Button");

И ещё. Я же писал, что идентификаторами можно и не пользоваться. Заведите себе в классе Вашего диалога кнопку
Код
CButton MyButton;

и общайтесь с ней без всяких идентификаторов
Код
MyButton.SetWindowText("My first button");

Это вопрос стиля программирования. Мне, например, удобнее заводить идентификаторы для объектов, и если им раздать осмысленные имена - программа становится удобочитаемой...

Цитата(InvisibleFed @ Apr 19 2007, 04:16) *
Во вторых, Вы обращали внимание, что среди членов того или иного класса в основном одни только функции (SetWindowText, AddString, и пр.)? Как таковых свойств или полей-переменных нет почти. Я лично не верю, что их нет на самом деле. Почему бы не сделать, например
Код
pMyButton1->Text = "My New Button";

?
Это конечно может придирки, но мое мнение, что закрытие этих членов, доступ к ним только через функции - долбанутая политика MS по части безопасного кода. От кого их скрывать? От разработчика? А то что их якобы как бы вовсе нет (все реализуется через функции) - я не верю - в таком случае, чтобы сделать банальную перерисовку надо на ежа сесть.

Вот. Это и есть образ мышления программиста, привыкшего к статическому программированию ! Так было, когда программисты хранили данные в структурах и обращались к ним по имени полей. И опять летят камни в адрес Microsoft ...
На самом деле MS тут ни при чём. Вы затронули один из краеугольных камней ООП, именуемый инкапсуляцией - это не только объединение кода и данных внутри объекта, как думают многие начинающие программеры. Это ещё и разделение интерфейса и реализации объекта (public, protected, private), а также сокрытие реализации, но не от разработчика, а от ошибок. Рассмотрим Ваш пример внимательнее.
Код
pMyButton1->Text = "My New Button";

Это аварийный код по определению. Объясню почему.
1. Что за поле Text ? Если это указатель на строку, то его содержание будет утеряно, как только будет разрушена константа "My New Button" - и это произойдёт по выходу из локальной функции. Будет ошибка доступа к памяти.
2. Если это объект класса CString, то не надо заниматься самообманом - за оператором присваивания = стоит работа тех же методов класса CString, которые скопируют Вашу константу к себе в "недра".
3. А как Вы узнали при присваивании, что хватит памяти для Вашей строки ?
4. А Вы уверены, что поле Text есть внутри ?

В том то и дело, что прямой доступ к данным внутри объекта всегда чреват разрушением объекта из-за несоответствия данных размерам памяти. И вообще, динамическое программирование подразумевает, что память под данные (возможно, гигантского объёма) выделяется и освобождается динамически, и никогда "снаружи" класса неизвестно, сколько памяти и для чего уже выделено внутри объекта. Об этом "знает" только сам объект и поэтому он сам рулит менеджментом внутри, а снаружи только интерфейс из функций. Так что это не "бага" - это "фича", это надо прочувствовать, прелесть того, что ты не обязан помнить, какой длины массив у тебя, и ты всегда можешь безопасно добавить в него ещё один элемент !!!

Цитата(InvisibleFed @ Apr 19 2007, 04:16) *
Почитайте, например, в нем о том как назначить группу RadioButton-у (CRadioButton, если не запамятовал). Я смеялся и плакал.

Я всегда это делал путём установки галочки прямо в редакторе ресурсов.


--------------------
Сделано в Китае. Упаковано в России.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- InvisibleFed   Visual C++. Основа основ.   Apr 16 2007, 12:18
- - PsM   Цитата(InvisibleFed @ Apr 16 2007, 13:18)...   Apr 17 2007, 12:00
|- - InvisibleFed   Цитата(PsM @ Apr 17 2007, 20:00) Если реч...   Apr 17 2007, 12:53
- - unichorn   В борланде усё просто, если нужна надпись на забор...   Apr 17 2007, 16:46
- - InvisibleFed   ЦитатаВ борланде усё просто, если нужна надпись на...   Apr 18 2007, 05:28
|- - Freeze Anti   Цитата(InvisibleFed @ Apr 18 2007, 06:28)...   Apr 18 2007, 09:50
- - PsM   Цитата(InvisibleFed @ Apr 17 2007, 13:53)...   Apr 18 2007, 10:11
- - InvisibleFed   ЦитатаЗачем к примеру для кнопки заводить переменн...   Apr 18 2007, 11:32
|- - Freeze Anti   Цитата(InvisibleFed @ Apr 18 2007, 12:32)...   Apr 18 2007, 12:11
- - Илья Игоревич   Мои пять копеек: если гуй можно реализовать не тол...   Apr 18 2007, 18:33
|- - Demeny   Цитата(Илья Игоревич @ Apr 18 2007, 19:33...   Apr 19 2007, 00:53
|- - shasik   Цитата(Demeny @ Apr 19 2007, 03:53) И что...   May 25 2007, 10:09
- - Pathfinder   InvisibleFed, 1. В стандарте C++ нет понятия свойс...   Apr 20 2007, 21:31
- - InvisibleFed   Цитата1. В стандарте C++ нет понятия свойств и соб...   Apr 21 2007, 03:39
- - LMT   ЦитатаА чегo такое WTL? _http://www.codeproject.c...   Apr 22 2007, 15:05
- - InvisibleFed   Спасибо.   Apr 23 2007, 07:44
- - Pathfinder   Demeny, здесь КодpMyButton1->Text = "My Ne...   Apr 23 2007, 11:09
- - InvisibleFed   ЦитатаФункция GetDlgItem(...) - это тоже метод кла...   Apr 23 2007, 11:54
- - Pathfinder   ЦитатаIMHO в случае написания под конкретный GUI в...   Apr 23 2007, 16:33
- - SysRq   Можно работать так же как и в Билдере. Тока менее ...   May 25 2007, 10:57


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 21:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016