Динамическое создание TPanel с загрузкой из DLL/SO

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение pihter » 11.12.2013 13:47:44

Есть ли способ загрузить целиком (вместе с установленными на нее другими компонентами) TPanel из динамической библиотеки?

Я придумал только втихую (не показывая) создать форму в динамической библиотеке вытащить оттуда указатель на TPanel, передать его в основное окно. Но при попытке сменить родителя (свойство parent) на основную форму - динамическая библиотека вылетает без объяснения причин.

Добавлено спустя 12 минут 3 секунды:
Хотя я понимаю, что это, скорее всего, неосуществимо. Но мало ли, вдруг у кого есть какие идеи по этому поводу...

Добавлено спустя 35 минут 32 секунды:
И, вот еще какая идея: может есть возможность использовать форму в качестве панели? Таким макаром я бы подгружал форму из динамической библиотеки, и вставлял бы прямо на главную форму.
pihter
новенький
 
Сообщения: 12
Зарегистрирован: 13.01.2010 02:40:33

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение NTFS » 11.12.2013 17:02:57

1) Забудь про использование dll/so при разработке на FreePascal.
2) Если все же нужно, поищи, как это делалось для Delphi, и реализуй то же самое для FreePascal. Для Windows - механизм почти одинаковый. Для Linux - сильно зависит от виджетов, нужно искать.
3) Наиболее правильно - хранить в dll не панель, а "рендер" - набор команд, который создает и форматирует панель в хост-приложении. Этим способом достигается офигенная переносимость и масштабируемость - но нужно менять всю архитектуру приложения.
NTFS
постоялец
 
Сообщения: 388
Зарегистрирован: 05.11.2007 14:57:50
Откуда: Краснодар

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение pihter » 12.12.2013 05:22:57

NTFS писал(а):1) Забудь про использование dll/so при разработке на FreePascal.


Это еще почему? Имхо, на фри паскале вполне себе ловко получается.

NTFS писал(а):Если все же нужно, поищи, как это делалось для Delphi, и реализуй то же самое для FreePascal. Для Windows - механизм почти одинаковый.


Это я уже и сам догадался :)

NTFS писал(а):Наиболее правильно - хранить в dll не панель, а "рендер" - набор команд, который создает и форматирует панель в хост-приложении. Этим способом достигается офигенная переносимость и масштабируемость


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

Кстати, а может есть такая тулза? Ну чтоб формочку переконвертить в код динамического ее создания? Было бы очень полезно включить такой инструмент в лазаруса

NTFS писал(а):но нужно менять всю архитектуру приложения.


Я еще не начинал писать, поэтому не страшно :)
pihter
новенький
 
Сообщения: 12
Зарегистрирован: 13.01.2010 02:40:33

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение B4rr4cuda » 14.01.2014 14:09:38

Погуглите по ключевым словам ComponentToString и StringToComponent. Не совсем динамическое создание, но тоже вполне можно использовать при нужде.
Аватара пользователя
B4rr4cuda
энтузиаст
 
Сообщения: 693
Зарегистрирован: 28.12.2007 07:48:35

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение debi12345 » 14.01.2014 18:33:49

Динамическое создание TPanel с загрузкой из DLL/SO

А что - runtime-paсkаges (BPL) уже работают ? В FPC-логах написать забыли что ли ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение Sharfik » 16.01.2014 11:53:39

pihter писал(а):
NTFS писал(а):1) Забудь про использование dll/so при разработке на FreePascal.

Это еще почему? Имхо, на фри паскале вполне себе ловко получается.

А пример можете показать? :roll:
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение MiniQ » 16.01.2014 16:14:01

Пример чего? использования внешней библиотеки? легко
Код: Выделить всё
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.
MiniQ
новенький
 
Сообщения: 81
Зарегистрирован: 28.01.2013 16:31:55

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение debi12345 » 16.01.2014 17:00:01

Пример чего? использования внешней библиотеки?

Рантайм-создание формы или компонента, спроектированных в GUI-дизайнере. Ессно с привязкой GUI-событий, определенных также в GUI-дизайнере.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение Talker1 » 17.01.2014 12:10:18

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
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение stanilar » 20.01.2014 17:41:49

Talker1 писал(а):Я в главное окно из DLL-ки вообще всю форму пихаю, хотя тоже думал заморачиваться через панельки :))


Похоже что в LCL обошли одну из "недоработок" VCL, надо будет попробовать.

Добавлено спустя 12 минут 23 секунды:
Talker1 писал(а):Я в главное окно из DLL-ки вообще всю форму пихаю, хотя тоже думал заморачиваться через панельки :))


Если на панельку кинуть кнопку, и задать обработчик кнопки из главного приложения, получится облом.
А вообще говоря, такой прием и в дельфе работал (без обработчика, конечно).
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение Talker1 » 21.01.2014 10:25:53

stanilar писал(а):Если на панельку кинуть кнопку, и задать обработчик кнопки из главного приложения, получится облом.

Ну, у меня не было пока нужды привязывать к кнопке из DLL обработчик из главной формы...

stanilar писал(а):А вообще говоря, такой прием и в дельфе работал (без обработчика, конечно).

В смысле, прием вставки панели из DLL в главную форму или же вставки всей DLL-формы в главную?
У меня в Дельфях так и не получилось по-нормальному вставить dll-форму в главную - вставить вставляется, но фокус на эту вставленную форму передается с трудом, только тыканьем правой кнопкой мыши, а по кнопке [TAB] фокус не хочет передаваться, сразу же выскакивает на главную.

А прием переноса панельки в главную, нормально, конечно работает.
Аватара пользователя
Talker1
новенький
 
Сообщения: 54
Зарегистрирован: 16.07.2013 18:45:45

Re: Динамическое создание TPanel с загрузкой из DLL/SO

Сообщение stanilar » 21.01.2014 17:19:21

За давностью лет не помню точно как оно было. Но мне надо было присвоить обработчик из главного приложения, поэтому быстро перешел на bpl.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 224

Рейтинг@Mail.ru