Borland C++ 5 для себя

         

Создание заготовки программы.


Если вы с первого раза сумели написать программу,

в которой компилятор не нашел ни одной ошибки,

сообщите об этом системному программисту -

он исправит ошибки в компиляторе.

(Народная мудрость.)

Конечным результатом этой главы будет простейшая программа, которая сама по себе почти ничего не умеет делать, но служит основой для создания наших следующих программ. К счастью, наша первая программа будет исключением из народной мудрости, приведенной в эпиграфе - поскольку мы ее создадим, лишь выбирая варианты, предложенные Borland-ом.

Запускаем Borland. Появляется серое окно, на котором есть всего пять кнопочек и строка меню. В этой строке выбираем пункт File - New - AppExpert - см.рис.1.1.

Рисунок 1.1. Запуск "Эксперта" по созданию программ.

Тем самым мы запустили "Эксперта", который поможет нам создать шаблон будущей программы. Эксперт прежде всего захочет узнать имя будущей программы и где она будет у Вас находиться. Выберите любое - потом всегда можно будет окончательный файл переименовать. Для примера, чтобы ни с чем по ходу книги не перепутать имя программы, назовем ее "2000" - см.рис.1.2.

Рисунок 1.2. Выбор имени программы и папки, где она будет лежать.

Нажимаем, естественно, "Открыть" и перед нами предстает широкий выбор опций нашей будущей - а, впрочем, уже почти настоящей - программы. Для начала выберем опцию "Dialog Client" и снимем флажок "Document/View" (см.рис.1.3) - мы делаем программу, которая выглядит как: в общем, трудно обяъснить как; потом увидим, что получится.

Рисунок 1.3. Выбор основного вида программы.

Если затем щелкнуть на плюсике слева от слова "Application", то этот пункт развернется. Выделим "Basic Options" и снимем все флажки, поскольку они пока только будут мешать нам - см.рис.1.4.

Рисунок 1.4. Выбор основных опций программы.

Затем в пункте "Admin Options" Вы можете ввести некоторую информацию - может, она Вам пригодится - см.рис.1.5. Все эти данные потом на любом этапе всегда можно поменять.






Рисунок 1.5. Идентификационные данные.

Затем развернем пункт "Main Window" и оставим там те галочки, которые показаны на рис.1.6. Все остальные - для нас лишние, а некоторые - так вообще вредные.



Рисунок 1.6. Параметры оформления программы.

Теперь осталось нажать на кнопку "Generate", потом еще раз подтвердить, что Вы не передумали - и Borland сделает за Вас все остальное. Вы увидите, что кнопок в окне теперь стало больше, и появилось окно проекта "2000.ide" - это структура проекта Вашей программы - см.рис.1.7. Чтобы в результате появился единственный файл "2000.EXE", создана целая куча исходных файлов, с которыми Вам и придется иметь некоторое дело.



Рисунок 1.7. Только что созданный проект программы.

Нам не терпится посмотреть, что же получилось, поэтому нажмем на кнопку "Run". И через несколько секунд/минут/часов (зависит от способностей Вашего компьютера) на экране появится Ваша первая программа - см.рис.1.8. Цветовая ее гамма будет, естественно, совпадать с установленной на вашем компьютере.



Рисунок 1.8. Только что родившаяся программа.

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

Галявов И.Р. e-mail:


Кнопочки и сообщения.


Во имя Отца, и Сына, и Духа Святого, Enter!

(Молитва программиста)

Вернемся к тому, что мы сотворили в первой главе. Сначала посмотрим, из чего же состоит исходный код нашей программы. Для этого пощелкаем в единственном пока окне - "Project::2000.ide" на всех плюсах. Развернется полная структура проекта - см.рис.2.1.

Рисунок 2.1. Развернутая структура проекта.

Собственно, каждая строка - это отдельный файл. С большинством из них можно (и придется) работать в текстовом режиме. Но есть и такие места, где можно все делать мышкой.



Сообщения MessageBox - чуть более подробно.


Сравнивая увиденное на экране сообщение с тем текстом, который Вы ввели, Вы можете легко понять структуру (или как это принято называть - синтаксис) команды MessageBox. А именно - первая фраза в кавычках - это текст сообщения. Сочетание "\n" означает переход на новую строку. Вторая фраза - это заголовок сообщения. А третья часть - это некие флаги (разделенные вертикальными черточками), определяющие внешний вид сообщения. Так вместо флага MB_ICONINFORMATION можно поставить другие, и тогда вместо восклицательного знака будут появляться другие значки - см. таблицу.

MB_OK - это тоже флаг, и означает он, что в появившемся сообщении будет только одна кнопка - "ОК". Но, очевидно, бывают и сообщения в которых есть более одной кнопки. Вместо флага MB_OK мoгут стоять следующие флаги - см.таблицу.

ФлагЧто дает
MB_ABORTRETRYIGNOREСообщение содержит три кнопки - Abort, Retry и Ignore.
MB_OKСообщение содержит одну кнопку - ОК. Если не поставить никакого флага из этой компании, то по умолчанию принимается именно этот флаг.
MB_OKCANCELСообщение содержит две кнопки - OK и Cancel.
MB_RETRYCANCELСообщение содержит две кнопки - Retry и Cancel.
MB_YESNOСообщение содержит две кнопки - Yes и No.
MB_YESNOCANCELСообщение содержит три кнопки - Yes, No и Cancel.

Попробуйте заменить флаг MB_OK на какой-либо флаг из таблицы, откомпиллируйте и запустите программу. Теперь при нажатии на нашу кнопку будет появляться сообщение с двумя или тремя кнопками - в зависимости от того, что Вы выбрали. Попробуйте понажимать на эти кнопки - результат всегда будет одинаков - окно сообщения закроется и ничего больше не произойдет. Но раз кнопки разные - значит должны происходить разные действия при нажатии на них? Не должны, но могут. Этим мы займемся через одну главу.

Галявов И.Р. e-mail:



Создание своей кнопки в окне программы.


Выделим строку "2000app.rc" в проекте и дважды щелкнем на ней. Появится новое окно, которое называется редактором ресурсов. Развернем, нажав на плюс, пункт "DIALOG", и выделим единственный подпункт - "IDD_CLIENT (2000)" - см.рис.2.2. (И вот тут я понял, что имя для нашей программы - 2000 - я выбрал не совсем удачно. То, что Вы видите в скобках - 2000 - это идентификационный номер ресурса "диалога" - и он никак не связан с выбранным нами именем программы. Выберите в следующий раз другое имя - но здесь Вы увидите все равно " IDD_CLIENT (2000)" ). Но продолжим. Справа мы увидим нечто, очень похожее по внешнему виду на нашу программу. В общем-то, это она и есть. То, что там вверху написано "Dialog Client" и нет справа крестика, не должно вас смущать - все это меняется и добавляется в других частях программы - вспомните, что парой абзацев выше мы узнали, что проект содержит много разных исходных файлов.

Рисунок 2.2. Редактор ресурсов.

Теперь дважды щелкнем на выделенном пункте - "IDD_CLIENT (2000)" - и мы получим возможность изменить вид нашей программы. В новом открывшемся окне вы должны снова увидеть внешний вид вашей программы, а также панель "Controls" - см.рис.2.3.

Рисунок 2.3. Панель создания элементов управления и оформления.

Если такой панели у вас не видно, то щелкните правой кнопкой мыши вне прямоугольника "Dialog Client" и в появившемся меню пометьте галочкой пункт "Control Palette" - см.рис.2.4.

Рисунок 2.4. Показ разных панелей редактора ресурсов.

Кстати, может пометить и пункт "Grid" - это сетка, которая поможет выравнивать все, что вы нарисуете на своей программе.

Но вернемся к панели "Controls". Нажмите кнопку, на которой нарисована кнопка (убедитесь сами, что это не каламбур, а так оно и есть) с надписью "OK". Если вы теперь переведете курсор на вашу программу, то увидите, что он принял вид перекрестья. Ткните где-нибудь на программе - и вы получите вашу собственную кнопку - см.рис.2.5.




Рисунок 2.5. Новая кнопка.

С этой кнопкой можно сделать многое, если навести на нее курсор и нажать правую кнопку. Появившееся меню - см.рис.2.6 - содержит ряд полезных опций, но пока мы зайдем в пункт "Properties".



Рисунок 2.6. Изменение свойств кнопки.

Появившееся меню свойств представляет тоже много возможностей, но для начала ограничимся тем, что в поле "Caption" введем вместо надписи "Button3" надпись "Нажимать здесь" - чтобы будущий пользователь вашей программы не промахнулся - см.рис.2.7.



Рисунок 2.7. Изменение надписи на кнопке.

Нажав затем "OK", Вы увидите, что кнопка попыталась показать на себе Вашу надпись, но не смогла, поскольку кнопка маленькая, а надпись длинная - см.рис.2.8.



Рисунок 2.8. Надпись не убралась на кнопку.

Проблема? Устраним! Беретесь за один из левых или правых квадратиков и растягиваете кнопку до нужных размеров - см.рис.2.9.



Рисунок 2.9. Нормальная кнопка с надписью.

Чтобы полюбоваться на результат, закроем все окна, оставив только проект, и нажмем на кнопку "Run".

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



Рисунок 2.10. Бывает, что творческий процесс прерывается на самом интересном месте.

Значит, самое время сказать, что, вообще-то, я кнопкой "Run" обычно не пользуюсь. Но вернемся сначала к Borland-у. Если у Вас (на что я надеюсь) он не вылетел, то все равно прочитайте следующие абзацы - они полезны и для нормальной работы.

Итак, если у Вас вдруг произошло то же самое - то снова запускаем его, но теперь уже через меню "File-Open" ищем наш файл - "2000.ide". Если открылся - хорошо. Еще раз идем в редактор ресурсов (если забыли, как - вернитесь к рис.2.1) и убеждаемся, что созданная нами кнопка не пропала - поскольку при закрытии редактора ресурсов он автоматически сохраняет все изменения. Снова его закрываем и нажимаем на кнопку "Build" (см.рис.1.7).

Теперь объясняю, как я обычно проверяю работу программы при ее создании. Да все просто - я держу открытой папку, в которой лежит наш проект - и там всегда есть файл "2000.exe", который я и запускаю как обычную программу. А чтобы заново создать эту программу после внесения каких-либо изменений - служат кнопки "Build" и "Make" (см.рис.1.7). Сразу скажу и о последней. Опять же, обычно я пользуюсь именно "Make" - она заново создает файл "2000.exe", но при этом перекомпилирует только те файлы, которые изменились с момента последнего создания файла "2000.exe" (Borland ведет учет всех изменений). Кнопка же "Build" перекомпилирует ВСЕ файлы (независимо от того, изменялись они или нет), что, конечно, требует больше времени. Короче, после внесения изменений нажимайте на "Make", а если потом ваша программа почему-то не запустится (а должна бы - по вашему мнению) - попробуйте "Build" - иногда помогает.

Значит, нажали на "Make" (или "Build"), получили сообщение, что все "Success" ("успешно") - см.рис.2.11.



Рисунок 2.11. Удачное завершение создания (билдинга) файла "2000.exe"

Затем открываем папку с файлом "2000.exe" и запускаем его. Радостно замечаем, что программа имеет нашу кнопку - см.рис.2.12.



Рисунок 2.12. Программа с нашей кнопкой.

На эту кнопку можно даже нажимать - она будет утопать под курсором, как и положено приличной кнопке. К сожалению, в результате нажатия не происходит никаких действий, но это мы сейчас поправим.


Заставим кнопку работать.


Как говорится в одной умной книжке, кнопка в программе - это самый простой, интуитивно понятный и удобный элемент. С кнопками мы знакомы по обычной - внекомпьютерной - жизни. Любому ясно - если есть кнопка, то надо на нее нажать: и посмотреть, что получится

Закроем нашу программу и вернемся в Borland. Зайдем в редактор ресурсов и дойдем снова до меню, показанного на рис.2.6. Только теперь в этом меню выберем пункт "ClassExpert". В нашем случае можно было бы попасть в "ClassExpert" и не заходя в редактор ресурсов, но обычно этот заход делается сразу после того, как мы нарисовали новую кнопку. Вы должны увидеть новое окно - см.рис.2.13 - это и есть "ClassExpert".

Рисунок 2.13. "ClassExpert"

Если Вы внимательно изучали предыдущие картинки, то можете вспомнить, что обозначение IDC_BUTTON1 Вы видели в свойствах нашей кнопки - см.рис.2.7. Это ее идентификатор в рамках нашего проекта. Щелкнем на плюсе слева от IDC_BUTTON1 и мы увидим кучу действий, на которые может реагировать кнопка - см.рис.2.14.

Рисунок 2.14. Действия, на которые может реагировать кнопка.

Самое естественное для кнопки - это реагировать на нажатие - поэтому выделим пункт BN_CLICKED ("кликание на батоне" - расширенный русский перевод этого сокращения) и нажмем правую кнопку мыши. Снова появится меню - см.рис.2.15.

Рис.2.15. Продолжение процесса работы с кнопкой.

Выберем "Add handler", нажав на нем. Появится еще один запрос, в котором уточнят, каково будет внутреннее имя действия этой кнопки. Потом ведь у Вас кнопок в программе будет много, и чтобы легко отличать их в тексте программы друг от друга, лучше, чтобы их имена отличались. Назовем ее "BNClickedOne" - см.рис.2.16.

Рисунок 2.16. Присвоение внутреннего имени кнопке.

Теперь в "ClassExpert" идентификатор кнопки и действие BN_CLICKED будут помечены галочками, а в нижней части этого эксперта появится кусочек текста какого-то файла, в котором появилась строка с именем, только что введенным нами - см.рис.2.17.




Рисунок 2.17. Мы уже на полпути к работоспособной кнопке.

Давайте закроем "ClassExpert" и редактор ресурсов, вернувшись к окну, в котором есть только окно проекта. В этом окне выделим и дважды щелкнем на строке "2000dlgc.cpp" - это один из файлов исходного кода, который мы и будем, в основном, редактировать вручную. Этот файл откроется в своем собственном окне. Пойдем туда и найдем кусок, который мы ранее видели в "ClassExpert" - см.рис.2.18.



Рисунок 2.18. Начинаем редактировать исходный код вручную.

Собственно, если Вы читаете по-английски, то Вам понятно, что написано темно-синим цветом: "ВСТАВЬТЕ Ваш код здесь". Именно на этом месте кончаются движения мышью и начинается работа с клавиатурой. Именно в этом месте мы должны написать то, что будет происходить при возникновении события "Нажатие на кнопку". А происходить у нас будет появление на экране окошка с неким сообщением и кнопкой "ОК".

Делается это не просто, а очень просто - вписываете там, где сказано "вставьте" следующий код:

void T2000DlgClient::BNClickedOne() { // INSERT>> Your code here. MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!", "Наше сообщение", MB_OK | MB_ICONINFORMATION); }

К сожалению, это в книге все выглядит красиво. На самом деле, когда вы будете в Borland-е вводить эту строку, то можете столкнуться с тем, что русские буквы отображаются в виде какой-то абракадабры. Это никак не повлияет на работу вашей будущей программы - там русский текст отобразится нормально (взгляните ниже - на рис.2.20). Более того - например, при отладке, в другом окне Borland тоже покажет их нормально. Но вот здесь почему-то не хочет. Это, конечно, создает некоторые неудобства. Или смиритесь с ними, или найдите решение, а потом расскажите мне.

Теперь самое время и место рассказать о последней помеченной, но пока не упомянутой кнопке на рисунке 1.7 - "Compile". При нажатии на эту кнопку происходит компилляция (трансляция) файла, который в данный момент является активным для Borlanda. В нашем случае это файл "2000dlgc.cpp". Что такое компилляция, в общем-то, и неважно. Главное для нас сейчас заключается в том, что после нажатия на кнопку "Compile" Borland проверит наш файл и если там нет ошибок, он радостно скажет нам об этом - см.рис.2.19.



Рисунок 2.19. Компилляция прошла успешно.

Если же Вы получили сообщение об ошибке, то тщательно проверьте набранный Вами текст или перейдите к главе 3 - там мы как раз поговорим об ошибках в программе.

Ну, а после успешной компилляции можно нажать "Make" - должно появиться сообщение об успешной компилляции. Запустим нашу программу на выполнение - кнопкой "Run" или из ее папки. Мы снова увидим знакомую панель с нашей кнопкой. Нажмем на нее. И - о чудо! - появилось сообщение - см.рис.2.20.



Рисунок 2.20. Результат нажатия на нашу кнопку.


Сообщения об ошибках и предупреждения.


- Как вам yдалось так быстpо выyчить английский язык?!!

- Да, еpyнда какая. Они там почти все слова из С++ взяли.

(Из разговора с программистом)

Но не всегда Вы будете видеть радующее глаз сообщение, подобное представленному на рис.2.19. А может, Вы уже и столкнулись с этим, выполняя написанное в предыдущей главе. Если Вам тогда повезло, то теперь вернемся к нашему файлу "2000dlgc.cpp" и внесем туда ошибку.



у нас всегда были нули


На рис.3.1 и 3.3 у нас всегда были нули в строке "Warnings" ("Предупреждения"). Давайте теперь с ними познакомимся. Добавим в наш код новую строку:
void T2000DlgClient::BNClickedOne() { // INSERT>> Your code here. MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!", "Наше сообщение", MB_OK | MB_ICONINFORMATION); int a; }
Что получим после компилляции - см.рис.3.5.

Рисунок 3.5. Предупреждения.
Ошибок в коде нет, о чем говорит, как ноль в строке "Errors", так и статус - "успешно". Но появилось 1 предупреждение ("Warnings"). Предупреждение указывает Вам на нечто, что не мешает программе правильно откомпиллироваться, но что вызывает у Borlanda некоторые сомнения. Что же это в данном случае? Читаем сообщение, помеченное в этом случае желтым восклицательным знаком:
Warn : 2000dlgc.cpp(64,2):'a' is declared but never used
Означает это, что переменная "a" объявлена в тексте программы, но нигде - ни в какой команде не используется. Такие вещи иногда случаются, если Вы долго пишете большую программу, вводите переменные, потом отказываетесь от них. Самое безобидное предупреждение - если Вас не раздражает 1 в строке Warnings, то можете все оставить, как есть. Кстати, бывает, что такое предупреждение Borland выдает несправедливо - видимо, не все он сам в себе понимает правильно.
В общем, на предупреждения следует обращать внимание, и исходя из правил хорошего тона, надо подчищать программу, чтобы предупреждений не было. Но не стоит затрачивать много усилий на их устранение, если Вы считаете, что какие-то предупреждения не принесут вреда.
Галявов И.Р. e-mail:

Сообщения об ошибках.


Удалим, например, первые кавычки во фразе "Вы нажали:".

MessageBox(Вы нажали на кнопку\nСпасибо Вам за это!",

Ага, текст изменил цвет и из синего стал красным. (Если вы читаете черно-белый вариант книги, то это превращение я Вам показать, конечно, не могу - смотрите на монитор). Не стану объяснять очевидное - красный цвет всегда означает что-то плохое. Таким незамысловатым образом Borland, следящий за каждым Вашим движением, сразу сообщает Вам, что Вы делаете что-то не то.

Вернем кавычки на место и удалим первую запятую.

MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!" "Наше сообщение", MB_OK | MB_ICONINFORMATION);

Теперь Borland сразу не отреагировал - это не такая тривиальная ошибка, как первая. Но он ее все равно обнаружит. Нажмем на кнопку "Compile". Получим следующее - см.рис.3.1.

Рисунок 3.1. Неудачное завершение компилляции.

Статус уже не "Success" ("успешно"), а "Failure" ("неудачно"). И в строке "Errors" ("Ошибки") вместо приятных нулей теперь горит число "2". Не думайте, кстати, что Вы успели сделать две ошибки. Нажимаем на "ОК" - что ж еще делать-то - и активным окном становится окно внизу с заголовком "Messages" ("Сообщения"). В этом окне Вам сразу сообщают о Ваших ошибках - см.рис.3.2.

Рисунок 3.2. Сообщения об ошибках.

Как всегда, красный цвет - восклицательного знака - означает что-то нехорошее. Бывают и другие цвета, кроме красного, о чем мы узнаем позже. Собственно, сообщение об ошибке чаще всего для новичка выглядит очень загадочным, но это только на первый взгляд. Прежде чем пытаться перевести его, заметим, казалось бы, более важную вещь - указание на место ошибки. Во-первых, видно, что оба сообщения об ошибках - оба красных восклицательных знака указывают на одно место - на позицию 48 строки 60 файла "2000dlgc.cpp" (60,48). То, что место одно, говорит, обычно, о том, что ошибка одна. Просто Borland оценил ее с двух точек зрения. Во-вторых, обязательно учитывайте, что Borland указывает не ТОЧНОЕ место ошибки - поскольку правильных вариантов может быть много, Borland не знает, ЧТО Вы хотели написать на самом деле. Итак, позиция, чаще всего стоит ПОСЛЕ места ошибки. И даже нельзя быть уверенным, что ошибка находится в указанной строке. В чем же можно быть уверенным? Да ни в чем! Щелкнем на выделенной строке в окне "Messages", и мы сразу же перенесемся в ПРЕДПОЛАГАЕМОЕ место ошибки. И окажемся перед точкой с запятой в конце команды "MessageBox", на основании чего можно предположить, что ошибка находится в этой команде. Где именно? Подсказка, вообще-то, была - во втором сообщении об ошибке, которое из-за своей длины не убралось на рис.3.2. Полный текст сообщения выглядел так:


Error: 2000dlgc.cpp(60,48):Type mismatch in parameter 'caption' in call to 'TWindow::MessageBox(const char *,const char *,unsigned int)'

Здесь Borland среди всего прочего напоминает Вам, каким должен быть синтаксис команды "MessageBox". Взлянув внимательно и сравнив с нашим текстом, мы увидим, что количество запятых отличается. К сожалению, не всегда это бывает так просто - в команде могут быть необязательные параметры - т.е. такие, которые можно не указывать - тогда количество запятых в реальном коде может быть меньше, чем в описании синтаксиса. Но проверять такие вещи стоит. Более точное предполагаемое место ошибки можно увидеть в начале сообщения - а именно - что-то не так с "параметром 'caption'" - т.е., с заголовком программы - и искать надо где-то около текста "Наше сообщение", что соответствует действительности - именно перед заголовком не хватает сейчас запятой.

Если же простое чтение сообщений об ошибках не дает Вам идеи о ее сути, и опознать в тексте файла Вы ее тоже не можете, попробуйте почитать HELP. Там есть раздел, который называется "Error messages". Иногда там действительно можно найти подробности, помогающие устранить ошибку. Собственно, можно даже в подобной ситуации не запускать Help отдельно, а просто выделить сообщение об ошибке, нажать правую кнопку мыши и в появившемся меню выбрать "Help".

Да, запятая оказалась не такой простой ошибкой. Возьмем что-либо попроще. Запятую вернем на место, а удалим последнюю скобку -

MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!", "Наше сообщение", MB_OK | MB_ICONINFORMATION;

После компилляции мы получим сообщение об одной ошибке и Borland четко укажет на нее:

Error: 2000dlgc.cpp(60,48):Function call missing )

Редкий случай, когда, нажав на сообщение об ошибке, мы попадаем почти на ее место - в одной позиции от нее, да еще и все ясно - "В вызове функции пропущен знак 'скобка'" - что-что, а скобки Borland считать умеет!

И давайте посмотрим еще на один тип ошибки, который возникает, когда Вы долго и упорно отлаживаете программу - редактируете, компиллируете, запускаете - и все это много раз по кругу. Запустим нашу программу не командой "Run", а просто из ее папки - там всегда есть какая-то работоспособная версия. Не закрывая программы вернемся в Borland, удалим все ошибки, нажмем "Build". Что получим - снова ошибку - см.рис.3.3.



Рисунок 3.3. Билдинг не удался.

Сообщение об ошибке будет иметь следующий вид - см.рис.3.4.



Рисунок 3.4. "Не могу открыть файл 2000.exe"

От чего произошла эта ошибка, Вы уже догадались - Borland попытался создать новый вариант программы "2000.exe" в тот момент, когда эта программа была запущена. И он об этом догадался, написав в скобках - "Программа все еще работает?" Вывод - всегда закрывайте создаваемую Вами программу, когда создаете ("Make", "Build") новый вариант.


Возвращаемые значения.


Новости из жизни Microsoft: разработан

женский Windows 98. К кнопкам "да" и "нет"

добавлена третья - "может быть".

В детстве, когда я только начал изучать программирование, самой первой непонятной вещью для меня были "Return Values" - значения, возвращаемые вызванной функцией.

Сейчас попробую Вам рассказать так, чтобы было понятно. Есть функция - например, "синус". Мы вызываем эту функцию, написав, обычно, в программе

y = sin(x) ;

Надеюсь, вы догадываетесь, что в тексте программы такая строка означает не уравнение, которое нужно решить. Если не догадываетесь, объясняю: мы вызываем функцию "синус", подсунув ей какое-то число "х". Функция вычисляется и результат вычисления синуса присваивается переменной "у". Так вот это вычисленное функцией значение и называется "возвращаемым значением". Любая функция всегда возвращает какое-либо значение в то "место", откуда она была вызвана. Причем, мы можем написать в программе просто

sin(x) ;

При этом функция "синус" вычислит значение синуса "х", и обязательно вернет это значение. Вот только в этом случае оно ничему не присвоится и пропадет.

А теперь вернемся в главу 2 - где мы создавали сообщения с помощью команды MessageBox. MessageBox - это тоже функция. Мы ее вызываем, подсовывая (передавая) ей некоторые значения (тексты) и параметры-флаги. Эта функция рисует на экране окно сообщения. Когда мы нажимаем на кнопку в этом сообщении - именно в этот момент функция считается полностью выполненной - и ВОЗВРАЩАЕТ вызвавшей ее программе какое-то значение. Что она может возвращать? Вспомним,что мы рассматривали возможные варианты сообщений - с тремя кнопками. Так вот, значение, которое вернет функция MessageBox, будет зависеть от того, на какую кнопку мы (пользователь программы) нажмем.

Давайте научим нашу программу понимать, на какую кнопку в сообщении мы нажали. Заодно и познакомимся с оператором "если" - "if". Введем в наше обычное место в файле "2000dlgc.cpp" следующие строки:


void T2000DlgClient::BNClickedOne() { // INSERT>> Your code here. if ( (MessageBox("Вы нажали на кнопку\nСпасибо Вам за это!", "Наше сообщение", MB_YESNO | MB_ICONINFORMATION) ) == IDYES) { MessageBox("А теперь Вы нажали\nна кнопку YES/ДА", "Наше второе сообщение", MB_ОК | MB_ICONWARNING); } else

{ MessageBox("А теперь Вы нажали\nна кнопку NO/НЕТ", "Наше второе сообщение", MB_ОК | MB_ICONSTOP); } }

Обратите внимание, что в нашем первом сообщении мы указали флаг MB_YESNO вместо MB_ОК - в результате мы получим окно сообщения с двумя кнопками - "ДА" и "НЕТ". Далее - в принципе, мы могли бы добавить в программу новую переменную, потом присваивать ей значение, возвращаемое функцией MessageBox - точно так же, как мы действуем с функцией "синус"; а потом мы сравнили бы эту переменную с IDYES и т.д. Но зачем нам лишние переменные? Мы сразу сравниваем функцию MessageBox (а точнее - значение, ею возвращаемое) с интересующим нас значением, а именно IDYES. Вот в этой части -

if ( (MessageBox(...) ) == IDYES)

и происходит сравнение. Знак "==" - это логический оператор "равно". Я сам до сих пор, когда пишу программы, путаю его с оператором присвоения - одиночным знаком "=". Ошибка страшная - поскольку с точки зрения языка это все допустимо - и компилляция не выдает ошибки - а программа работает не так, как задумано.

Но вернемся к нашей программе. Уточним теперь синтаксис оператора "если":

if ( условие ) { действие, выполняемое, если условие истинно } else

{ действие, выполняемое, если условие ложно }

Второй части может и не быть, т.е. оператор может выглядеть следующим образом:

if ( условие ) { действие, выполняемое, если условие истинно }

Это пишется в случае, когда мы делаем что-то лишь в случае истинности условия, а в случае невыполнения условия мы не делаем никаких действий.

В нашем примере программа будет работать следующим образом: Дойдя до строки с оператором "если", она полезет внутрь - к условию сравнения. Там она выяснит, что в одной из частей, подлежащих сравнению, должно стоять значение, возвращаемое функцией MessageBox. Программе "придется" вызвать эту функцию, в результате чего мы увидим на экране наше сообщение с двумя кнопками - см.рис.4.1.





Рисунок 4.1. Сообщение с двумя кнопками.

Затем программа будет ждать, пока мы не нажмем одну из кнопок. Как только мы это сделаем, функция MessageBox вернет программе одно из двух значений - IDYES, если мы нажали кнопку YES, или IDNO, если мы нажали кнопку NO. Программа возьмет это значение и проверит, не равно ли оно второй части условия - а там мы записали IDYES. Если равно - значит, условие истинно - и программа выполнит то, что написано в первых фигурных скобках - т.е. снова вызовет функцию MessageBox, но уже с другими параметрами - и появится сообщение о том, что мы нажали кнопку ДА. Если же условие окажется ложным, то программа выполнит то, что написано в фигурных скобках после слова "иначе" ("else") - и появится сообщение о нажатии нами кнопки НЕТ.



Галявов И.Р. e-mail:


Немного развлечемся.


Начинается демонстрация нового компьютера, управляемого

голосом. Изобретатель просит зал соблюдать тишину. Только

он открывает рот - из зала крик:

- FORMAT C:!!! ENTER!!!

На тему форматирования диска С существует огромное количество шуток. Давайте напишем программу, которая будет представлять собой одну из них. Идея - не моя; где-то когда-то я услышал ее. Выглядеть конечный результат будет примерно так - пользователь запускает нашу программу - нажимает на ней кнопку - и программа делает вид, что форматирует диск С:, не реагируя при этом на судорожные движения пользователя. Естественно, при создании шутки мы изучим новые элементы С++, а именно - текстовые поля, вывод в них текста, создание индикатора и его изменение с течением времени, а следовательно, и один из способов создания таймера. Также мы научимся изменять внешний вид курсора - на известные всем "часики". Поговорим мы также о типах переменных и познакомимся с оператором цикла.

Итак, вернемся к нашему проекту - "2000.ide". Зайдем в редактор ресурсов, щелкнув на файле "2000app.rc", и откроем окно редактирования нашей картинки "IDD_CLIENT (2000)". Перетащим нашу кнопку на самый верх окна программы. Затем на панели "Controls" щелкнем на кнопке с большой буквой "А" и нарисуем на нашей программе прямоугольник под кнопкой - см.рис.5.1.

Рисунок 5.1. Создание элемента статического текста.

Если Вы уже прочитали подпись под рисунком 5.1, то поняли, что этот элемент называется "статическим текстом". По смыслу названия - это текст, который не изменяется, в отличие от редактируемого текста. И используется обычно статический текст для надписей, которые существуют на программе все время. Но изменить его не может пользователь, запускающий программу, а мы - изнутри программы - в принципе, можем менять этот текст. Чем мы и займемся. Но сначала, зайдя в "Properties" этого элемента (напоминаю в последний раз - щелкнув на нем правой кнопкой и выбрав соответствующий пункт в появившемся меню), удалим слово "Text1" - у нас сначала в этом элементе ничего не будет.

Теперь для того, чтобы легко заставлять программу писать на этом месте разные хорошие слова, поставим в соответствие этому элементу некую переменную. Для этого, вызвав правой кнопкой меню, выберем уже известный нам "ClassExpert". Выделенным окажется пункт IDC_STATICTEXT; щелкнем на нем правой кнопкой - появится маленькое меню - в нем нас интересует пункт "Add instance variable" - "добавить переменную" - см.рис.5.2.




Рисунок 5.2. Связь статического текста с переменной.

В качестве имени переменной возьмем, например, "mytext1" - см.рис.5.3.



Рисунок 5.3. Присвоение имени переменной.

Вернемся в редактор ресурсов и выберем в панели "Controls" ярлычок "Common". Нажмем на кнопке.



Это - "индикатор процесса" - ну, вы, наверное, понимаете по названию и по картинке на кнопке, о чем идет речь. Создадим прямоугольничек на нашей программе сразу под текстовым элементом - см.рис.5.4.



Рисунок 5.4. Создание индикатора процесса.

Кстати, наш статический текст будет сейчас "невидим" - поскольку в нем сейчас ничего нет. Вызовем для индикатора "ClassExpert" и присвоим нашему новому элементу IDC_PROGRESSBAR1 переменную "bar1". Закроем "ClassExpert" и редактор ресурсов и вернемся в наш проект.

Задачка для самостоятельного решения - найдите все изменения, которые "ClassExpert" внес в файлы проекта. Попробуйте сами, а потом переходите на следующую страницу и прочитайте правильный ответ.

Галявов И.Р. e-mail:

|