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

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

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

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

Кроме поддержки своего собственного Web-узла, фирма Borland также принимает участие в электронном форуме CompuServe. Форум CompuServe, хотя и не поддерживается официально фирмой Borland, часто предоставляет широкую информацию об использовании и расширении системы CBuilder. Если ранее вы не пользовались CompuServe, то вам полезно узнать, что есть два различных способа доступа к информации в этом форуме. Первый способ это использование доски объявлений, так же, как в конференциях Usenet. Основное отличие между форумами и конференциями состоит в том, что форумы стремятся иметь более высокое отношение сигнал шум, то есть, если конференции помещают много информации, не имеющей отношения к рассматриваемому вопросу, такой как реклама других программных продуктов или сообщения из других конференций, не связанные с темой данной конференции. Форумы, с другой стороны, стремятся обсуждать только те темы, для которых они были созданы.

Вдополнение к доске объявлений, другим источником информации в CompuServe является библиотека файлов, которая содержит файлы для системы CBuilder. Это могут быть текстовые файлы с технической документацией фирмы Borland или загруженные пользователями файлы, содержащие новые VCL компоненты и тестовые приложения. В библиотеке файлов также можно найти демонстрационные версии коммерческих и ограниченно-распространяемых (shareware и freeware) программных продуктов.

ВCompuServe вы найдете сайты фирмы Borland на официальном форуме CBuilder по адресу CIS:BCPPWIN, который содержит библиотеки с информацией по всем различным аспектам CBuilder. Здесь вы найдете исправления к Help файлам, загруженные VCL компоненты, сообщения о решении определенных задач и другую полезную информацию о CBuilder.

Другим полезным форумом является форум CIS:DELPHI32. Этот форум, хотя и посвящен продукту Delphi, содержит информацию, которая также может быть использована и для системы CBuilder. Delphi и CBuilder чрезвычайно тесно взаимосвязаны, так что часто вы можете взять код Delphi и либо использовать его прямо в своем приложении, либо просто конвертировать его в код C++ для использования в CBuilder. Кроме того, обычно компоненты Delphi могут быть просто помещены прямо в систему CBuilder и использованы из Палитры Компонентов, как было показано ранее. В связи с этим, вы можете использовать библиотеку файлов этого форума для поиска компонентов, которые будут работать и в вашем CBuilder приложении. Хотя и не все компоненты будут работать с CBuilder (например, компоненты Delphi 3.0 не будут работать), но большинство будет работать и вполне стоит затратить время и усилия для их загрузки.

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

Существует несколько списков рассылки для программистов на CBuilder. Один из них поддерживается фирмой Borland и может быть найден на ее Web-узле (http://www.borland.com). Он

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

В дополнение к нетехническому списку рассылки фирмы Borland? Имеется также список рассылки, посвященный работе с CBuilder. Этот рецензируемый список рассылки поддерживается фирмой Ziff-Davis и попасть в него можно, обратившись на Web-узел фирмы Ziff-Davis (http://www.cobb.com) найдя Web-страничку со списком и добавив в него свою фамилию. Список рассылки фирмы Ziff-Davis находится на Web-узле группы Ziff-Davis Cobb по адресу http://www.cobb.com/cpb. Здесь, кроме списка рассылки, вы найдете и информацию из журнала

C++Builder Journal.

Web-узлы

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

Вот несколько Web-узлов, которые оказались полезными для меня при программировании на CBuilder и написании этой книги.

Web-узел Алена Герни (Alan Garny) (http://pc-heartbreak.physiol.ox.ac.uk/programming.html)

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

Следующий Web-узел, который вы должны посетить, путешествуя по Internet, это неофициальная домашняя страничка CBuilder (C++Builder Home Page). Несмотря на свое название. Этот сайт не поддерживается фирмой Borland, а является самостоятельной домашней страничкой. Там помещены несколько приятных компонентов и довольно хорошие ссылки на другие узлы. Эта неофициальная домашняя страница C++Builder находится в Internet по адресу http://wwwrohan.sdsu.edu/home/mattison/bcb/.

Другой хороший источник информации по CBuilder находится на страничке C++Builder Solutions. Этой страничкой руководит Кент Рейсдорф (Kent Reisdorph) — один из авторов CBuilder, спонсирует ее фирма TurboPower — продавец компонентов Delphi и CBuilder. Эта страничка находится по адресу http://www/turbopower.com/bcb и содержит несколько статей о CBuilder, несколько часто задаваемых вопросов с ответами и другую информацию, имеющую отношение к системе CBuilder. Кент Рейсдорф отличный источник информации о CBuilder, он входит в команду TeamB (команда добровольцев для поддержки продуктов фирмы Borland) и вообще отличный парень. Вы часто встретите его на упоминавшихся ранее форумах фирмы Borland отвечающим на поступившие вопросы.

Домашняя страничка Дэниэла Кэри (Daniel Carey) по адресу http://www.multipro.com/whawke/ это отличный источник компонентов CBuilder, статей, ответов на часто задаваемые вопросы и новостей о CBuilder. Регулярно обновляемый, этот сайт содержит файловую секцию, секцию новостей и ссылки на многие другие узлы, связанные с CBuilder и Delphi. Дэниэл является программистом на CBuilder по призванию и регулярно размещает на своем сервере новые компоненты и статьи. Этот сайт хорошее место для старта, если вы хотите почувствовать, что доступно в Web для программиста на CBuilder.

Web-узел «Many Roads To CBuilder» по адресу http://www.iks.aqua.com/r2bcb/ начинался как страничка, посвященная поддержке связей с другими сайтами по CBuilder. Впоследствии этот сайт вырос до собственных статей «вопрос-ответ» и указателей на целый ряд хороших загружаемых компонентов. Посетите этот сайт прежде, чем вы начнете искать в Web список узлов, посвященных CBuilder. Нужный вам список уже, вероятно, есть на этом сайте. Я использовал его как отличную исходную точку для блужданий по Web.

Вероятно, самый лучший отдельный источник информации в Web, кроме Web-узла фирмы

Borland, это сервер «The Bits They Forgot» по адресу http://www/jpmg-group.mcmail.com/bcb.htm.

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

ZBuilder Software – это компания, созданная для написания компонентов для системы CBuilder и для ее старшей сестры системы Delphi. ZBuilder поддерживает Web-узел на America Online по адресу http://www.members.aol.com/zbuilder/index.htm, который содержит загружаемые версии

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

компонентов и условно-бесплатную (shareware) информацию. ZBuilder также предлагает выполнить программирование тех задач, которые вы просто не успеваете сделать сами.

Неофициальная домашняя страничка системы CBuilder по адресу http://www.nh.ultranet.com/~bsturk еще один отличный источник информации по системе CBuilder. Сопровождение этот страницы осуществляет Брайен Старк (Brien Sturk), частый гость на форумах фирмы Borland и любитель программировать на CBuilder. Этот сайт содержит загружаемые компоненты, статьи и ссылки на другие узлы. Часто обновляемый, этот сайт является неоценимым источником при Web-поиске. Брайен также активно участвует в «круглом столе»

Internet (IRC — Internet relay chat).

Web-сервер доктора Боба (CBuilder Dr.Bob) CBuilder Gate — отличное местечко, если вы хотите побольше узнать о Мастерах (Экспертах) для CBuilder или Delphi или просто их загрузить. Др.Боб

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

доктора Боба находится по адресу http://www.members.aol.com/CppBuilder/index.htm.

К тому времени, когда эта книга выйдет из печать, появятся, по-видимому, новые узлы, посвященные CBuilder. Обратитесь на один из перечисленных сайтов для ссылок на эти новые сайты или найдите их сами с помощью любой системы поиска по Web. В дополнение к перечисленным серверам, посвященным только CBuilder, хорошая информация обычно находится также на любом узле, посвященном Delphi. Одним из лучших таких узлов является Delphi Super Rage, который содержит информацию и компоненты для Delphi 1.0, 2.0 и 3.0. Компоненты Delphi 2.0 будут вполне хорошо работать и с CBuilder, а большинство других также могут быть адаптированы к CBuilder. Сайт Super Page содержит небольшой раздел по компонентам системы CBuilder, который, вероятно, будет постепенно увеличиваться. Сайт Delphi Super Page находится по адресу http:/www.sunsite.icm.du.pl/delphi/.

Последний Web-узел, который я должен упомянуть (иначе мой редактор меня убьет), это Web- узел издательства Coriolis Group по адресу http://www.coriolis.com. Этот сайт содержит много книг, статей и всяких полезных файлов для книг по CBuilder и Delphi; он представляет собой хороший стартовый пункт для исследования широкого мира программирования на CBuilder.

Другие источники информации

В дополнение к компьютерным сетям, Web-узлам и Internet, имеются и другие способы получения информации о CBuilder. Выпущено уже несколько книг (включая, конечно, и эту) и журналов, и будет выпущено еще больше, поскольку мир хочет знать больше об этой системе. Кроме того, имеется «круглый стол» Internet Relay Chat (IRC) для обсуждения системы CBuilder, канал #builder. Если вы еще не участвовали в IRC, то стоит попробовать и вы поймете, что вы теряете.

По-видимому, вам не потребуется вся помощь, которая доступна по системе CBuilder. Сама система достаточно проста для использования, и большинство вещей, которые вы хотите сделать, уже продуманы и реализованы в VCL. Однако в тех случаях, когда VCL недостаточна, приятно сознавать, что вы всегда можете найти и компоненты, и код для использования в своих приложениях. Запомните, CBuilder легко использует уже существующий код. Тщательно проверьте сетевые ресурсы, прежде, чем вы решите сами написать какую-либо программу. Возможно, что кто-то уже выполнил за вас вашу работу

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

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

Создание Мастера

Внутреннее устройство IDE

Мастера и базы данных

Генерация нового компонента

В главе 14 мы научились расширять систему разработки CBuilder, используя VCL для создания новых компонентов, но есть другой путь расширения системы. CBuilder располагает обширным интерфейсом разработки приложений (Application Programming Interface, API), который предоставляет вам возможность расширять собственно систему, создавая новые программные Мастера.

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

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

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

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

На третьей и финальной стадии мы создадим полновесного Мастера, который будет использовать созданные нами на второй стадии таблицы баз данных для генерации новых классов компонентов. По ходу разработки мы узнаем много нового о структуре классов C++ в CBuilder, о добавлении вспомогательных модулей и о создании приложений CBuilder вообще.

Создаем приложение просмотра классов

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

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

Рис. 17.1. Форма приложения просмотра классов

На рис. 17.1 показана главная форма приложения. Она содержит списки, в которых будут перечислены доступные классы, а также методы и свойства для этих классов. Стоит сразу же отметить, что сам по себе анализатор не различает событие и свойство, поскольку на самом деле для системы CBuilder они одно и то же. Если вы хотите знать, что из них есть что, то, как правило, можете ориентировать ся по приставке «On» (при), отсутствующей у свойств и наличествующей у большинства событий.

Для создания этого приложения нам потребуется некоторое количество вспомогательного кода для синтаксического анализа и создания списков. Если это ваш первый опыт работы с тяжеловесным кодом на C++ в CBuilder (но, скорее всего, не последний), вы получите хорошее представление о написании настоящего кода C++ (вместо работы только с визуальными (GUI) элементами системы). Помните, что CBuilder содержит мощный компилятор C++. Используйте этот компилятор и все его возможности.

Вспомогательный модуль

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

Выбрав File|New Unit, создайте в CBuilder новый модуль. Этот модуль содержит вспомогательные элементы, так что мы назовем его Utility. В созданный файл добавьте (или скопируйте с компакт- диска) следующий код. Листинг довольно большой, так что лучше, возможно, все же скопировать его с диска.

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

#include "Utility.h" //-------------------------------------------------------------------

#include <stdio.h> #include <string.h> #include <stdlib.h>

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

#include <ctype.h>

int GetWordQuoted ( char *string, char *word, char *brkChar )

{

// Ищем начало строки int nEndPos = 0;

for ( int i=0; i<(int)strlen(string); ++i )

if ( !isspace(string[i])&&(string[i] != ',' && string[i] != '|') )

{

nEndPos = i; break;

Создаем приложение просмотра классов

}

// Ищем конец слова char term_char = 0;

if ( string[nEndPos] == '"' && string[nEndPos-1] != '\\' )

{

term_char = '"'; nEndPos++;

}

int nWordPos = 0;

for ( int j=nEndPos; j<(int)strlen(string); ++j )

{

if ( term_char )

{

if ( string[j] == term_char )

{

word[j-nEndPos] = 0; j++;

nWordPos = j; break;

}

}

else

if (isspace(string[j]) || string[j]==',' || string[j] == '|' )

{

nWordPos = j; break;

}

word[j-nEndPos] = string[j]; nWordPos = j;

}

word[nWordPos-nEndPos] = 0; if ( brkChar )

*brkChar = string[nWordPos];

if ( string[nWordPos] == ',' || string[nWordPos] == '|' ) nWordPos++;

return nWordPos;

}

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

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

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

файлах.

Int IsEndOfLine( char ch )

{

if ( ch == ';' ) return 1;

if ( ch == '{' ) return 1;

if ( ch == '}' ) return 1; return 0;

}

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

BOOL CheckClass( char *strLine, char *strClassName )

{

char szWord[ 256 ];

int nPos = GetWordQuoted ( strLine, szWord, NULL ); if ( !strcmp(szWord, "typedef") ||

!strcmp(szWord, "extern") ) return false;

if ( !strcmp(szWord, "class") && strLine[strlen(strLine)-1] != ';')

{

nPos += GetWordQuoted ( strLine+nPos, szWord, NULL ); if ( !strncmp(szWord, "__declspec", 10) )

GetWordQuoted ( strLine+nPos, szWord, NULL ); strcpy( strClassName, szWord );

return true;

}

return false;

}

Функция CheckClass проверяет, является ли переданное ей выражение описанием класса. Для этого она извлекает первое слово из этого выражения при помощи функции GetWordQuoted, а потом проверяет это слово на совпадение с описанием класса («class»). Функция игнорирует форвардные описания классов, принимая значение true, только в случае нормальных описаний классов.

int SkipToEndOfComment(FILE *fp)

{

int c = 0;

int last_c = 0; do {

c = fgetc(fp);

if ( c == '/' && last_c == '*' ) break;

if ( c == EOF ) break;

last_c = c;

} while ( !feof(fp) );

// Запоминаем, что следует за комментарием if ( !feof(fp) )

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

c = fgetc(fp); return c;

}

Метод ScipToEndOfComment просматривает содержимое файла в поисках конца комментария (вложенные комментарии не поддерживает). Этот метод возвращает символ, следующий непосредственно за блоком комментария.

BOOL PreScanClasses(char *strFileName, TListBox *pListBox)

{

FILE *fp = fopen(strFileName, "r"); if ( fp == NULL )

{

return false;

}

char szBuffer[ 1024 ]; char szClassName[ 256 ]; int brace_cnt = 0;

while ( !feof(fp) )

{

int c = 0; int pos = 0;

// Очищаем буфер символов memset ( szBuffer, 0, 1024 ); int last_c = 0;

do {

c = fgetc(fp); if ( c == '{' ) brace_cnt ++; if ( c == '}' ) brace_cnt ++;

if ( c == '#' && pos == 0 ) break;

if ( c == '/' && last_c == '/' ) break;

if ( c == EOF ) break;

if ( c == '*' && last_c == '/' )

{

last_c = 0;

pos --; // Отступаем назад к началу комментария c = SkipToEndOfComment(fp);

}

// Проверяем, надо ли добавлять этот символ if ( c != '\n' )

if ( pos || !isspace(c) ) szBuffer[pos++] = c; last_c = c;

} while ( !IsEndOfLine(c) );

if ( (c == '#' && pos == 0) || (c == '/' && last_c == '/') )

{

while ( c != '\n' && !feof(fp) ) c = fgetc(fp);

}

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

else

if ( brace_cnt )

{

if ( CheckClass(szBuffer, szClassName ) ) pListBox->Items->Add( szClassName );

}

}

fclose(fp);

}

Функция PreScanClasses используется для извлечения из заголовочного файла имен классов для отображения в начальном списке классов в окне нашего приложения. Она просматривает заголовочные файлы и выделяет выражения C++, которые передает функции CheckClass для проверки, подходят ли они к синтаксису описания классов.

BOOL ProcessLine( BOOL bDisplay, char *strLine, char *szClassName, TListBox *pPropList, TListBox *pMethodList )

{

char szWord[ 256 ];

int nPos = GetWordQuoted ( strLine, szWord, NULL ); if ( !strcmp(szWord, "typedef") ||

!strcmp(szWord, "extern") ) return bDisplay;

if ( !strcmp(szWord, "class") && strLine[strlen(strLine)-1] != ';')

{

nPos += GetWordQuoted ( strLine+nPos, szWord, NULL ); // Пропускаем слово __declspec

if ( !strncmp(szWord, "__declspec", 10) )

nPos += GetWordQuoted ( strLine+nPos, szWord, NULL ); if ( !strcmp(szWord, szClassName) )

return true; else

return false;

}

//Если мы до сих пор не нашли класса,

//дальше можно не ходить

if ( bDisplay == false ) return false;

// Ищем свойства

if ( !strcmp(szWord, "__property") )

{

char szType[ 256 ]; char szPropName[ 256 ];

nPos += GetWordQuoted ( strLine+nPos, szType, NULL ); nPos += GetWordQuoted ( strLine+nPos, szPropName, NULL );

if ( !strcmp(szPropName, "*") || !strcmp(szPropName, "&") )

{

strcat( szType, szPropName );

nPos += GetWordQuoted ( strLine+nPos, szPropName, NULL );

}

// Унаследованные свойства уже имеют имя

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

if ( strlen(szPropName) && strcmp(szPropName, ";") && strcmp(szPropName, "=") ) pPropList->Items->Add(szPropName);

else pPropList->Items->Add(szType);

}

else

if ( strstr(strLine, "__fastcall") )

{

pMethodList->Items->Add(strLine);

}

return true;

}

Метод ProcessLine это вспомогательная функция, используемая следующей функцией (GetMethodsAndProperties) для извлечения методов или свойств, обнаруженных в заданном выражении C++.

void GetMethodsAndProperties(char *fileName, char *className, TListBox *pPropList, TListBox *pMethodList )

{

FILE *fp = fopen(fileName, "r"); if ( fp == NULL )

{

return;

}

char szBuffer[ 1024 ]; int brace_cnt = 0;

BOOL bFoundIt = FALSE; while ( !feof(fp) )

{

char c = 0; int pos = 0;

// Очищаем символьный буфер memset ( szBuffer, 0, 1024 ); char last_c = 0;

do {

c = fgetc(fp); if ( c == '{' ) brace_cnt ++; if ( c == '}' ) brace_cnt ++;

if ( c == '#' && pos == 0 ) break;

if ( c == '/' && last_c == '/' ) break;

if ( c == EOF ) break;

if ( c == '*' && last_c == '/' )

{

last_c = 0;

pos --; // Отступаем назад на начало комментария c = SkipToEndOfComment(fp);

}

if ( c != '\n' )

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