Язык программирования Delphi. Улучшаем компоненты TShellTreeView и подобные:
В Delphi6 появилось несколько инетерных компонентов: TShellTreeView, TShellComboBox и TShellListView. Они прекрасно подходят для встраивания в твою прогу различных просмотрщиков, пролистывальщиков каталогов и файлов. Но в них заложены ны все необходимые возможности. Сегодня я покажу, как улучшить эти компоненты.
Как я уже сказал во вступлении к этому номеру, в конце июля я уезжаю в Москву. В настоящий момент, а именно сейчас, когда я набираю текст этого документа, я нахожусь в поезде и до Москвы осталось 3 часа езды. Именно так. Я пишу статью прямо в поезде используя свой notebook с процем pentium2. Хотя он не мой, мне его одолжили на время поездки, чтобы я смог работать. Но теперь я влюбился в эту игрушку и когда-нибудь обязательно куплю себе.
Ну ладно, не буду тратить время аккумуляторов, постараюсь как можнобольше написать. А когда приеду в гостиницу закончу начатую статью.
Как я уже сказал, в составе Delphi есть несколько полезных компонентов. Их функциональность можно расширить за счёт того, что они поставляются в исходниках. Можно конечно воспользоватся наследственностью объектно-ориентированного программированияи вывести потомков. Потом можно наелить их новыми свойствами. Я решил поступить по другому, а просто изменил исходники и перекомпилировал их.
Прежде чем приступать к коду, нужно удалить из Delphi уже установленные варианты компонентов. Это необходимо, потому что они встроены не из исходников, а из рантайм файлов. Это значит, что если ты модифицируешь исходники и попробуешь установить их в Delphi, то произойдёт ошибка. Delphi скажет, что у него уже есть такие компоненты, и не может установть ещё одни, с такими же именами.
Удаление происходит достаточно просто. Для этого закрой в Delphi все проекты File-> Close All (просто на всякий случай). После этого выбери меню Project->Options... Перед тобой появится окно настроек проекта по умлчанию. Перейди на закладку Packages и найди в списке строку "Shell ControlProperty and Component Editors", убери галочку напротив этой строки и потом нажми кнопку "Remove". Всё, теперь в Delphi Нет этих компонентов.
Теперь найди директорию Delphi6 (Диск:\Program files\Borland\Delphi6\). Здесь есть директория Demos. Если ты во время установки отказался от установки примеров, то вставь диск с Delphi и ищи эту папку здесь "Диск CD:\Install\Program files\Borland\Delphi6\". В папке Demos ты найдёшь другую интересную папку "ShellControls". Вот здесь и есть исходники этих компонентов. Точнее сказать. Здесь уже есть пакет включающий в себя исходники.
Мы не будем использовать уже готовый пакет, а создадим новый. Для этого выбери меню Component->Install Component. Перед тобой появится окно, как на рис 1. В этом окне перейди на закладку "Into new package" (В новый пакет).
Рис 1. Создание нового пакета
Теперь напротив первой строки ("Unit file name") щёлкни кнопку "Browse". Появится окно открытия файла. Выбери файл ShellCtrls.pas (он находится в директории "ShellControls" демонстрашек).
Едем дальше. Щёлкни напротив третей строки (Package file name) пимпу Browse. Опять будет окно открытия файла. Перейди в директорию демонстрашек, в папку "ShellControls", где находятся файлы исходников нужных нам компонент. Введи какое-нибудь имя (я ввёл CyDshell.dpk) и нажми "Открыть". Всё. Все поля заполнены. Можешь жать "ОК".
Рис 2. Окно нового пакета
Перед тобой появится окно нового пакета (рис 2). Внутри окна будет имя только одного файла (ShellCtrls.pas). Дважды щёлкни по нему, чтобы увидеть его содержимое.
Если ты сейчас попытаешься проинсталировать этот пакет, то в Delphi ничего нового не появится. Это потому, что код регистрации компонентов находится в другом файле. Давай внесём этот код в файл ShellCtrls.pas, чтобы не пришлось подключать другие файлы. Для этого найди строку с текстом "implementation" и добавь перед ней строку:
Этим я объявил процедуру Register - стандартная процедура, в которой пишется код регистрации компонентов.
Теперь напишем саму процедуру:
procedure Register;
begin
RegisterComponents('CyD', [TShellTreeView]);
RegisterComponents('CyD', [TShellComboBox]);
RegisterComponents('CyD', [TShellListView]);
end;
Внутри процедуры три строчки длч регистрации трёх компонентов TShellTreeView, TShellComboBox и TShellListView. Я написал этот код в конце файла перед строкой со словом "initialization".
Вообще-то непомешало бы объяснить, что означает строка "initialization". Хотя это мы не будем сегодня использовать, я решил объяснить. В принципе все просто:
initialization
Здесь находится код, который выполняется при старте модуля.
То есть при первом обращении к любому из содержащимуся в
модуле компоненту. При втором обращении к компоненту или
другому компоненту код вызыватся не будет.
finalization
Здесь находится код, который выполняется после уничожения
последней ссылки на компонент содержащийся в модуле, то есть
в самом конце.
end.
Обрати внимание, что после слова initialization ты не можешь релизовывать процедуры. Все процедуры и функции должны находится до этого слова.
Концом конструкции initialization и finalization является конец модуля, т.е. слово "END.".
Но это всё небольшое полезное отступление. Теперь вернёмся к нашим баранам.
Посмотрим на компонент TShellListView. Он происходит от компонента TCustomShellListView:
TShellListView = class(TCustomShellListView)
В свою очередь, TCustomShellListView происходит от TCustomListView. Это значит, что TShellListView должен обладать всеми свойствами TCustomListView, плюс свои новые свойства (это правило наследования Объектно-ориентированного программирования).
Но это не совсем так. Почему-то разработчики наследовали не все возможности. Например, отсутствует HotTrackStyles. Мы можем сами добавить это свойство. Просто добавь строку "property HotTrackStyles;" в объявления объекта TShellListView. Например так:
Всё. Мы добавили новое свойство. Больше ничего добавлять не надо, потому что это свойство уже реализовано у предка TCustomListView. Весь код теперь унаследуется автоматически.
На этом на сегодня хватит. Увидимся в следующий раз.