Как создать расширение оболочки Property sheet
Обработчик Property sheet позволяет добавить в окно свойств файла или файлов дополнительные вкладки.
В библиотеке Shell Ace обработчик Property sheet реализует следующие интерфейсы:
- IShellPropSheetExt
- IShellExtInit
После создания проекта расширения необходимо добавить в проект модуль с обработчиком Property sheet. Для этого выберите соответствующую иконку на вкладке Shell extension:
Появится окно с предложением ввести имя класса и выбрать перекрываемые методы:
После нажатия на кнопку OK в проект будет добавлен модуль с каркасом обработчика. Каркас состоит непосредственно из кода разработчика и формы, которая будет отображаться на дополнительной вкладке в окне свойств файла. При включении опции Create sample помимо каркаса обработчика будут создан пример готового расширения оболочки, который можно использовать для изучения библиотеки.
При необходимости добавления нескольких вкладок нужно добавить в проект дополнительные формы. Для этого необходимо выбрать на вкладке Shell extension значок Property sheet form:
Непосредственно сам процесс создания расширения состоит из написания кода перекрываемых методов обработчика и формы. В обработчике можно перекрывать следующие виртуальные процедуры и функции:
procedure Initialize;
Процедура инициализации обработчика, вызывается один раз при создании экземпляра обработчика.
procedure Clear;
Процедура вызывается при завершении работы с текущим списком файлов, переданных в обработчик.
class function GetClassID: TCLSID;
Функция должна возвращать уникальный идентификатор обработчика. Библиотека Shell Ace изначально генерирует уникальный идентификатор при генерации шаблона обработчика, поэтому менять его нет необходимости.
class function GetDescription: UnicodeString;
Функция должна возвращать описание обработчика.
procedure FillProgIDList(AList: TStrings);
В процедуре должно происходить заполнение списка AList ключами реестра, в которые будет прописан обработчик при регистрации расширения. Регистрация происходит в раздел реестра HKEY_CLASSES_ROOT. Например, если будет добавлен ключ .bmp, то расширение будет прописано в ветку HKEY_CLASSES_ROOT\.bmp\ShellEx\PropertySheetHandlers и будет соответствовать всем файлам, имеющим расширение bmp, а если будет добавлен ключ SystemFileAssociations\Audio, то расширение будет прописано в ветку HKEY_CLASSES_ROOT\SystemFileAssociations\Audio\ShellEx\PropertySheetHandlers и будет соответствовать всем файлам, расширения которых имеют PerceivedType Audio.
Примеры ключей реестра:
Ключ реестра | Примечание |
---|---|
ProgID | |
.Расширение | |
SystemFileAssociations\.Расширение | |
SystemFileAssociations\PerceivedType | |
Kind.Kind | |
Unknown | Файл, не имеющий описанного в реестве расширения |
* | Любой файл |
Directory | Физическая директория |
Folder | Виртуальная директория |
В общем случае рекомендуется регистрировать расширение на ProgID расширения файла.
function GetPageCount: Integer;
Функция должна вернуть количество вкладок, которое расширение будет создавать для списка файлов, переданных в расширение. Функция вызывается в реализации метода AddPages интерфейса IShellPropSheetExt. Список файлов можно получить, воспользовавшись методом CreateCurrentFileList. Функция возвращает объект класса TStrings, содержащий список файлов. В версиях Delphi вплоть до версии 2009, в которых тип string равен типу AnsiString, имена файлов в списке хранятся в формате UTF8. Объект должен быть уничтожен после его обработки. Также доступны функции GetCurrentFileListCount, которая возвращает количество файлов, и GetFirstOfCurrentFileList, которая возвращает первый элемент списка (с нулевым индексом).
procedure GetPageParams(AIndex: Integer; var ATitle, AIconRes: UnicodeString; var AIcon: HICON; var AFlags: TdecPropertySheetFlags);
Процедура должна определить параметры создаваемой вкладки, имеющей индекс AIndex. Процедура вызывается в реализации метода AddPages интерфейса IShellPropSheetExt
Параметр ATitle определяет заголовок вкладки.
Параметры AIconRes и AIcon определяют иконку, которая будет прорисовываться рядом с заголовком вкладки. Если значение AIcon определено, то будет использоваться иконка с идентификатором (handle) AIcon. Если же значение AIcon равно нулю, то AIconRes определяет название ресурса в dll-файле расширения, в котором расположена иконка. Если же и AIconRes равна пустой строке, то ни какая иконка не будет использоваться.
Тип TdecPropertySheetFlags определен следующим образом:
TdecPropertySheetFlag = (pshHelp);
TdecPropertySheetFlags = set of TdecPropertySheetFlag;
Значение pshHelp, соответствующее флагу PSP_HASHELP, обозначает, что для вкладки будет доступной кнопка Help.
function CreatePage(AIndex: Integer): TWinControl;
Функция должна создать форму, которая будет использоваться в качестве дополнительно вкладки. Параметр AIndex определяет индекс вкладки.
В классе формы можно перекрывать следующие виртуальные процедуры и функции:
procedure LoadData(AList: TStrings);
Функция должна загрузить содержимое, которое будет отображаться на вкладке. Список AList содержит список файлов, переданных в обработчик. В версиях Delphi вплоть до версии 2009, в которых тип string равен типу AnsiString, имена файлов в списке хранятся в формате UTF8.
function GetInitialControl: HWND;
Функция вызывается при приходе в диалоговую процедуру обработчика сообщения WM_NOTIFY с кодом PSN_QUERYINITIALFOCUS. Функция должна вернуть идентификатор (handle) элемента управления, который будет иметь фокус ввода при выборе пользователем данный вкладки.
function Activate: Boolean;
Функция вызывается при выборе пользователем вкладки, при этом в диалоговую процедуру обработчика приходит сообщение WM_NOTIFY с кодом PSN_SETACTIVE. Функция должна вернуть True, если выбор вкладки возможен, в противном случае False.
function Deactivate: Boolean;
Функция вызывается в ситуации, когда вкладка является текущей, и пользователь выбирает другую вкладку или же закрывает окно свойств, при этом в диалоговую процедуру обработчика приходит сообщение WM_NOTIFY с кодом PSN_KILLACTIVE. Функция должна вернуть True, если уход с вкладки возможен, в противном случае False. При возврате значения False хорошей практикой является показ сообщения, объясняющего пользователю причину того, что с вкладки нельзя уйти в данный момент времени.
function QueryCancel: Boolean;
Функция вызывается в ситуации, когда пользователь нажал кнопку Cancel для возврата в исходное состояние измененных данных на вкладке, при этом в диалоговую процедуру обработчика приходит сообщение WM_NOTIFY с кодом PSN_QUERYCANCEL. Функция должна вернуть True, если измененные данные были возвращены в исходное состояние, в противном случае False.
function ApplyChanged: Boolean;
Функция вызывается в ситуации, когда пользователь нажал кнопку Ok для сохранения измененных данных на вкладке, при этом в диалоговую процедуру обработчика приходит сообщение WM_NOTIFY с кодом PSN_APPLY. Функция должна вернуть True, если измененные данные были сохранены, в противном случае False.
procedure ResetChanged;
Процедура вызывается в ситуации, когда система запрашивает возврат в исходное состояние измененных данных на вкладке, при этом в диалоговую процедуру обработчика приходит сообщение WM_NOTIFY с кодом PSN_RESET.
procedure RunHelp;
Процедура вызывается в ситуации, когда пользователь нажал кнопку Help для отображения справки о текущей вкладке, при этом в диалоговую процедуру обработчика приходит сообщение WM_NOTIFY с кодом PSN_HELP. Кнопка Help доступна только для вкладок, созданных с флагом pshHelp.
Обязательными для реализации в обработчике Property sheet являются следующие методы:
- GetClassID
- FillProgIDList
- GetPageCount
- CreatePage
Также обязательными для реализации в классе формы является методы LoadData
Смотрите также:
- Что такое расширение оболочки
- Какие бывают расширения оболочки
- Как создать расширение оболочки
- Инициализация расширений оболочки
- Как создать расширение оболочки Context menu
- Как создать расширение оболочки Drag and drop context menu
- Как создать расширение оболочки Drop target
- Как создать расширение оболочки Icon
- Как создать расширение оболочки Info tip
- Как создать расширение оболочки Overlay icon
- Как создать расширение оболочки Preview
- Как создать расширение оболочки Property sheet
- Как создать расширение оболочки Property store
- Как создать расширение оболочки Thumbnail
- Как зарегистрировать расширение оболочки
- Как отлаживать расширение оболочки
- Использование логов