Динамическое создание TPanel с загрузкой из DLL/SO
Модератор: Модераторы
Динамическое создание TPanel с загрузкой из DLL/SO
Есть ли способ загрузить целиком (вместе с установленными на нее другими компонентами) TPanel из динамической библиотеки?
Я придумал только втихую (не показывая) создать форму в динамической библиотеке вытащить оттуда указатель на TPanel, передать его в основное окно. Но при попытке сменить родителя (свойство parent) на основную форму - динамическая библиотека вылетает без объяснения причин.
Добавлено спустя 12 минут 3 секунды:
Хотя я понимаю, что это, скорее всего, неосуществимо. Но мало ли, вдруг у кого есть какие идеи по этому поводу...
Добавлено спустя 35 минут 32 секунды:
И, вот еще какая идея: может есть возможность использовать форму в качестве панели? Таким макаром я бы подгружал форму из динамической библиотеки, и вставлял бы прямо на главную форму.
Я придумал только втихую (не показывая) создать форму в динамической библиотеке вытащить оттуда указатель на TPanel, передать его в основное окно. Но при попытке сменить родителя (свойство parent) на основную форму - динамическая библиотека вылетает без объяснения причин.
Добавлено спустя 12 минут 3 секунды:
Хотя я понимаю, что это, скорее всего, неосуществимо. Но мало ли, вдруг у кого есть какие идеи по этому поводу...
Добавлено спустя 35 минут 32 секунды:
И, вот еще какая идея: может есть возможность использовать форму в качестве панели? Таким макаром я бы подгружал форму из динамической библиотеки, и вставлял бы прямо на главную форму.
-
NTFS
- постоялец
- Сообщения: 388
- Зарегистрирован: 05.11.2007 13:57:50
- Откуда: Краснодар
- Контактная информация:
1) Забудь про использование dll/so при разработке на FreePascal.
2) Если все же нужно, поищи, как это делалось для Delphi, и реализуй то же самое для FreePascal. Для Windows - механизм почти одинаковый. Для Linux - сильно зависит от виджетов, нужно искать.
3) Наиболее правильно - хранить в dll не панель, а "рендер" - набор команд, который создает и форматирует панель в хост-приложении. Этим способом достигается офигенная переносимость и масштабируемость - но нужно менять всю архитектуру приложения.
2) Если все же нужно, поищи, как это делалось для Delphi, и реализуй то же самое для FreePascal. Для Windows - механизм почти одинаковый. Для Linux - сильно зависит от виджетов, нужно искать.
3) Наиболее правильно - хранить в dll не панель, а "рендер" - набор команд, который создает и форматирует панель в хост-приложении. Этим способом достигается офигенная переносимость и масштабируемость - но нужно менять всю архитектуру приложения.
NTFS писал(а):1) Забудь про использование dll/so при разработке на FreePascal.
Это еще почему? Имхо, на фри паскале вполне себе ловко получается.
NTFS писал(а):Если все же нужно, поищи, как это делалось для Delphi, и реализуй то же самое для FreePascal. Для Windows - механизм почти одинаковый.
Это я уже и сам догадался
NTFS писал(а):Наиболее правильно - хранить в dll не панель, а "рендер" - набор команд, который создает и форматирует панель в хост-приложении. Этим способом достигается офигенная переносимость и масштабируемость
Это я согласен и тоже уже думал об этом. Но такой код ведь сам себя не напишет, в отличии от формочки, которую можно быстренько накидать в редакторе.
Кстати, а может есть такая тулза? Ну чтоб формочку переконвертить в код динамического ее создания? Было бы очень полезно включить такой инструмент в лазаруса
NTFS писал(а):но нужно менять всю архитектуру приложения.
Я еще не начинал писать, поэтому не страшно
Погуглите по ключевым словам ComponentToString и StringToComponent. Не совсем динамическое создание, но тоже вполне можно использовать при нужде.
pihter писал(а):NTFS писал(а):1) Забудь про использование dll/so при разработке на FreePascal.
Это еще почему? Имхо, на фри паскале вполне себе ловко получается.
А пример можете показать?
Пример чего? использования внешней библиотеки? легко
Код: Выделить всё
unit HpleiDll;
{$mode objfpc}{$H+}
interface
// Реализация интерфейса обмена через библиотеку hplei.dll
uses Windows;
const
HEE_FUNCTION_NO_ERROR=0;
HEE_INVALID_LASER_HANDLE=-1;
HEE_FUNCTION_ERROR=-2;
function Laser_Create:DWORD; cdecl; external 'hplei.dll';
function Laser_Delete(dwLaser:DWORD):longint; cdecl; external 'hplei.dll';
implementation
end.
pihter писал(а):Я придумал только втихую (не показывая) создать форму в динамической библиотеке вытащить оттуда указатель на TPanel, передать его в основное окно. Но при попытке сменить родителя (свойство parent) на основную форму - динамическая библиотека вылетает без объяснения причин.
Родителя пиши не в Parent, а в ParentWindow.
в Parent же присваивай nil;
Код: Выделить всё
procedure ShowPN(MainPanel: HWND);
begin
frmDLL.pnlDLL.Parent := nil;
frmDLL.pnlDLL.ParentWindow := MainPanel;
frmDLL.Visible := False;
end;Я в главное окно из DLL-ки вообще всю форму пихаю, хотя тоже думал заморачиваться через панельки
Talker1 писал(а):Я в главное окно из DLL-ки вообще всю форму пихаю, хотя тоже думал заморачиваться через панельки)
Похоже что в LCL обошли одну из "недоработок" VCL, надо будет попробовать.
Добавлено спустя 12 минут 23 секунды:
Talker1 писал(а):Я в главное окно из DLL-ки вообще всю форму пихаю, хотя тоже думал заморачиваться через панельки)
Если на панельку кинуть кнопку, и задать обработчик кнопки из главного приложения, получится облом.
А вообще говоря, такой прием и в дельфе работал (без обработчика, конечно).
stanilar писал(а):Если на панельку кинуть кнопку, и задать обработчик кнопки из главного приложения, получится облом.
Ну, у меня не было пока нужды привязывать к кнопке из DLL обработчик из главной формы...
stanilar писал(а):А вообще говоря, такой прием и в дельфе работал (без обработчика, конечно).
В смысле, прием вставки панели из DLL в главную форму или же вставки всей DLL-формы в главную?
У меня в Дельфях так и не получилось по-нормальному вставить dll-форму в главную - вставить вставляется, но фокус на эту вставленную форму передается с трудом, только тыканьем правой кнопкой мыши, а по кнопке [TAB] фокус не хочет передаваться, сразу же выскакивает на главную.
А прием переноса панельки в главную, нормально, конечно работает.
За давностью лет не помню точно как оно было. Но мне надо было присвоить обработчик из главного приложения, поэтому быстро перешел на bpl.
