Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Улучшение взаимодействия элементов управления в плагинах Delphi: решение проблем с фокусом и родительскими окнами

Delphi , Файловая система , DLL и PlugIns

При разработке плагинов для приложений на Delphi часто возникают проблемы, связанные с взаимодействием элементов управления. Одной из таких проблем является некорректное получение фокуса элементами управления, созданными в плагинах, а также ошибки, связанные с отсутствием родительского окна.

Описание проблемы

Разработчик пытается создать систему плагинов для своего приложения, используя библиотеку jvPlugin. Формы, созданные в плагине, перемещаются в DevExpress docking controls. На первый взгляд, всё работает корректно, но элементы управления на формах плагина не получают фокус, и при попытке взаимодействия с некоторыми элементами, например, TSplitter, возникает исключение "Control 'xxx' has no parent window".

Пример кода

IPluginHost = interface
  ['{C0416F76-6824-45E7-8819-414AB8F39E19}']
  function AddDockingForm(AForm: TForm): TObject;
  function GetParentApplicationHandle: THandle;
end;

IMyPlugin = interface
  ['{E5574F27-3130-4EB8-A8F4-F709422BB549}']
  procedure AddUIComponents;
end;

procedure TMyPlugin.JvPlugInInitialize(Sender: TObject; var AllowLoad: Boolean);
var
  RealApplicationHandle: THandle;
begin
  if Supports(HostApplication.MainForm, IPluginHost, FPluginHost) then
  begin
    RealApplicationHandle := Application.Handle;
    Application.Handle := FPluginHost.GetParentApplicationHandle;
    try
      FMyPluginForm:= TMyPluginForm.Create(Application);
    finally
      Application.Handle := RealApplicationHandle;
    end;
  end;
end;

procedure TMyPlugin.AddUIComponents;
begin
  FPluginHost.AddDockingForm(FMyPluginForm);
end;

function TfrmMyPluginHost.AddDockingForm(AForm: TForm): TObject;
var
  DockPanel: TdxDockPanel;
begin
  DockPanel := TdxDockPanel.Create(Self);
  DockPanel.Name := DPName;
  DockPanel.DockTo(dxDockSite1, dtBottom, 0);
  DockPanel.AutoHide := TRUE;
  DockPanel.Caption := AForm.Caption;
  DockPanel.Tag := Integer(AForm);
  AForm.Parent := DockPanel;
  AForm.BorderStyle := bsNone;
  AForm.Align := alClient;
  AForm.Show;
  Result := DockPanel;
end;

Подтвержденное решение

Причиной возникновения проблемы является использование отдельных копий RTL, VCL и прочих используемых модулей в DLL и хост-приложении. Для решения этой проблемы необходимо использовать runtime packages. Это позволит интегрировать плагин с хост-приложением, использующим runtime packages, и устранить проблемы с фокусом и родительскими окнами.

Альтернативное решение

В качестве альтернативы можно использовать runtime packages, добавив в проект все необходимые зависимости, включая DX и другие используемые библиотеки. Необходимо убедиться, что все три пакета (vcl, rtl, и собственный пакет, содержащий зависимости) распространяются вместе с исполняемым файлом.

Заключение

Для улучшения взаимодействия элементов управления в плагинах Delphi и решения проблем с фокусом и родительскими окнами необходимо использовать runtime packages. Это обеспечит совместное использование RTL, VCL и других ресурсов между плагином и хост-приложением, что позволит избежать многих проблем, связанных с изолированным использованием ресурсов в DLL.

Создано по материалам из источника по ссылке.

Проблема связана с разработкой плагинов для приложений на Delphi, где элементы управления, созданные в плагине, не получают фокус и возникают ошибки из-за отсутствия родительского окна, что можно решить, используя runtime packages для совместного использ


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-10 13:47:06/0.0034818649291992/0