Delphi 5. Обзор компонентов 3

Delphi 5. Обзор компонентов "... И того, и другого, и можно без хлеба".
(с) Винни Пух.

Сегодня будем пользовать все компоненты помаленьку. Начиная от совсем маленького ShellExt для регистрации в системе вашего собственного расширения и потомков обыкновенной формы FormRgn с недюжинными возможностями для создания форм произвольного вида и до набора компонентов TMS HTML Pack с возможностью HTML-форматированного ввода параметров и значений.

Но сначала маленькое лирическое отступление. Дело в том, что многие программисты не хотят или не могут устанавливать дополнительные компоненты в среду разработки Delphi. Чаще всего это мотивируется двумя причинами: кажущаяся "сложность" данной процедуры и последующая морока, связанная с переустановкой ПО, а следовательно, и дополнительных компонентов. Я знаю, это не звучит убедительно, но достаточно создать один файл с расширением DPK, куда и скидывать все файлы третьих разработчиков, благо путаницы возникнуть не должно, так как названия файлов там, как правило, "говорящие". Достаточно хранить этот файл и файлы компонентов (на всякий случай) и инсталлировать его после переустановки Delphi. А чтобы еще меньше каждый раз возиться, можно скидывать все файлы компонентов в один каталог, например %DELPHI%/lib/ third_party/. Будет немного путаницы в самом каталоге, но зато очень удобно переставлять компоненты.
Итак, приступим. Вообще говоря, полезность этого компонента вещь очень спорная. Если говорить о высоких материях, то почему бы не предложить программисту самому регистрировать расширения файлов в системе? Работать с реестром не запрещено, а возможно, и полезно на некотором этапе программирования. Про обработку подобного вызова в самом приложении я вообще не говорю. Если не знать простейшей работы со строкой параметров приложения, то зачем тогда, собственно, книги существуют;)? Так вот, вернемся к компоненту. Если же рассматривать проблему с другой стороны, то область "полезности" сильно расширяется ввиду природной смекалистости программистов.
Общее назначение компонента, думаю, понятно. Он позволяет регистрировать в системе или удалять из реестра ссылку на определенное расширение файла. Также при создании ключа с именем расширения создается ключ для открытия файлов подобного типа определенным (ну, вроде как вашим) приложением.

Применять же его можно от программ управления файлами, или, проще говоря, в файловых менеджерах, до программ-инсталляторов и офисных приложений. Работа с ним очень проста. Писать код практически не надо. Указываете расширение и приложение, его открывающее, вызываете метод register, на чем ваше программирование в данном случае успешно заканчивается.
Архив с компонентом снабжен не только файлом справки, что является приятной мелочью, но и маленьким приложением-примером, которое регистрирует ваше расширение. Позволю себе сказать, что компонент будет полезен широкой аудитории, пишущей на Delphi и C++Builder. Это и понятно — ничего сложного в подобном механизме регистрации нет, работа компонента абсолютно прозрачна и интуитивно понятна. Маленький размер самого компонента, практически незаметное увеличение рабочего файла программы может подтолкнуть кого-либо к использованию его в своей работе, а наличие исходного кода, снабженного комментариями, позволяет расширить его возможности до необходимого вам минимума.
Основная проблема, которая стоит перед программистом, пишущим приложение с необычным интерфейсом, — это бедный выбор наследников стандартных форм. В корне все они не очень сильно отличаются друг от друга, так как существует всего несколько способов создания декоративных форм. Требования к таким компонентам очень высоки, так как средний уровень мощности используемых компьютеров действительно величина очень и очень средняя, а мелькание картинки, ее растягивание и постоянный длинный шлейф при перетаскивании надоест самому терпеливому пользователю. Также много нареканий вызывает тот факт, что, как правило, в случае использования нестандартной формы перетаскивать ее можно за любую точку видимой поверхности. Да и разработчики таких компонентов заботятся только о самой форме, не предоставляя программистам средств для использования, скажем, заголовков окна с системными кнопками.

Но, как часто это бывает, если чего-либо еще нет, но это кому-то нужно, найдется человек, который обязательно придумает, как это сделать. Таким человеком оказался Антон Григорьев из Черноголовки. Описанные ниже компоненты и классы не только позволяют создать саму форму произвольной конфигурации, но и работать с ее заголовком, изменять и(или) добавлять кнопки в заголовок окна.
Начнем с самого, пожалуй, главного компонента. TFormRegion — компонент, который, будучи помещен на форму, позволяет делать ее непрямоугольной во время выполнения программы. Во время разработки он может заштриховывать невидимую часть окна, облегчая размещение элементов управления при установке свойства DrawOnDesigining: Boolean в true. При необходимости установка значения ClientDrag: Boolean в true обеспечивает перетаскивание формы за клиентскую часть. Правда, при этом элементы, размещенные на форме и не имеющие своего дескриптора окна (т.е. не являющиеся потомками TWinControl), например, TSpeedButton, не смогут получать сообщения от мыши. Отслеживает изменения размера формы и при необходимости изменяет регион. Допускается размещение только одного компонента TFormRegion на данной форме; попытка размещения второго приведет к сообщению об ошибке.

Следующий компонент запросто может навеять ностальгию по Norton Anti-Freeze (непрямоугольное окно в форме щита с обтекающим сверху заголовком помните?). TCaptionRegion — компонент, позволяющий имитировать заголовки окна произвольной формы (непрямоугольному окну ведь может понадобиться непрямоугольный заголовок?). Этот компонент имитирует только сам фон заголовка, меняющий цвет в зависимости от активности окна. Для имитации прочих частей заголовка надо будет воспользоваться классами TSystemButton, TMenuHotSpot, TCaptionText, о которых будет рассказано ниже. Новый заголовок размещается в клиентской области окна; те части, которые оказываются за пределами этой области, игнорируются. При нажатии правой кнопки мыши над областью заголовка не выскакивает системное меню, как при работе с обычным заголовком, так как сам автор еще не знает, как вызвать это меню. Однако есть возможность задать свое меню, которое будет всплывать. Остальные свойства этого заголовка соответствуют стандартным. Во время разработки заголовок виден, только если отключена сетка. Допускается размещение только одного компонента TCaptionRegion на данной форме; попытка размещения второго, как и в случае с предыдущим компонентом, приведет к сообщению об ошибке.

TTextExtRgn — внешний регион в виде надписи. Надпись может располагаться под углом к горизонтали. Многострочные надписи не поддерживаются. Свойства: Angle: Integer — угол поворота текста в десятых долях градуса (т.е. чтобы повернуть текст на 45 градусов, надо ввести 450). Font: TFont — шрифт надписи. Лучше всего использовать TrueType шрифты. Text: string — собственно текст надписи. Transparent: Boolean — если true, регион состоит из букв надписи. Если false — из прямоугольника с вырезанными буквами. Весьма интересное свойство, можно добиться интересных эффектов.
TSystemButton — позволяет создавать кнопки, которые выглядят так же, как системные кнопки в заголовке окна. Потомок THandlingControl. Свойства: AutoSize: Boolean — если True, кнопка корректирует свои размеры так, чтобы они всегда совпадали с размерами системных кнопок, установленными в системе. Glyph: TBitmap — картинка на поверхности кнопки. Игнорируется, если Kind <> sbGlyph. Свойство Kind типа TSysButtonKind, ко всему прочему, может принимать следующие значения: sbClose, sbMinimize, sbMaximize, sbHelp, sbGlyph, sbOwnerDraw, sbOwnerDrawFace.
TCaptionText — предназначен для создания меток, меняющих цвет в зависимости от активности окна. При использовании совместно с TCaptionRegion позволяет создавать иллюзию обычного заголовка. Потомок TGraphicControl.
Если же вы до сих пор программируете на Delphi 3.0 (неужели есть еще такие?), то вам очень поможет TFRManager — компонент, помогающий в разрешении тех конфликтных ситуаций, с которыми библиотека не может справиться автоматически. Эти ситуации возникают тогда, когда в процессе выполнения программы меняется дескриптор окна. (В Delphi 3.0 это происходит при изменении значений свойств BorderStyle и FormStyle.) Механизм изменения не допускает перехвата, поэтому отреагировать на него самостоятельно компоненты не могут. Перед изменением необходимо снять все перехватчики сообщений окна, а после изменения — вернуть их на место. TFRManager снимает все перехватчики компонентов библиотеки, но бессилен, если форма содержит какие-то другие компоненты, перехватывающие сообщения. Проблема может возникнуть только при использовании компонентов независимых производителей, так как среди стандартных компонентов Delphi таких нет. Должен заметить, что конфликт возникает не между этими компонентами и компонентами библиотеки, а, видимо, между компонентами и внутренними механизмами Delphi. Поэтому все подобные компоненты не смогут правильно отреагировать на изменение дескриптора независимо от того, используете ли Вы FormRgn или нет. Допускается размещение только одного компонента TFRManager на данной форме; попытка размещения второго приведет к сообщению об ошибке.

В качестве примера — рисунок 1 во всей красе представляет возможности вышеописанных компонентов.
И все было бы очень хорошо, если бы не парочка маленьких "но". Автор, за что ему честь и хвала, отметил их сам. И даже снабдил описанием решения некоторых проблем. Так, в режиме проектирования компонент TFormRegion с DrawOnDesigning = True не всегда правильно штрихует неклиентскую часть окна и области, занятые компонентами-наследниками TWinControl. Минимизируйте окно и восстановите его размеры — и все будет правильно. Горячие клавиши меню, подключенного к TCaptionRegion, работают, только если на форме нет ни одного компонента, получающего фокус ввода. Вряд ли это будет когда-нибудь исправлено, потому что механизм обработки событий от клавиатуры, включающийся в этом случае, скорее всего, вообще не допускает возможности перехвата, а горячие клавиши меню, подключенного к TMenuHotSpot, не работают вообще.
А в остальном, как радушно заверяли джентльмены прекрасную маркизу, все очень даже хорошо. Работают компоненты быстро, сильно не "жрут" ресурсы. Возможностей их запросто хватит на несколько таких же аналогов — один рельефный заголовок много стоит. От себя лично добавлю: рекомендую;).

Девизом же следующего обзора можно смело считать фразу "HTML без пределов!". TMS HTML не являются, как может показаться, компонентами ни для парсинга HTML-документов, ни для экспорта или импорта в этот популярный формат. Специфика их состоит в том, что они привносят возможность HTML-кодирования отображаемых компонентов интерфейса. Эта возможность не затрагивает основные положения GUI, как то форма кнопок или направление текста, но дает возможность разработать HTML-форматированный контент в инспекторе объектов Delphi или C++Builder. Так же, как и в гипертекстовом документе, программист может очень просто менять не только стили шрифтов и их порядок, но и осуществлять объединения объектов, которые при прямом программировании съели бы огромное количество времени. Так, можно изменить надпись на кнопке в соответствии с правилами HTML или выделить ключевые слова в текстовом окне красным жирным шрифтом. Конечно, велосипед авторы не изобрели, добавив HTML-форматирование в каждый из компонентов, ведь существует огромное множество путей реализации данной задачи. Однако избранный ими путь, как мне кажется, во многом превосходит остальные разработки в том, что является своего рода эталоном. Ведь язык разметки HTML знает практически каждый уважающий себя программист, причем на приличном среднем уровне. А значит, нет необходимости в сложном руководстве по кодированию к компонентам, как нет необходимости у разработчика тратить время на изучение какого-то другого языка со сложным синтаксисом. Да и гибкость, удобство HTML тут проявляется налицо. Не забывайте, что этот способ удобен со стороны экономии ресурсов — и картинки, и все строковые ресурсы можно хранить отдельно и загружать по необходимости. Замечу, что с DB-Aware компонентами можно использовать форматирование без каких-либо ограничений, а вставка данных в такие компоненты, как TDBHTMLabel, TDBAdvStringGrid, TDBSectionListBox, осуществляется с использованием тега <#FIELDNAME> .

Чтобы не быть голословным, приведу маленький пример. Зачастую случается так, что некоторая кнопка у вас в панели управления главой формы имеет два значения (положения). Скажем, "подключить" и "отключить" базу данных. Но когда кнопочек приличное количество, возникает проблема с пониманием их назначения у пользователя. Как известно, для прояснения данного факта существует всплывающая подсказка. Как один из вариантов, можно сделать простую подсказку — как у всех. Если же в вас тяга к прекрасному однообразным рабочим столом еще не убита, воспользуйтесь одном из предложенных компонентов — THTMLHint. В качестве примера смотрите рис. 1

Но возможности этих компонентов не ограничиваются всплывающими подсказками. Подобные манипуляции можно производить и с другими стандартными компонентами, как кнопки, выпадающий список, метки, статический текст, строка статуса и список-дерево.
Сначала обратимся к кнопкам, как неотъемлемой части любого приложения. Разработчики предлагают нам следующие возможности: выбор стиля кнопки (стандартный, плоский, старый от Борланд и TMS — от авторов), многострочный ввод текста и его HTML-форматирование. Этого вполне хватает для создания своих кнопок, удобных для вашего пользователя. Ограничивать вашу фантазию тут будет только сам язык HTML.
Как ответ на вопрос всех ищущих ComboBox'ы и StatusBar'ы с приятными и очень полезными мелочами, предлагаю воспользоваться аналогами из данного пакета. Используя HTML-форматирование, в выпадающем списке можно добиться большей структурированности данных — подпункты можно обозначить не только отступами справа и выделить цветом, но и сопроводить соответствующими картинками. А в панели состояния можно, кроме форматированного ввода текста со всеми возможностями HTML, вставлять и другие компоненты так же легко, как и на простую форму.
Вот что меня действительно поразило, так это возможности модернизированного TTreeView. Дело в том, что новые возможности позволяют качественно изменить внешний облик дерева, придав ему еще большую информативность и функциональность. В список-дерево можно вставлять и управлять стандартными компонентами Delphi: CheckBox, RadioButton. Как и в остальных компонентах, если необходимо, можно изменять стили текста, вставлять иконки и просто картинки, а также ассоциированные с расширением документов иконки использующих их приложений. Кроме того, в любом месте вы можете выделить некоторый текст или объект как ссылку. Ко всему этому, даже в одном отдельно взятом элементе списка-дерева, вы можете без труда совместить несколько объектов, будь то CheckBox, ссылка на почтовый ящик или выделенный красным цветом текст. Например, первое слово можно выделить жирным шрифтом, а остальное сделать ссылкой, предварительно разместив перед всем этим RadioButton, как показано на рис. 2


Остается только добавить, пожалуй, какие же возможности HTML поддерживают компоненты. Есть возможность использовать теги форматирования и оформления текста: жирный, курсив, подчеркнутый, перечеркнутый. Выделение параграфа и выравнивание строк по краям или по центру, разрыв строки и вставка горизонтальной полосы <HR> . Можно установить цвет шрифта и фона. Использование ссылок также доступно, как в любом редакторе HTML, — вы можете вставлять в текст просто ссылки вида <a href="http://mysite.gde_to.by">, но и ссылку на почтовый ящик: mailto:mymail@gde_to.by

Единственное, что, пожалуй, и удерживает многих от использования продукта, — это жадность авторов пакета. Не понимают они широты нашей души и природной тяги ко всему бесплатному. Вот вынь да положи им приличную сумму в мертвых американский президентах, иначе никак. Конечно, это является довольно существенной преградой для подавляющего большинства наших программистов. Вынужденные зачастую сами искать необходимые компоненты, они сильно ограничены в средствах, да и материальной помощи ждать особо неоткуда. Тем не менее, народная тропа к Интернету еще не заросла, и есть еще возможность разжиться возможным лекарством от жадности;). Но я вам этого не советовал;), сами знаете, что делать надо.

Денис Мигачев АКА Denver, fordenver@yahoo.com



Компьютерная газета. Статья была опубликована в номере 07 за 2002 год в рубрике программирование :: delphi

©1997-2024 Компьютерная газета