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

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

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

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

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

Содержание От переводчиков Предисловие

Глава1•Обзор

Что такое C++ Builder?

Подождите, это еще не все Почему стоит прочесть эту книгу?

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

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

Что дальше?

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

Хорошая вещь каракули! Scribble: разработка

Взглянем на файл описания формы (DFM)

Собственно рисование Scribble, часть вторая

Копируем проект К высоким материям

Scribble, третья попытка Переключение обработчиков «на ходу»

Великое изменениепереход к многодокументным формам В чем различие?

Проводим преобразования Формы до создания Извечная проблема Последний шаг Что мы узнали в этой главе?

Глава3•Работа с изображениями

Пример номер один: игра Match Game

Устанавливаем заголовки кнопок Проверка на совпадение Как это все работает?

Совершенствуем игру Match Game Как это все работает?

Пример номер два: крестики-нолики. Шаг первый: создаем изображения Жизнь и приключения объекта TBitmap

Обработка щелчков мыши Запускаем игру Что мы узнали в этой главе?

Глава4•Компоненты и обработчики событий компонентов

Краткий обзор с точки зрения программиста Динамические компоненты, часть первая

Создаем поле ввода Добавление статического текста Добавление кнопки

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

Динамические компоненты, часть вторая

Создание полоски прогресса Увеличение счетчика прогресса Удаление полоски прогресса Последний штрих

Проверка корректности данных в поле ввода Проверка данных после ввода Волоки, пока не уронишь

Реализация drag-and-drop в списках Как узнать, когда начало?

Списки с drag-and-drop, часть вторая >Карты сообщений и CBuilder

Реализация карт сообщений Прорисовка формы

Добавляем обработчик вертикальной прокрутки Обработка горизонтальной прокрутки Создание списка, прорисовываемого его владельцем

Понятие о списках, прорисовываемых владельцем

Реализация примера Модификация заголовочного файла Реализация меню в форме

Зачем нам нужно переустанавливать элементы списка?

Обработка измерения элемента Рисуем элементы Уточняем детали Исследуем странички

Отображение страничного диалога События в страничных диалогах Что здесь происходит?

Проверка разрешения на перемещение Блокирование закладки Сами рисуем свое меню

Имеем дело с Windows API

Отображение элементов меню Изменение состояния во время исполнения Время в панели состояния.

Что мы узнали в этой главе?

Глава5•Библиотека стандартных шаблонов

Что такое библиотека стандартных шаблонов? Зачем нужна библиотека стандартных шаблонов? Классы STL: с самого начала

Работа с векторами (массивами)

Пример программы замены строк Работа со связными списками Итератор Работа с таблицами

Зачем нужны таблицы?

Всемогущее множество Небольшое отступление: С++ и именованные области видимости Оператор using

Стеки и очереди

Объединяя все вместе: Scribble версии 2

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

Исправляем родительское окно Что мы узнали в этой главе?

Глава6•Работа с ActiveX

ActiveX и CBuilder Professional

Страница ActiveX в палитре компонентов

Добавление собственных управляющих элементов ActiveX Обзор файлов, сгенерированных для элементов ActiveX Несколько слов об ActiveX

Использование управляющих элементов ActiveX

Динамическое создание управляющих элементов Конкретный пример: броузер HTML

Что мы узнали в этой главе?

Глава7•Работа сбазами данных

Разбираемся во внутреннем устройстве базданных Пример программы просмотра полей базы данных Создаем пример программы просмотра полей Что же здесь происходит?

Создание базы данных на пустом месте Добавляем поля в таблицу Защищаем пользователя Создаем базу данных Обработка событий базы данных Отслеживаем изменения Проверка данных Я хочу сделать это сам!

Обобщенная программа просмотра баз данных Просмотр нескольких таблиц Как это работает?

Использование источников ODBC с объектами баз данных CBuilder Что мы узнали в этой главе?

Глава8•Антракт: инструменты CBuilder

Работа с компилятором из командной строки Простой пример Компилятор ресурсов

Использование программы Implib

Работа с IDEToMak

Использование препроцессора Что такое Grep?

Использование Grep для поиска файлов

Роемся в библиотеке Программа tdump

Что такое Trigraph?

Обзор BDE Конфигуратор BDE

Программа Database Desktop

Database Explorer (проводник баз данных)

Что мы узнали в этой главе?

Глава9•Работа с Windows API

Поиск нужной функции API

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

Приложение OnlyOnce

Запрет запуска второй копии Перетаскивание файлов Обработка притащенных файлов

Более сложный пример: просмотр атрибутов файлов

Определение состояния файла Круглооконная форма Реализация круглой кнопки Что мы узнали в этой главе?

Глава10•Работа сресурсами

Зачем нужны ресурсы?

Строковые ресурсы Построение строковой библиотеки

Пример динамической загрузки строк Загрузка динамических меню Динамическая загрузка меню Удаление пунктов меню Кое-что о файлах ресурсов

Работа с компилятором ресурсов

Работа с динамически связываемыми библиотеками (DLL)

Создание DLL в CBuilder

Создание формы для динамической загрузки DLL Что мы узнали в этой главе?

Глава11•Работа с Delphi

Все новое это хорошо забытое старое Использование форм Delphi

Строим форму CBuilder

Добавление формы Delphi в наше приложение Использование функций Delphi в приложениях CBuilder Что мы узнали в этой главе?

Глава12•Использование CBuilder в MFC

Использование CBuilder в приложениях MFC

Пример: из CBuilder в MFC

Создание оберточной функции Создание файла DEF

Создание библиотеки импорта Приложение MFC

Вызов функции для отображения формы Взаимодействие Visual C++ и формы CBuilder Приложение Visual C++

Последний пример: работа с базами данных

Создание формы выбора записей Что мы узнали в этой главе?

Глава13•Работа с потоками

Зачем нужны потоки?

Простой пример потока Добавление нового потока Работа с потоками в форме Программа поиска в потоке

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

Построение главной формы Создание потока для поиска Дизайн приложения с потоками Что мы узнали в этой главе?

Глава14•Создание новых компонентов

Процесс разработки компонентов Процесс разработки компонентов в деталях Инсталляция компонента Выбор свойств Воплощение нового компонента

Добавление родительских свойств Добавление новых свойств Отрисовка управляющего элемента Тестирование компонента

Инсталляция и повторное тестирование компонента Иконка Подготовка компонента к распространению

Компонент FilterEdit

Формулировка проблемы Частное решение Воплощение базового компонента

Сужение проблемы класс TNumericEdit Компонент LineGraph

Формулировка проблемы Частное решение Определение свойств компонента

Добавление свойств в компонент Воплощение управляющего элемента Что мы узнали в этой главе?

Глава15•Часто задаваемые вопросы (FAQ)

Общие вопросы

Что такое C++Builder?

Ради чего мне стоит использовать CBuilder? Может ли CBuilder работать с MFC? Может ли CBuilder работать с OWL?

Собирается ли фирма Borland избавиться от OWL? Что такое VCL?

Где я могу получить дополнительную информацию?

Как мне скомпилировать программу, если я работаю в режиме редактора

Brief Emulation?

Как мне изменить тип проекта, выбираемый по умолчанию?

У меня пропадает окно сообщений об ошибках. Как его вернуть?

Мое консольное приложение не использует VCL. Как мне убрать ее из компоновки? Как мне использовать внешние DLL с CBuilder?

Как мне создать статическую библиотеку в CBuilder? Где находится Мастер диалогов (Dialog Wizard)?

Почему при исключении информации отладчика размер EXE-файла не уменьшается? Что за файлы создает CBuilder? Которые из них я могу удалить?

Где находятся компоненты для страницы Samples палитры компонентов? Где находятся управляющие элементы для Internet?

Как мне сделать так, чтобы у нескольких компонентов на форме было одинаковое значение

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

свойства?

Общие вопросы программирования

Что такое «Compiler Error #1» и как мне от нее избавиться? Что такое AnsiString и как его преобразовать в Char *? Как добавляют элементы в множество?

Что означает ошибка «Member function must be called...»? Что означает ошибка «Structure required»?

Как исправить ошибку «Linker Error: Failed to create map file»?

Как добавить ресурсы в проект?

Можно ли динамически подгрузить библиотеку VCL? Как пошагово выполнить исходный код VCL при отладке? Почему отладка столь медленна? Как ее ускорить?

Компилятор нагло врет! Мои переменные имеют неправильное значение! Как получить доступ к принтеру или буферу обмена?

Как поставить выравнивание байтов в CBuilder?

Как принимать перетаскиваемый (drag-and-drop) файл в моей форме? Как изменить размер компонента до размера формы?

Как использовать макрос TRACE в CBuilder? Как отобразить кусочек растрового рисунка?

Как динамически создать компонент во время исполнения? Как эмулировать sprintf при работе со строками? Библиотека стандартных шаблонов (STL)

Почему при использовании класса vector выдается целый ворох ошибок? Можно ли использовать STL в компонентах?

Библиотека визуальных компонентов (VCL)

Как программно добавить элементы в список или комбинированный список?

Как в своем компоненте или форме обработать сообщение Windows (WM_USER)? Когда следует использовать модификатор __fastcall?

Почему при инсталляции собственных компонентов появляются сообщения о странных ошибках? Как добавить горизонтальную полосу прокрутки в окно списка (ListBox)?

Можно ли использовать MessageDlg из Delphi в CBuilder?

Как инсталлировать компонент Delphi в CBuilder?

Почему нельзя определить в программе элемент моего собственного компонента? Как разбить полное имя файла на составляющие элементы?

Как получить доступ к отдельным кускам растрового рисунка?

Как изменить элемент в списке, кроме как удалить и добавить снова? Как изменить цвет текста на кнопке?

Как хранить информацию, связанную с элементом списка?

Как создавать растровые рисунки на кнопках во время исполнения? Дочернее окно MDI не закрывается. Как можно его закрыть?

Как в CBuilder поместить дату и время в строку состояния? Как изменить цвет фона формы?

Как преобразовать введенное в поле редактирования значение в число с плавающей точкой? Как загрузить растровый рисунок во время исполнения?

Как запретить один из переключателей в группе?

Файлы помощи и проблемы

Почему при нажатии F1 я получаю пустое окно сообщения? Почему нет помощи по TStringGrid?

Много ли перекрестных ссылок пропущено в файлах помощи? Как добавить помощь по F1 для моего собственного компонента?

CBuilder виснет, когда я щелкаю на закладке Find диалога помощи. В чем дело?

Базы данных

Почему на файле Btrieve я получаю сообщение «Record/Key Deleted»?

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

Как поместить текущую дату в поле редактирования DBEdit?

Как установить фильтр, содержащий специальные символы типа«/»? Как использовать индексы в базах данных?

Как подключиться к базе данных Access (или подобной), незаставляя пользователя вводить никаких данных?

Как определить, что запись базы данных была изменена? Как отменить редактирование записи в базе данных?

Обработка исключительных ситуаций Как использовать выражения try ... catch?

Как сделать обработчик исключительной ситуации функцией-членом класса формы?

Разное

Какие еще источники информации по CBuilder существуют?

Как использовать формы CBuilder в приложении на Visual C++, использующем MFC? Как средствами CBuilder получить доступ к метке диска CD-ROM?

Как использовать OLE Automation в CBuilder?

Как осуществить обработку времени простоя в CBuilder?

Создание компонентов

Как добавить свойство класса, например TFont, в мой компонент?

Почему при попытке посмотреть свойство моего компонента вObject Inspector система выдает мне ошибку «переполнение стека»?

Как создать круглую кнопку?

Какие файлы надо иметь при создании компонента?

Как создать компонент, который бы выглядел как массив?

Как можно протестировать свой компонент, не добавляя его впалитру?

Глава16•Другие источники информации

Web-узлы фирмы Borland CompuServe

Списки рассылки

Web-узлы

Другие источники

Глава17•Создание Мастеров

Создаем приложение просмотра классов Вспомогательный модуль Вторая стадия: добавление в базу данных

Таблица методов Таблица свойств Сохранение данных

Добавление данных в таблицы Первая проба Мы готовы создать Мастера

Создание программы Форма для определения новых методов Страница свойств Создание Мастера

Добавление функциональных возможностей в Мастер Небольшое отступление: объект ToolServices Проблемы, проблемы, проблемы

Инсталляция Мастера Программа инсталляции Мастера Что мы узнали в этой главе?

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

Глава18•Расширения языка C++ в CBuilder

Расширения

_asm и __asm __automated _cdecl и cdecl __classid __closure __declspec __except __export и _export

__fastcall и _fastcall __finally

_import и __import

__int8, __int16, __int32 и __int64 _pascal и __pascal

__property __published __rtti __thread __try

Заключение

Предисловие переводчиков

Как вы, наверное, слышали, основным козырем новейших систем создания приложений под Windows является возможность визуальной разработки интерфейса. При этом частенько приводится старый аргумент о том, что вам не придется писать ни строчки кода, чтобы получить вполне работающее приложение, обладающее всеми атрибутами нормальной программы, обрабатывающее события, имеющее меню, реагирующее на горячие кнопки. Действительно, если вам нужно написать совсем простую программу, то вы можете спокойно отодвинуть клавиатуру в сторону и взяться за любимого хвостатого помощника. Но если вам потребуется написать что- нибудь посерьезнее, чем программа для простого просмотра полей в базе данных, то тут вам придется попотеть. Если вы уже немного знакомы с системой C++ Builder или с ее родственницей Delphi, то вы знаете это чувство обиды на такую красивую и удобную систему, не дающую вам сделать то, что вы хотите. Через некоторое время общения с системой разработки вы понимаете, что все равно придется постигать ее изнутри, писать много строчек кода, копаться в справочной системе и шаг за шагом узнавать приемы, методы и концепции. Предлагаемая вашему вниманию книга послужит для вас проводником, своеобразной базой знаний, в которой сконцентрирован богатый опыт разработчика приложений на C++ под Windows. Вы не найдете здесь детального описания свойств и методов объектов в системе разработки C++ Builder; вместо этого книга дает ответы на вопросы, возникающие у каждого профессионального программиста, которые выходят за рамки обычного разговора о визуальном программировании. Невизуальное программирование! Та невидимая кропотливая работа, которая совершается за кулисами действительно серьезных, профессиональных программ. Понимание сути вещей, когда каждая строчка кода обоснована и продумана вот цель разработчика, считающего себя профессионалом.

Автор книги, Матт Теллес, работавший более десятка лет с системой Microsoft Visual C++, перешел на систему Borland C++ Builder. Поэтому, ценя удобный визуальный дизайн и быстроту разработки в C++ Builder, он тем не менее избавлен от раболепства перед прелестями системы. Он видит ее изнутри, и показывает вам, что в ней хорошо, а что могло бы быть и лучше. Он даст вам ценные советы по разработке приложений, полагаясь не только на стандартные компоненты, но иногда и замещая их более удобными. Во многих примерах (а надо отметить, что примеры в книге

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

подобраны очень удачно это, как правило, не просто учебные пособия, но и действительно важные и нужные программы) происходит динамическое создание управляющих элементов и компонентов, а также работа с другими динамическими структурами. Начав с пустой формы, вы получаете в процессе работы приложения сложную структуру из элементов управления, взаимодействующих между собой. Кроме того, автор покажет вам, как работать с базой данных именно таким образом, каким этого хочется вам. Прочитав эту книгу, вы поймете, что на самом деле многие стандартные компоненты, входящие в Visual Component Library (библиотека визуальных компонентов), могли бы вы написать и сами, и может быть даже немного по-другому, не так, как программисты компании Borland International. В этом смысле система C++ Builder (а также Delphi) открыта; вы можете изменять ее по своему вкусу.

Книга предназначена для широкого круга читателей. Если вы уже знакомы с системами Delphi и C++ Builder (очень многие программисты любят язык C и C++ больше, чем Pascal, но были вынуждены писать программы на Delphi до появления C++ Builder), то книга будет вам огромным подспорьем в работе. Если же вы писали программы на Visual C++ и раздумываете, выбирая между системами, то эта книга убедит вас, что среда разработки фирмы Borland более удобна; кроме того, C++ Builder умеет работать с любым другим кодом на C++, и даже с кодом, использующим классы MFC, являющиеся костяком среды Visual C++. Если вы до сих пор писали программы под DOS, то тут вам придется потруднее; сам автор советует взять для начала книжку «для чайников», так как некоторые концепции программирования под Windows в книге считаются аксиомами и обсуждению не подлежат. Тем не менее, вам быстро надоест писать программы- калькуляторы, записные книжки и прочие безусловно полезные, но маленькие и недостаточные вещи; вам захочется понюхать пороху и узнать, что почем. Тогда эта книга поможет вам. А почему, спросите вы, я должен выбирать систему, которая ничем не отличается от Delphi, да еще и в несколько раз дольше компилирует мои приложения? На этот вопрос есть несколько ответов. Во-первых, вы можете не любить язык Pascal, а любить C++. Этого уже достаточно, чтобы работать именно с C++ Builder, а не с Delphi. Кроме того, основной функциональный код, если его вынести в отдельные модули, можно будет переносить на любую платформу, под любой компилятор ANSI C++. Написанное на Pascal перенести будет на несколько порядков труднее. Если у вас уже есть функция на ANSI C или ANSI C++, являющаяся частью программы под ОС UNIX, то она без изменений будет работать как часть проекта под ОС Windows 95 или NT в системе C++ Builder. А что мне делать с моими существующими проектами? - воскликнут хором программисты на Delphi и Visuаl C++. Программы из Visual C++ переносятся, правда по кускам, в систему C++ Builder, так как в C++ Builder входит библиотека MFC. А программы из Delphi вообще компилируются (есть только одно «но» — должен быть сделан новый файл проекта в C++ Builder) данной средой, так как C++ Builder содержит компилятор Object Pascal. В этом смысле C++ Builder является универсальной многоязычной средой, так как в одном проекте можно смешивать модули на Pascal, на С и на C++. И, наконец, последний аргумент в пользу языка C++ (вернее, того его расширения, что применяется в C++ Builder). В отличие от Object Pascal, C++ более честный язык. Многие конструкции в Object Pascal сделаны как расширение языка Borland Pascal и неясно, каким образом они реализуются в системе (примером могут служить функции с переменных числом параметров, чего ранее язык Pascal вообще не поддерживал). Кроме того, многие вещи вообще скрыты от программиста. Это наблюдалось еще раньше, в предшественниках Object Pascal и является по большому счету скорее минусом, чем плюсом. В погоне за простотой языка частенько теряется его функциональность. К примеру, в языке Pascal значения счетчика цикла for не определено (то есть может, вообще говоря, оказаться любым) после конца цикла. Компилятор же, используемый в системе C++ Builder, соответствует стандартам ANSI C и ANSI C++ последних модификаций, так что вы можете использовать все, что разрешено этими стандартами (в частности, шаблоны классов C++, аналога которым просто нет в Object Pascal).

Единственные существенные добавления к языку относятся к поддержке новой объектной концепции «свойства» и к информации о типе объекта, передаваемой во время выполнения (RTTI, Run-Time Type Information).

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

Завершая наш разговор, посмотрим, чему вас научит эта книга:

Решать стандартные проблемы, встающие перед программистом на C++ Builder.

Расширять систему C++ Builder, создавая свои собственные компоненты.

Создавать Мастера (Эксперты) и внедрять их в интегрированную среду C++ Builder.

Работать с библиотекой классов MFC (Microsoft Foundation Classes) и загружать формы из

C++ Builder в приложение под Visual C++.

Использовать библиотеку визуальных компонентов VCL; вы изучите архитектуру библиотеки и то, как она взаимодействует с существующими наработками в области программирования под

Windows.

Использовать библиотеку стандартных шаблонов (STL, Standard Template Library) С++, содержащую множество полезных классов.

Общаться с функциями Windows API «без переводчика», на C — родном языке системы Windows.

И, наконец, прочитав эту книгу, вы в любом случае почувствуете себя увереннее, сможете общаться с системой C++ Builder «на ты». Мы надеемся, что книга поможет вам написать что-то действительно грандиозное и профессиональное.

Что есть на компакт-диске?

На компакт-диске вы найдете исходный код всех программ, приведенных в книге. Компакт-диск разбит на каталоги по главам; перед каждым листингом программы в книге указан каталог, в котором находится данное приложение. Эти проекты вы можете сразу же открыть в системе C++ Builder и запустить. Кроме того, на компакт-диске находится множество бесплатных (freeware) и условно-бесплатных (shareware) утилит, компонентов, мастеров и добавлений к интегрированной среде, которые вам могут пригодится. Кое-что из этого поставляется в исходном коде, так что у вас есть возможность изучить, как другие программисты пишут приложения на C++ Builder, и использовать эти навыки (и этот исходный код) в своих приложениях.

Глава 1. Обзор

Что такое C++ Builder?

Вокруг C++ Builder, настоящего инструмента RAD (Rapid Application Development, быстрой разработки приложений) на C++ для Windows, в программистской среде поднят большой шум. Без сомнения, до вас дошли его отголоски, и то, что вы открыли эту книгу, похоже означает, что вы достаточно сильно заинтересованы, чтобы попробовать его на вкус. Название книги предполагает, что вы, по крайней мере, немного знакомы с предметом и хотите узнать о нем побольше. Перед тем как перейти к детальному описанию системы, рассмотрим общую картину: что делает C++ Builder таким мощным инструментом и почему это так важно в индустрии программных средств? Для начала давайте избавимся от неудобоваримо длинного имени и во всей книге будем называть интегрированную среду разработки C++ Builder просто CBuilder. Мы, конечно, могли бы сократить название и просто до Builder, но это вызовет проблемы при разговоре о JBuilder — среде фирмы Borland для создания приложений Java.

CBuilder — один из самых первых инструментов RAD для C++, и единственный инструмент RAD, который предоставляет возможность программирования в стиле drag-and-drop (перенести-и-

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