Как вставить форму из dll в pagecontrol?

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

Как вставить форму из dll в pagecontrol?

Сообщение Sharfik » 15.09.2014 22:30:27

При создании формы из dll проблем не было, но как попытался внедрить форму в pagecontrol через функцию manualdock вылетает все с ошибкой
control of class TTabsheet can't have control of class TFMyFormInspector as child

Где то встречал обсуждение, что при работе exe+dll для библиотеки создается другой Application, и из-за этого модальные формы не так себя ведут, как надо. Пробовал передавать адрес Application в dll, как ниже показано, без толку.
Код: Выделить всё
function PluginWindow: Pointer; stdcall;
var
   index:integer;
   NewForm:TForm;
   ExeApplication:TApplication;
begin
try
    Result := nil;
    NewForm:= nil;
    if  Assigned(ThisApp) then
    begin
          if  Assigned(ThisApp.PluginStackData1) then
          begin
      ExeApplication:=TApplication(ThisApp.PluginStackData2);
                ExeApplication.CreateForm(TFInspector,NewForm);
    end;
   Result := NewForm;
end;
except
      On E:exception do
      MessageDlg(E.Message,mtError,[mbOK],0);
end;
end;

В рамках программы все работает, вытаскиваю форму инспектор в длл, становиться все грустно.

Почему класс вынесенный в отдельную библиотеку не принимается?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 788
Зарегистрирован: 20.07.2013 01:04:30

Re: Как вставить форму из dll в pagecontrol?

Сообщение zub » 15.09.2014 22:58:04

>>Почему класс вынесенный в отдельную библиотеку не принимается?
Потому что он имеет все свое - не только application со всей его тряхомудией, а весь rtl. Пока в fpc не появится поддержки динамический пакетов говорить что
>>При создании формы из dll проблем не было
нельзя((
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как вставить форму из dll в pagecontrol?

Сообщение Sharfik » 15.09.2014 23:07:45

т.е. по простому форму засунуть не получится. Либо инспектор данных создавать средствами программы(какой то обобщенный вид) и цеплять из dll скажем только заполнение строк каких то с параметрами и их обработку, либо отдельная весящая форма, либо ..."глубопая печаль"
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 788
Зарегистрирован: 20.07.2013 01:04:30

Re: Как вставить форму из dll в pagecontrol?

Сообщение zub » 15.09.2014 23:22:46

>>т.е. по простому форму засунуть не получится
А зачем?
Наформошлепаную насколько понимаю неполучится, либо получится с условно работающими костылями.
Создаваемую в рантайме получится, экспортировав в длл процедуры создания нужных контролов. Также можно создать форму в программе напрямую из lfm идущей вместе dll, останется только придумать как привязать контролы к данным и обработчикам событий

>>и цеплять из dll скажем только заполнение строк каких то с параметрами и их обработку
Управляемые компилятором типы данных тоже туда-сюда гонять нестоит по причине 2х копий rtl
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как вставить форму из dll в pagecontrol?

Сообщение Ism » 16.09.2014 03:21:24

Может через Form1.Parent ?
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Как вставить форму из dll в pagecontrol?

Сообщение Sharfik » 16.09.2014 15:10:27

Не поможет.
Вчера прочитал что в С есть возможность экспортировать и импортировать классы из библиотек, но повторить это тут похоже не получится.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 788
Зарегистрирован: 20.07.2013 01:04:30

Re: Как вставить форму из dll в pagecontrol?

Сообщение zub » 16.09.2014 17:44:40

>>но повторить это тут похоже не получится.
Рано или поздно получится. но пока пакеты только в плпнах((
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как вставить форму из dll в pagecontrol?

Сообщение Sharfik » 17.09.2014 04:47:27

хм, как тогда сделать редактор свойств расширяемый :( Можно конечно попробовать сделать форму типовую, с 4-мя методами которые вынесены в библиотеку, но тогда привязываться к контролу придется.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 788
Зарегистрирован: 20.07.2013 01:04:30

Re: Как вставить форму из dll в pagecontrol?

Сообщение Ism » 17.09.2014 19:24:00

Можно быдло способом, вызвать форму и задать ей размеры и координаты таба
Ну и другое поведение прописать, визуально не особо отличаться будет, правда это при условии, что можно управлять свойствами формы dll
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Как вставить форму из dll в pagecontrol?

Сообщение zub » 17.09.2014 19:38:30

Забить, и пока сделать расширяемость в виде "uses модульсфичей", т.е. расширение функционала без внесения изменений в основную программу, простым подключением модулей
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как вставить форму из dll в pagecontrol?

Сообщение Sharfik » 18.09.2014 01:39:04

zub писал(а):Забить, и пока сделать расширяемость в виде "uses модульсфичей", т.е. расширение функционала без внесения изменений в основную программу, простым подключением модулей

Идея была в том, чтобы к готовой платформе программы цеплять плагинами допфункции в зависимости от требований инженера. Без компиляций.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 788
Зарегистрирован: 20.07.2013 01:04:30

Re: Как вставить форму из dll в pagecontrol?

Сообщение stanilar » 21.09.2014 23:24:51

Плагины можно эмулировать скриптерами.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02

Re: Как вставить форму из dll в pagecontrol?

Сообщение zub » 21.09.2014 23:53:33

>>Идея была в том, чтобы к готовой платформе программы цеплять плагинами допфункции в зависимости от требований инженера. Без компиляций.
Расчеты никто немешает пихать в дллки.
Для "гуя" имхо лучше всего подойдет универсальный инспектор объектов созданый в ексе и отображающий данные из длл. Для сложных случаев я уже предлагал создание гуя ексешником из отдельно наформошлепаного lfm (делается в пару строк, лишьбы контролы используемые в lfm были зарегистрированы в exe), cозданные едиты-комбики-кнопочки можно привязать к данным и процедурам в длл например используя имена контролов - тоже думаю несложно сделать
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Как вставить форму из dll в pagecontrol?

Сообщение Sharfik » 14.12.2014 17:39:52

Новый вопрос:
Добавляю формы в PageControl, могу скрыть табы, но не знаю как перебрать табы, чтобы найти таб с нужной мне формой и сделать его видимым.
Так внедряю формы:
Код: Выделить всё
                               FCustomInspector.ManualDock(APageControlInspector,nil,alClient);
                               FCustomInspector.RefreshFormData(nil,0);
                               FCustomInspector.Show;

Вот такой вариант перебора почему то не прокатывает, хоть в инете примеры именно так перебор выполеяют
Код: Выделить всё
if FCustomInspector.HostDockSite<>nil then
begin
    //
    for y := 0 to APageControlInspector.DockClientCount-1 do
    begin
      //не заходит сюда вообще
       showmessage(APageControlInspector.DockClients[y].ClassName);
   end;
end;


...... :!:

Вроде нашел решение, но вопрос как получить ссылку на форму которая через ManualDock вставлена остается.

Решение такое:
Код: Выделить всё
procedure ShowInspector(AInspectorList: TList; APageControlInspector:TPageControl);
...
TabSheet:=APageControlInspector.AddTabSheet;
TabSheet.Caption:=FCustomInspector.Caption;
FCustomInspector.ManualDock(TabSheet,nil,alClient);
FCustomInspector.RefreshFormData(nil,0);
FCustomInspector.Align:=alClient; //Обязательная строка, без нее отрисовка будет глючить.
FCustomInspector.Show;
VisibleTabs.Add(TabSheet);
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 788
Зарегистрирован: 20.07.2013 01:04:30


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Рейтинг@Mail.ru