Отправляет email-рассылки с помощью сервиса Sendsay

Borland C++ Builder - всякая всячина

  Все выпуски  

Borland C++ Builder всякая всячина (№11. Создание собственных компонентов)


Служба Рассылок Subscribe.Ru

Приветствую всех получателей рассылки Borland C++ Builder - всякая всячина!

№11. Создание собственных компонентов

 

"- Чашу вина? Белое, красное? Вино какой страны предпочитаете в это время дня?
- Покорнейше... я не пью...
- Напрасно! Так не прикажете ли партию в кости? Или вы предпочитаете другие какие-нибудь игры? Домино, карты?
- Не играю, - уже утомленный, отозвался буфетчик.
- Совсем худо, - заключил хозяин, - что-то, воля ваша, недоброе таится в мужчинах, избегающих вина, игр, общества прелестных женщин, застольной беседы. Такие люди или тяжко больны, или втайне ненавидят окружающих. Правда, возможны исключения. Среди лиц, садившихся со мною за пиршественный стол, попадались иногда удивительные подлецы!"
М. Булгаков (Мастер и Маргарита)

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

Логика тут проста, как карандаш: создайте новый проект и запустите его. Появится пустое окно, которое можно передвинуть по экрану, изменить его размеры, закрыть наконец... Код этого проекта занимает 10 строчек. Если же попытаться проанализировать весь объем работы, которую ваша программа проворачивает в ответ на ваши действия, можно слегка подвинуться умом. Там даже не тысячи - десятки тысяч строк скрытого паскалевского кода создают эту легкость и простоту. Причем (вот открытие!), все это, оказывается, написано людьми, с двумя руками, двумя ногами, как раз теми, что обжигают пресловутые горшки.

И все это безглючно работает не потому, что они умнее нас с вами, а потому, что делают это гораздо более рациональным способом. Суть такова: берем какой-нибудь стандартный компонент, привинчиваем к нему необходимое нам свойство, реализуем работу этого свойства двумя-тремя методами общим объемом строк так на пятьдесят (чем меньше, тем легче отлаживать). Компилируем полученное, объявляем порожденному классу, что отныне он - полноправный компонент, закидываем его на панель компонентов и ЗАБЫВАЕМ про него. Теперь, чтобы добавить к нему еще одно свойство, не надо доставать его "с полки", править исходный код и снова отлаживать теперь уже 100 строк кода. Надо просто создать новый компонент - наследника от только-что созданного и нормально функционирующего, и дорабатывать уже его. Во-первых, мы не нарушим работоспособность программ, использующих старый вариант компонента, а во-вторых, неблагодарное занятие - разбираться в коде, смысл которого уже благополучно забыт, особенно, если не знать и забыть (это я о доработке чужих компонентов).

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

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

Опять заболтался... Так вот, поскольку все компоненты должны как-то объединяться в пакеты, начнем с его создания. Нажмите кнопочку "New" или выберите в меню пункт "File->New..." и в появившемся диалоге на вкладке New выберите элемент Package и нажмите Ok. В итоге вы должны получить новый пакет, в котором в качестве содержимого будет указан файл "package1.cpp", а в качестве требуемого файла - "vcl50.bpi" (для доступа к стандартным компонентам библиотеки VCL). Давайте не будем варварами и сохраним все это в отдельной папке с благозвучным названием. Лучше в основной папке Билдера (будем ее обозначать как $(BCB)) найти там папку "\Projects", в ней создать новую папку, например, "\MyPack" и в ней все это сохранить под именами MyPack.bpk и MyPack.cpp. Обратите внимание на то, что головной файл пакета "MyPack.cpp" не имеет своего обычного спутника "MyPack.hpp" (вы можете создать его при необходимости вручную) и содержит только описание единственной функции DllEntryPoint. С ее помощью после компиляции и инсталляции ваш пакет будет "косить" под обычную DLL-библиотеку.

Вот, теперь можно приступать к созданию нового компонента. Для этого перейдите к отображению головного файла пакета MyPack.cpp в виде формы (клавиша F12), на появившейся форме нажмите кнопку Add и в появившемся диалоге, перейдя к вкладке New Component заполните следующие поля:

  1. Ancestor Type (Тип-предок): TSpeedButton - Класс компонента, от которого будут унаследованы все базовые свойства и методы. Можно (и нужно) также использовать абстрактные классы (TCustomControl). Почему именно кнопка - расскажу в следующем выпуске.

  2. Class Name (Имя класса): TMyButton - я, обычно, добавляю после буквы T символ J(причина: ПОТОМУ-ЧТО!), вы можете придумать для себя свой личный префикс из 1-3 букв нижнего и верхнего регистра, который будет однозначно отличать ваши компоненты от оригинальных. Это и вам облегчит жизнь при работе с ним, и придаст пакету компонент более профессиональный вид в случае его распространения.

  3. Palette Page (Страница палитры): MyPage - это - имя вкладки в стандартной палитре компонент, на которой будут сгруппированы все ваши компоненты (хотя, я думаю, никто ведь не запрещал использовать в качестве "хранилища" стандартные вкладки - можно попробовать, но лучше, порядка ради, создавать свои закрома).

  4. Unit file name (Имя файла компонента): MyButton.cpp - это значение генерируется автоматически и, по-моему, не нуждается в коррекции. Вы, естественно, можете придумать файлу реализации свое имя.

  5. Search path (Пути поиска библиотек): генерируется автоматически

И все... Нажмите "Ok" и получите готовый компонент.

И еще один момент: в главном файле пакета MyPack.cpp есть строчка
USERES("NewPack.res");
Она определяет файл ресурсов, который будет прикручен к пакету. Именно в нем хранятся иконки компонент, отображаемые в палитре компонент. Для того, чтобы ваши компоненты не выглядели, как цыплята в инкубаторе, лучше всего создать для каждого компонента свою иконку. Для этого в Image Editor (запускается через меню "Пуск->Программы->Borland C++ Builder") откройте этот файл ресурсов, создайте в нем новый ресурс BMP размером не более чем 24ч24 пиксела и с палитрой в 16 цветов, нарисуйте что-нибудь, соответствующее месту и времени (можете нарезать заготовки с экрана, нажав клавишу "Print Scrn" и вставив полученное изображение из буфера обмена в любой графический редактор). После этого переименуйте рисунок согласно имени класса компонента (в нашем случае это будет TMyButton) и сохраните файл ресурса.

Вам остается только откомпилировать ваш пакет. Для этого нажмите "Ctrl+F9" или выберите пункт меню Project->Make MyPack. После этого в папке ($BCB)\Projects\Bpl вы найдете файл MyPack.bpl. Он то нам и нужен. В меню Component->Install Packages... нажмите кнопку "Add" и укажите в качестве устанавливаемого пакета этот файл. Кстати, может сложиться такая ситуация, что при вставке ваших компонентов в проект Билдер начнет ругаться по поводу того, что не может найти какие-нибудь файлы. Тогда вам придется вручную дописать путь ( ($BCB)\Projects ) в опциях проекта: см. меню "Progect->Options...->Directories/Conditionals" разделы Include path: и Library path:, а также скопировать скомпилированный файл пакета MyPack.bpl в одну из системных папок, например, в c:\Windows\System32.

Если вы все сделали правильно, в палитре компонентов должна появиться новая вкладка MyPage в которой будет присутствовать только что созданный компонент MyButton. Он абсолютно ничем не отличается от своего предка TSpeedButton, имеет все его (и только его) свойства и методы, реагирует на все ваши действия точно также, и добавить его в свой проект вы можете также просто, как и любой стандартный компонент, и вообще, пользы от него - "как от козла - молока...". И завел я весь этот разговор только для того, чтобы показать, что "не боги горшки обжигают...", а также для того, чтобы подвести базу под слежующие выпуски, в которых я расскажу, что именно можно (все!) сотворить со стандартными компонентами VCL. В том числе мы продолжим глумиться и над кнопкой TMyButton, так что не стирайте пока этот проект, в него мы будем помещать все новые изделия...



С уважением, Васильев Евгений...

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное