При разработке экспортеров для Delphi IDE, особенно при переходе от BPL к DLL, возникает необходимость перечисления всех форм, отображаемых в среде разработки. Один из способов - использование свойства Screen.Forms, однако это работает только для BPL-экспортеров. В случае DLL-экспортеров необходимо использовать другие подходы, например, OpenToolsAPI (OTA).
Почему Screen.Forms не подходит для DLL-экспортеров?
Свойство Screen.Forms предназначено для работы с глобальными данными VCL, к которым есть доступ из BPL-экспортеров. При использовании DLL-экспортера необходимо убедиться, что ваш DLL использует ту же инстанцию VCL, что и IDE. Это достигается путем компиляции DLL с опцией линкера "use runtime packages".
Использование OpenToolsAPI для перечисления форм
OpenToolsAPI предоставляет набор интерфейсов и классов для работы с IDE Delphi. Один из способов перечисления форм - использование нотификаторов, которые позволяют отслеживать открытие форм в IDE. Ниже приведен пример кода, который демонстрирует, как можно использовать нотификатор для получения списка открытых форм:
type
TFormNotifier = class(TNotifierObject, IOTAIDENotifier)
public
procedure FileNotification(NotifyCode: TOTAFileNotification; const FileName: String; var Cancel: Boolean);
end;
procedure RegisterIdeNotifier;
var
Services: IOTAServices;
begin
if BorlandIDEServices <> nil then
begin
Services := BorlandIDEServices as IOTAServices;
Services.AddNotifier(TFormNotifier.Create);
end;
end;
procedure RemoveIdeNotifier;
var
Services: IOTAServices;
begin
if IdeNotifierIndex <> -1 then
begin
Services := BorlandIDEServices as IOTAServices;
Services.RemoveNotifier(IdeNotifierIndex);
end;
end;
{ TFormNotifier }
procedure TFormNotifier.FileNotification(NotifyCode: TOTAFileNotification; const FileName: String; var Cancel: Boolean);
begin
if BorlandIDEServices <> nil then
if (NotifyCode = ofnFileOpening) then
begin
// Здесь можно реализовать логику для перечисления форм
end;
end;
initialization
RegisterIdeNotifier;
finalization
RemoveIdeNotifier;
end.
Также можно использовать процедуру GetOpenForms, которая перечисляет все открытые формы в IDE, используя OpenToolsAPI:
procedure GetOpenForms(List: TStrings);
var
Services: IOTAModuleServices;
I, J: Integer;
Module: IOTAModule;
Editor: IOTAEditor;
FormEditor: IOTAFormEditor;
begin
if (BorlandIDEServices <> nil) and (List <> nil) then
begin
Services := BorlandIDEServices as IOTAModuleServices;
for I := 0 to Services.ModuleCount - 1 do
begin
Module := Services.Modules[I];
for J := 0 to Module.ModuleFileCount - 1 do
begin
Editor := Module.ModuleFileEditors[J];
if Assigned(Editor) then
begin
if Supports(Editor, IOTAFormEditor, FormEditor) then
List.AddObject(FormEditor.FileName, Pointer(FormEditor.GetRootComponent));
end;
end;
end;
end;
end;
Важно отметить, что указатель в StringList является интерфейсом IOTAComponent, и для получения экземпляра TForm потребуется дополнительная обработка.
Заключение
Использование OpenToolsAPI позволяет разработчикам экспортеров для Delphi IDE получать доступ к информации о формах, открытых в среде разработки, что особенно полезно при работе с DLL-экспортерами. Приведенные примеры кода демонстрируют, как можно перечислить все открытые формы и отслеживать их изменение.
Использование OpenToolsAPI для перечисления всех форм в IDE Delphi с целью создания DLL-экспортера.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.