Страница 1 из 1
		
			
				Как вставить форму из dll в pagecontrol?
				
Добавлено: 
15.09.2014 22:30:27 Sharfik
				При создании формы из 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;
 
В рамках программы все работает, вытаскиваю форму инспектор в длл, становиться все грустно.
Почему класс вынесенный в отдельную библиотеку не принимается?
 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
15.09.2014 22:58:04 zub
				>>Почему класс вынесенный в отдельную библиотеку не принимается?
Потому что он имеет все свое - не только application со всей его тряхомудией, а весь rtl. Пока в fpc не появится поддержки динамический пакетов говорить что
>>При создании формы из dll проблем не было
нельзя((
			 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
15.09.2014 23:07:45 Sharfik
				т.е. по простому форму засунуть не получится. Либо инспектор данных создавать средствами программы(какой то обобщенный вид) и цеплять из dll скажем только заполнение строк каких то с параметрами и их обработку, либо отдельная весящая форма, либо ..."глубопая печаль"
			 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
15.09.2014 23:22:46 zub
				>>т.е. по простому форму засунуть не получится
А зачем?
Наформошлепаную насколько понимаю неполучится, либо получится с условно работающими костылями.
Создаваемую в рантайме получится, экспортировав в длл процедуры создания нужных контролов. Также можно создать форму в программе напрямую из lfm идущей вместе dll, останется только придумать как привязать контролы к данным и обработчикам событий
>>и цеплять из dll скажем только заполнение строк каких то с параметрами и их обработку
Управляемые компилятором типы данных тоже туда-сюда гонять нестоит по причине 2х копий rtl
			 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
16.09.2014 03:21:24 Ism
				Может через  Form1.Parent ?
			 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
16.09.2014 15:10:27 Sharfik
				Не поможет.
Вчера прочитал что в С есть возможность экспортировать и импортировать классы из библиотек, но повторить это тут похоже не получится.
			 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
16.09.2014 17:44:40 zub
				>>но повторить это тут похоже не получится.
Рано или поздно получится. но пока 
пакеты только в плпнах((
 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
17.09.2014 04:47:27 Sharfik
				хм, как тогда сделать редактор свойств расширяемый 

 Можно конечно попробовать сделать форму типовую, с 4-мя методами которые вынесены в библиотеку, но тогда привязываться к контролу придется.
 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
17.09.2014 19:24:00 Ism
				Можно быдло способом, вызвать форму и задать ей размеры и координаты таба
Ну и другое поведение прописать, визуально не особо отличаться будет, правда это при условии, что можно управлять свойствами формы dll
			 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
17.09.2014 19:38:30 zub
				Забить, и пока сделать расширяемость в виде "uses модульсфичей", т.е. расширение функционала без внесения изменений в основную программу, простым подключением модулей
			 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
18.09.2014 01:39:04 Sharfik
				zub писал(а):Забить, и пока сделать расширяемость в виде "uses модульсфичей", т.е. расширение функционала без внесения изменений в основную программу, простым подключением модулей
Идея была в том, чтобы к готовой платформе программы цеплять плагинами допфункции в зависимости от требований инженера. Без компиляций.
 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
21.09.2014 23:24:51 stanilar
				Плагины можно эмулировать скриптерами.
			 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
21.09.2014 23:53:33 zub
				>>Идея была в том, чтобы к готовой платформе программы цеплять плагинами допфункции в зависимости от требований инженера. Без компиляций.
Расчеты никто немешает пихать в дллки.
Для "гуя" имхо лучше всего подойдет универсальный инспектор объектов созданый в ексе и отображающий данные из длл. Для сложных случаев я уже предлагал создание гуя ексешником из отдельно наформошлепаного lfm (делается в пару строк, лишьбы контролы используемые в lfm были зарегистрированы в exe), cозданные едиты-комбики-кнопочки можно привязать к данным и процедурам в длл например используя имена контролов - тоже думаю несложно сделать
			 
			
		
			
				Re: Как вставить форму из dll в pagecontrol?
				
Добавлено: 
14.12.2014 17:39:52 Sharfik
				Новый вопрос:Добавляю формы в 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);