Как создать расширение оболочки Property sheet

Обработчик Property sheet позволяет добавить в окно свойств файла или файлов дополнительные вкладки.

В библиотеке Shell Ace обработчик Property sheet реализует следующие интерфейсы:

После создания проекта расширения необходимо добавить в проект модуль с обработчиком Property sheet. Для этого выберите соответствующую иконку на вкладке Shell extension:

Создание обработчика Property sheet

Появится окно с предложением ввести имя класса и выбрать перекрываемые методы:

Методы обработчика Property sheet

После нажатия на кнопку OK в проект будет добавлен модуль с каркасом обработчика. Каркас состоит непосредственно из кода разработчика и формы, которая будет отображаться на дополнительной вкладке в окне свойств файла. При включении опции Create sample помимо каркаса обработчика будут создан пример готового расширения оболочки, который можно использовать для изучения библиотеки.

При необходимости добавления нескольких вкладок нужно добавить в проект дополнительные формы. Для этого необходимо выбрать на вкладке Shell extension значок Property sheet form:

Добавление дополнительной вкладки для обработчика Property sheet

Непосредственно сам процесс создания расширения состоит из написания кода перекрываемых методов обработчика и формы. В обработчике можно перекрывать следующие виртуальные процедуры и функции:

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 являются следующие методы:

Также обязательными для реализации в классе формы является методы LoadData

Смотрите также: