Страница 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);