Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теллес М. - Borland C++ Builder. Библиотека программиста - 1998

.pdf
Скачиваний:
764
Добавлен:
13.08.2013
Размер:
4.35 Mб
Скачать

Borland C++ Builder (+CD). Библиотека программиста 11

бросить), основанного на компонентах. Трудно переоценить влияние, которое приобрел этот стиль программирования под Windows в последние несколько лет. Изначально программирование под Windows было полным ошибок кошмаром, включавшим в себя редактирование текстов под MSDOS, компиляцию, компоновку и использование SDK (Software Development Kit, прикладной пакет разработки). Неудивительно поэтому, что первые программы под Windows были полны ошибок и требовали годы на разработку. Современные программы пишутся за недели вместо лет (и по-прежнему полны ошибок, но это отдельный разговор). CBuilder, как вы узнаете из этой книги, поможет разрабатывать приложения не только быстрее, но и с меньшим количеством ошибок.

Первой ступенью эволюции программирования под Windows стало появление языка программирования C++ и библиотек классов C++, которые заключали в себе сотни строк кода, необходимых даже для простейшего отображения окна на экране, и представлялись в программе на C++ всего несколькими строчками. Этот код попросту заключает несколько сот строк кода на С в классы С++. Теперь мы не только избавлены от необходимости писать эти сотни строк, но и количество ошибок в коде, заключенном в классах С++, уменьшается фантастическим образом. В конце концов, после того, как код единожды написан и отлажен, его не надо переписывать заново. Код, который не переписывался, вряд ли станет источником новых ошибок. Запомните этот момент в дальнейшем он станет очень важен!

Вторым поколением средств разработки для Windows стало появление средств интегрированной среды разработки (Integrated Development Environment, IDE). Эти средства позволяют программисту редактировать, компилировать и компоновать программы непосредственно в одном приложении. Интегрированные средства отладки появились чуть позже и были быстро взяты на вооружение программистами. Трудно объяснить вам, насколько эти новые средства были великолепны, если вы никогда не писали программы под Windows, используя раздельные специализированные средства. Если у вас есть знакомые, которые занимались этим в старые добрые времена (скажем, до 1990 года), спросите у них, и я уверен, что они с радостью поведают вам, насколько это было ужасно (даже если опустить подробности о прогулках под дождем в другое здание, чтобы откомпилировать там программу).

Следующий шаг эволюции средств разработки стал результатом развития концепции каркасов (framework). Каркас это основа, скелет вашего приложения, который объединяет в себе все части Вашего приложения. Каркасы кода действительно очень похожи на стены, балки, водопровод и электрические коммуникации строительных каркасов зданий. В ретроспективе, концепция каркасов кода, пожалуй, была шагом назад или скорее в сторону, хотя многие с этим не согласны и остаются верными приверженцами средств программирования, поддерживающих данную концепцию. Опять же, до сих пор найдется немало людей, утверждающих, что MS-DOSвполне жизнеспособная операционная система. Причина, по которой мы считаем каркасы шагом назад, проста. Вместо того, чтобы сделать программирование более простым и гибким, каркасы вынуждают нас писать программы по заранее определенным жестким правилам.

Настоящей проблемой технологии каркасов является их ограничения. Несмотря на то, что каркасы действительно ускоряют разработку приложений, предоставляя в распоряжение разработчика многие из основных функций нормального Windows - приложения, они сразу же встают на пути приложения, которое не укладывается в привычные рамки. Если вы когда-нибудь пытались сделать что-то, что каркас не предоставляет (или хуже того, делает не так, как вам бы хотелось), вы меня, конечно, поймете. Как только вы пытаетесь сделать что-то нетривиальное, каркас тут же становится похож на модные красивые ботинки, которые жмут.

Замечание

Если вы не верите в проблемы, возникающие при использовании средств разработки, использующих каркасы, примите во внимание следующее: фирма Microsoft практически отказалась от усовершенствования своей библиотеки классов — MFC в пользу новых технологий ActiveX и COM (которые основаны на компонентах). Мне кажется, что все технологии, основанные на каркасах (MFC, OWL и другие), исчезнут в не очень отдаленном будущем.

Borland C++ Builder (+CD). Библиотека программиста 12

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

В CBuilder работа с компонентами организована очень хорошо. Просто и понятно. Как и большинство хороших программ, CBuilder работает просто и последовательно, во многом благодаря тому, что сам построен на компонентах. Каждая часть системы выполняет свою функцию и делает это настолько просто и легко, насколько возможно. Компоненты настолько близки к «чистому» программированию на C++, насколько вы только можете пожелать и существенно облегчают весь процесс разработки. Вот главная черта CBuilder: это первый по- настоящему основанный на компонентах инструмент RAD.

Подождите, это еще не все

Есть еще один аспект CBuilder, на который многие программисты не обращают внимания в усердных попытках освоить мир визуальных форм CBuilder. Не слишком глубоко в системе CBuilder зашита невероятно мощная и чрезвычайно гибкая среда программирования баз данных. CBuilder является по существу первой системой программирования баз данных для C++.

Во многих системах разработки приложений на C++ интерфейс с базами данных часто выглядит

как запоздалая идея сделать некоторые фрагменты баз данных доступными программисту в виде жестко навязанного узкого круга объектов. Интерфейс с базами данных во многих системах C++ состоит из набора объектов, которые являются лишь тонкими обложками, скрывающими под собой низкоуровневые функции баз данных. Вовсе не является необычным для объектов баз данных содержать в себе методы, требующие десятков параметров для открытия и инициализации присоединения к базе данных ODBC (Open Database Connectivity, базы данных с открытой связью). Сравните это с полным набором drag-and-drop компонентов баз данных, встроенным в систему CBuilder. CBuilder содержит полный набор управляющих элементов для работы с данными (data-aware controls), которые вообще не требуют программирования. Можно написать вполне законченный редактор баз данных, который бы добавлял новые , редактировал существующие и удалял ненужные записи, не написав ни единой строчки кода на C++. Попробуйте-ка написать такое на Visual Basic или Visual C++.

В конце концов, CBuilder может стать известен за то, что вы можете проделывать с базами данных, таблицами и запросами SQL (Structured Query Language, язык структурированных запросов) более, чем за возможности работы с формами и другими визуальными компонентами системы.

Итак что же такое CBuilder? Это законченный, гибкий инструмент RAD, предоставляющий высочайшие возможности в работе с базами данных, основанная на компонентах технология, простота использования и мощное средство разработки. О да. Он содержит превосходный компилятор стандарта ANSI C++, при полной поддержке таких новых технологий, как шаблоны (templates), именованные области видимости (namespaces), обработка исключительных ситуаций

(exception handling), и библиотека стандартных шаблонов (Standard Template Library, STL).

Почему стоит прочесть эту книгу?

Есть вероятность, что это не первая книга о CBuilder, попавшая вам в руки. На данный момент все книги о CBuilder четко разделяются по предназначению на две группы. Первая группа адресована своей естественной аудитории опытным программистам на Delphi, решившим переключиться на CBuilder, поскольку CBuilder на самом деле и есть Delphi, но использующий язык C++ вместо Object Pascal (хотя я подозреваю, что большинство из тех, кто пришел к использованию CBuilder,

Borland C++ Builder (+CD). Библиотека программиста 13

вовсе не знакомы с Delphi). Как я упомянул, CBuilder — это просто Delphi с другим языком программирования. Зачем переключаться? Наверняка существует часть программистского сообщества, которая использует Delphi из-за его выдающихся компонентов, хотя ненавидит при этом Object Pascal. Я надеюсь, тем не менее, что вы не принадлежите к их числу. Если все-таки да, не беспокойтесь, для вас здесь тоже найдется много интересного.

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

Таким образом, эта книга состоит из блоков. Если хотите, можете читать подряд, а можете просто обратиться к нужной главе и утащить оттуда программу, которая нужна вам для работы. Да-да, я и сам так делал и собираюсь делать так и впредь. Я конечно прощу вас.

Какие вопросы мы собираемся рассмотреть?

Вот краткий список тем, которые вы найдете в книге:

Использование VCL

Использование компонентов ActiveX

Расширенные формы

Написание компонентов

Создание приложений баз данных

Написание комплексных программ на C++

В дополнении ко всем примерам этой книги (содержащихся также на прилагаемом компакт- диске создать полновесный CBuilder — мастер, который позволит вам создавать комплексные компоненты быстро и просто. Наконец, в конце книги вы найдете полный список FAQ (Frequently Asked Questions, наиболее часто задаваемые вопросы) по C++ Builder, собранный из обращений сотен людей через Internet. Этот удобный список вопросов и ответов определенно станет наиболее читаемым местом книги, когда вы начнете разрабатывать собственные комплексные приложения.

Что вы должны знать, перед тем как читать эту книгу

Во-первых, вы должны знать язык C++. Эта книга не учебник по C++ для начинающих; есть множество книг, которые подходят для этой цели лучше, чем эта. Эта книга разъяснит различия между стандартом ANSI C++ и версией, используемой в CBuilder. Как вы увидите далее, эти различия сводятся, в основном, к расширениям, используемым CBuilder. Насколько хорошо вы должны знать C++? На самом деле, не так уж и глубоко. Если следующее описание класса C++ не испугает вас, во всей оставшейся книге вы будете чувствовать себя уверенно. Что-нибудь более сложное, чем это, будет объяснено в тексте.

class TMyObject : public TObject

{

private:

int FnDigit; char *FpString; Foo *FpFoo; public:

TMyObject(void);

Borland C++ Builder (+CD). Библиотека программиста 14

TMyObject( const TMyObject& aObject); virtual ~TMyObject(void);

void DoSomething(void); last>};

В дополнении к умению программировать на С++, для чтения этой книги вам также поможет наличие опыта создания собственных приложений в среде C++ Builder или Delphi. Такой опыт позволяет привыкнуть к среде разработки и режимам работы компилятора и линковщика. Просто читая эту книгу и выполняя примеры программ, даже новичок узнает достаточно много о модели программирования CBuilder, о VCL и о внутренних режимах работы системы.

Наконец, по меньшей мере не повредит иметь некоторое представление о программировании в среде Windows. Хотя такие продукты, как CBuilder и Delphi, позволяют даже рядовому менеджеру довольно просто создавать серьезные приложения (ну, может, не совсем рядовому), все-таки необходимо понимать принципы программирования в среде Windows для того, чтобы выполнить некоторые задачи. Мы даже посвятим целую главу работе с Windows API (Application Programming Interface, программный интерфейс разработки), чтобы расширить модель программирования CBuilder. Даже вечно ворчащие программисты низкого уровня, которые усмехаются при мысли о визуальной среде разработки, останутся довольны.

Для кого предназначена эта книга?

Эта книга, в основном, для опытных и профессиональных программистов, которые хотели бы побольше узнать о внутренних особенностях системы CBuilder и о том, как заставить их работать. Начинающие программисты будут учиться на примерах, приведенных в книге, но, скорей всего, им потребуется не раз обратиться к одним и тем же страницам, чтобы до конца разобраться во всех преимуществах каждого примера.

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

Несмотря на то, что при помощи этой книги вы пройдете весь путь создания полновесных компонентов, она не имеет свой целью стать руководством по созданию компонентов CBuilder. Если вы всерьез заинтересованы написанием компонентов, в дополнение к этой книге найдите еще одну, специально предназначенную для этой цели.

Что дальше?

Эта книга состоит из трех больших частей. В первой части на основе коротких примеров программ мы рассмотрим различные элементы среды и системы программирования CBuilder. В большинстве случаев, эти примеры иллюстрируют только один два основных момента программирования на CBuilder. В других примерах мы рассмотрим более сложные аспекты системы. Попутно мы будем делать отступления для изучения наиболее интересных как? и почему? системы CBuilder. Вот некоторые из вопросов, которые мы рассмотрим в первой части: рисование форм, обработка изображений, drag-and-drop взаимодействие компонентов, ручная прорисовка управляющих элементов, библиотека стандартных шаблонов, базы данных и управление ActiveX. Неплохо для одной маленькой части, а? Как вы уже, наверное, догадались, первая часть сама по себе является самым объемным куском книги.

Вторая часть описывает полномасштабную разработку приложений от первичного проектирования до окончательной реализации с использованием VCL и множества ее компонентов. В этой части мы создадим законченный Мастер компонентов (Component Wizard),

Borland C++ Builder (+CD). Библиотека программиста 15

который позволит вам определять не только базовый класс компонента (как один из имеющихся в комплекте поставки CBuilder), но и позволит вам определять новые методы и свойства (а также объявлять существующие в базовом классе компонента как published («опубликованные»). После освоения второй части вы будете знать все, что стоит знать об элементах, составляющих систему CBuilder. Вы узнаете, как создавать расширения, управляющие многими элементами CBuilder IDE (Integrated Development Environment, интегрированная среда разработки), включая добавление новых файлов в проект, создание исполняемого кода и загрузку файлов.

Третья часть содержит список CBuilder FAQ с десятками вопросов и ответов о CBuilder. Список вопросов упорядочен по темам (общие вопросы программирования, компоненты, базы данных, VCL) и разбит на одиночные вопросы по данной теме. Также в третьей части можно найти список других источников информации о CBuilder, от базы знаний фирмы Borland до специализированных Web — сайтов в Internet, посвященных CBuilder.

Кратко говоря, перед вами книга для программистов, написанная программистом. По своему горькому опыту я знаю, каким тормозом в работе может обернуться покупка книги, которая призвана помочь разрешить проблемы, но на самом деле оказывается лишь отголоском диалоговой системы помощи. Моя книга занимается проблемами, с которыми я сталкивался при попытках написать настоящие приложения на CBuilder для настоящих заказчиков. Я надеюсь, что здесь вы найдете ответы на вопросы, которые сводят вас с ума. Так чего же вы ждете, переворачивайте страницу и начнем, пожалуй.

Глава 2 Формы и события

Форма это наиболее существенный самостоятельный компонент системы CBuilder. Это тот объект, с которым, скорее всего, будет взаимодействовать пользователь.

В большинстве примеров программ на CBuilder форма используется как вместилище для других компонентов. В этой главе мы рассмотрим форму как собственно компонент. Что такое форма? Конечно, это просто окно. Как и все окна, она может иметь дочерние управляющие элементы, такие как панели задач, меню и панели состояния. Формы, как и окна, имеют собственные определенные уникальные свойства, такие как заголовки, системные меню, кнопки минимизации и максимизации, закрывающие кнопки, рамку изменяемого (или не изменяемого) размера и другие изящные штучки. Давайте прервемся на минуту и взглянем на форму и те ее части, которые CBuilder позволит нам изменять.

На рис. 2.1 показана типичная пустая форма CBuilder, которую вы увидите сразу же, как откроете новое приложение. Давайте поближе познакомимся с ее составляющими.

Первое свойство, которое сразу же бросается в глаза, это название формы (Form1), отображаемое на панели заголовка. Это свойство называется Caption (заголовок ). Свойство Caption может быть напрямую изменено в инспекторе объектов (Object Inspector) CBuilder во время проектирования или же посредством кода во время исполнения. Изменение свойства Caption немедленно обновит заголовок формы как во время проектирования, так и во время исполнения, за одним исключением: вы не сможете убрать заголовок вообще, присвоив свойству Caption формы пустую строку ("").

Borland C++ Builder (+CD). Библиотека программиста 16

Рис. 2.1. Стандартная пустая форма CBuilder

Вот вам первая неординарная проблема в CBuilder: как создать форму без заголовка и панели заголовка. На первый взгляд непонятно, как можно убрать заголовок и панель заголовка из формы CBuilder, но это можно сделать при помощи толики магии Windows и знания Windows API (Application Programming Interface, интерфейс программирования приложений). Поскольку форма

это просто окно, вы можете изменить его изначальные свойства еще до его создания. Если вы измените бит состояния окна так, чтобы включить флаг WS_POPUP и удалить флаг WS_CAPTION, вы создадите-таки окно без панели заголовка. В результате у вас получится окно без системного меню, кнопок максимизации или минимизации и кнопки закрытия. По такому случаю предусмотрите какой-нибудь вариант закрытия этого окна.

Давайте немного поэкспериментируем и создадим такую форму. Вы можете найти полную версию такой программы на прилагаемом компакт-диске в каталоге Chapter1\Captionless. После того как вы вволю наиграетесь со свойством Caption, давайте обратимся к следующему свойству Border (рамка), которое позволяет вам контролировать, изменяется размер окна или нет. Для свойства Border есть несколько вариантов, но вам, скорее всего, в основном придется иметь дело с двумя из них изменяемый размер окна (bsSizeable) и фиксированный, как у диалоговых, размер окна (bsDialog). Потратьте пару минут на изменение стиля рамки с одного на другой и скомпилируйте получившиеся приложения. Вы заметите, что два эти типа рамки различаются на экране. На рис. 2.2 показана типичная форма с изменяемым размером, а на рис. 2.3 — форма с неизменяемым размером (форма диалогового типа). Теперь вам должно стать понятно, что название свойства «рамка» взято не случайно рамка окна похожа на раму картины.

Рис. 2.2. Форма с изменяемым размером

Borland C++ Builder (+CD). Библиотека программиста 17

Рис. 2.3. Форма диалогового типа с неизменяемым размером

Третье свойство, которое мы рассмотрим, это на самом деле множество свойств. Свойство BorderIcons (кнопки панели заголовка) состоит из множества кнопок (значков), которые могут располагаться на панели заголовка формы. Это свойство представлено множеством языка C++, содержащим параметры для кнопки минимизации, максимизации, закрытия и системного меню. Вы можете включать или исключать любую (или все) из перечисленных выше кнопок, просто устанавливая соответству ющий параметр в True (истинно) или False (ложно) в инспекторе объектов или добавляя соответствующие строки в программу.

Замечание

Изменения, которые вы будете производить над этими свойствами, не будут отражаться во время проектирования приложения . Форма, отображаемая редактором форм, уже определена в момент своего создания. Изменения, которые вы произвели, будут отражены тотчас же, как только форма впервые будет выведена на экран вашим приложением. Чтобы рассмотреть, как это происходит, измените форму так, чтобы отменить кнопки минимизации и максимизации, и вы увидите, что форма не изменилась в окне редактора форм. Скомпилируйте и запустите приложение и убедитесь, что получившаяся форма действительно не имеет ни кнопки максимизации, ни кнопки минимизации окна.

Другое, чуть менее понятное свойство формы это Color (цвет), которое мы рассмотрим в следующем эксперименте. Используя базовую форму, отображенную в редакторе форм CBuilder, измените ее свойство Color на что-нибудь типа clRed (красный). Благодаря этому изменению отображаемая форма должна будет иметь ярко-красный фон после запуска программы. Теперь скомпилируйте и запустите приложения и взгляните на экран. Вот так сюрприз! Форма вовсе не красная, она своего стандартного военно-морского шарового цвета. Почему? Это, к сожалению, ошибка системы (!). Но, к счастью, эту отдельно взятую ошибку нетрудно побороть. Добавьте обработчик события OnFormCreate и в него добавьте следующие строки:

void __fastcall TForm1::OnFormCreate()

{

Color = clRed;

}

Достаточно странно, но изменение свойства Color в методе OnFormCreate работает корректно, и форма теперь будет изображаться с красным фоном.

Borland C++ Builder (+CD). Библиотека программиста 18

Хорошая вещь каракули!

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

Наш первый серьезный пример в этой книге касается свойства Canvas. Поскольку Windows задумывались в основном для увеличения графических возможностей, вполне логично, что наш первый пример будет о работе с графикой. В те старые добрые времена, когда Visual C++ только- только появилась, фирма Microsoft выбрала в качестве обучающей работе с системой программирования Visual C++ программу Scribble (каракули). Это была не связанная с формами программа, которая использовала мышь для перемещения по пространству окна, отрисовывая при этом линии, соединяющие между собой все точки, через которые прошла мышь.

«Каракули» стали шуткой для посвященных в программистской среде, поскольку сущность этого примера была крайне примитивной. Многие программисты отправлялись на собеседования, где требовалось наличие опыта программирования в Visual C++ и MFC (Microsoft Foundation Classes, библиотека оконных классов фирмы Microsoft), хотя, на самом деле, все, что они имели за плечами, — это знакомство с обучающей программой Scribble. Реализация программы Scribble занимала всего несколько страниц и требовала от программиста лишь умения читать и писать по- английски. Этот пример ничего не раскрывал в MFC и, соответственно, ничего не мог дать тем, кто хотел бы приложить свое знание MFC к написанию полезных программ. Как мягкий укол сообществу MFC, мы представляем CBuilder-версию программы Scribble. Если говорить чуть серьезнее, Scribble — хороший материал для простого примера, так как в нем осуществляется взаимодействие со всеми элементами формы: свойствами, событиями и методами. Давайте создадим простую версию Scribble для CBuilder.

Scribble: разработка

Назначение Scribble крайне просто. Когда пользователь нажимает кнопку мыши, программа начинает рисование. По мере того как мышь передвигается по экрану, программа соединяет точки, через которые прошла мышь, образуя линии. Этот процесс позволяет пользователю «рисовать» простые (а может, и не простые) фигуры на экране. На рис. 2.4 показан результат работы программы Scribble — улыбающаяся рожица.

Рис. 2.4. Окно программы Scribble с улыбающейся рожицей

Borland C++ Builder (+CD). Библиотека программиста 19

Замечание

Вы найдете исходный текст программы Scribble в каталоге Chapter1\Scribble1 прилагаемого к книге компакт-диска.

В предисловии к книге я говорил, что было бы весьма полезным наличие опыта программирования под Windows для работы с приведенными в книге примерами, и сейчас как раз тот самый случай, когда такой опыт мог бы помочь лучше разобраться в системе сообщений (messages) Windows. Процессы, происходящие в данном случае, достаточно просты. Когда пользователь нажимает на кнопку мыши и начинает двигать мышь, мы рисуем линии, соединяющие точки. Что куда меньше понятно новичкам, так это то, как мы это делаем. Если вы опытный программист под Windows, то вы наверняка определите, что при нажатии на левую кнопку мыши пользователем Windows сгенерирует сообщение WM_LBUTTONDOWN, адресованное нашему окну. Когда пользователь перемещает мышь, Windows генерирует сообщение WM_MOUSEMOVE. Наконец, когда пользователь отпускает левую кнопку мыши, Windows генерирует сообщение WM_LBUTTONUP. Вопрос в следующем: как теперь эта информация обрабатывается средой CBuilder?

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

CBuilder вызывают три обработчика событий OnMouseDown, OnMouseMove и OnMouseUp.

Замечание

Если вы программист, работавший на Visual C++ или Borland C++, то понятие обработчика событий может показаться вам немного странным. Обе эти среды используют одну и ту же концепцию, но подходят к ее осуществлению с разных сторон. И в Visual C++, и в Borland С++ карта сообщений определяет сообщение и метод класса, используемый для обработки этого сообщения. В CBuilder (и, конечно же, в Delphi) содержимое объектов само определяет, какие сообщения обрабатываются, и вызывает обработчики событий, определенные программистом. Различие состоит в том, что обработчики событий CBuilder, как мы увидим чуть позже, динамические, в то время как обработчики сообщений Visual C++ и Borland C++ определяются во время компиляции. В обоих случаях для исполнения используются методы объектов, но CBuilder применяет метод чуть более простой и гораздо более мощный.

Теперь давайте слегка напряжемся и добавим к нашей форме несколько обработчиков, чтобы приложение Scribble наконец заработало как должно. Сначала добавим обработчик для события OnMouseDown. Поскольку это наш первый пример, я проведу вас через весь процесс его создания на случай, если вы не помните, как это делается. В дальнейшем я буду рассчитывать на то, что вы знаете что и как делать, и буду просто сообщать, какой обработчик добавить.

Если окно инспектора объектов закрыто, откройте его, нажав кнопку F11 или выбрав пункт меню View Object Inspector. Выберите форму, щелкнув на ней мышью или выбрав ее из выпадающего комбинированного списка в верхней части инспектора объектов. Перейдите на страницу events (события) и в левой части инспектора объектов найдите событие OnMouseDown. Все события перечислены в алфавитном порядке, поэтому у вас не должно возникнуть проблем с поиском нужного. Щелкните в правую часть сетки инспектора объектов напротив события

OnMouseDown и наберите там OnMouseDown это будет названием нового обработчика событий. Если вас смущает, что мы теперь имеем обработчик события с тем же именем, что и обрабатываемое им событие, то несколько позже в этой главе мы увидим, как изменить эту ситуацию. Нажмите клавишу Enter, чтобы подтвердить сделанные изменения.

Borland C++ Builder (+CD). Библиотека программиста 20

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

void __fastcall TForm1::OnMouseDown(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, int Y)

{

FbMouseDown = TRUE;

Canvas->MoveTo(X,Y);

}

Флаг FbMouseDown, показанный в предыдущем коде, должен быть добавлен в заголовочный файл (Unit1.h) и инициализирован в конструкторе. Этот флаг сигнализирует, нажата (TRUE) или нет (FALSE) кнопка мыши в окне. Ниже приведены изменения, которые надлежит произвести в заголовочном файле (показаны подсветкой):

//----------------------------------------------

#ifndef Unit1.h #define Unit1.h

//----------------------------------------------

#include <vcl\Classes.hpp> #include <vcl\Controls.hpp> #include <vcl\StdCtrl.hpp> #include <vcl\Forms.hpp>

//----------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

void __fastcall OnMouseDown(TObject *Sender, TMouseButton Button,

TShiftState Shift, int X, intY); private: // User declarations BOOL FbMouseDown; public: // User declarations

__fastcall TForm1(TComponent* Owner); }; //-----------------------------------------------

extern TForm1 *Form1; //-----------------------------------------------

#endif

И вот, наконец, изменения, которые надо произвести в конструкторе класса (в исходном файле Unit1.cpp):

__fastcall TForm1::TForm1(TComponent* Owner) :TForm(Owner)

{

FbMouseDown = FALSE; // Установка флага нажатия // кнопки мыши в "Ложь"

}

Давайте, перед там как двигаться дальше, взглянем на то, что у нас получилось. У класса TForm1 теперь есть private (частная) переменная, определенная программистом FbMouseDown,

Соседние файлы в предмете Программирование на C++