Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
ВнизПлагин на Delphi. Найти похожие ветки
← →
bloodman © (2004-07-09 00:56) [0]Здравствуйте! Делаю программу работающую с плагинами. Пытаюсь сделать так , чтобы плагин сам мог рисовать нужные ему контролы и обрабатывать сообщения от них , но есть проблема: После создания контрола и присваивания ему парента , он не появляется на форме главного приложения , хотя свойство TPanel.ControlCount показывает что он на ней присутствует(причем если таким методом создавать из главной формы то все работает). Вот код:
Dll:
function InitLib(App: Integer): Boolean;
begin
DLLApp :=Application;
Application :=TApplication(App);
end;
function ShowPanelControls(hPanel : HWND;pan:TWinControl):boolean;
begin
List:=TListBox.CreateParented(hPanel);
List.ParentFont:=False;
List.ParentColor:=False;
List.ParentCtl3D:=False;
List.Items.Add("Hello");
List.Top:=40;
List.Left:=40;
List.ParentWindow:=hPanel;
List.Parent:=pan;
List.Visible:=true;
result:=true;
end;
основная программа:
if not InitLib(Integer(Application)) then MessageDlg("Error!",mtError,[mbOK],0);
if not ShowPanelControls(pMain.Handle,pMain) then MessageDlg("Error!",mtError,[mbOK],0);
pMain - панел. Без контроллов.
В чем может быть проблемма?
← →
Palladin © (2004-07-09 01:03) [1]
> В чем может быть проблемма?
не по тому пути пошел...
http://podgoretsky.com/ftp/Docs/Delphi/Tenser/2/index.htm
← →
Гаврила © (2004-07-09 01:15) [2]согласен с Palladin для данного случая
а вообще тут явная путаница
передается и handle панели, и сама панель.
Кстати, передача панели в DLL (без определенных условий), карается неотвратимыми ошибками доступа к памяти.
Так что убери ее (pan:TWinControl) из параметров
глядишь, и заработает
← →
Sergey Kaminski (2004-07-09 01:18) [3]А по-моему, совсем ни к чему сюда (и сюда тоже!) COM пихать. Вполне решается без лишних абстракций, к тому же влекущих дополнительные нагрузки на систему.
Впрочем, где у автора ветки грабли, что-то никак не пойму.Кажется все правильно, но не проверял.
← →
Sergey Kaminski (2004-07-09 01:20) [4]Или uses ShareMem;
← →
Palladin © (2004-07-09 01:27) [5]Использование принципов COM (не самого COM, а его рядомстоящего, замечательной вещи: Interface, а может это был OLE? DDE? или таки AX... ) делает создание системы PlugIn"ов изящным как балет, самопал обычно не предрасполагает их расширяемость и рефакторинг... а если и располагает то выглядит все это гораздо сложней...
← →
jack128 © (2004-07-09 01:30) [6]
> Palladin © (09.07.04 01:03)
А не могли бы прояснить причем здесь интерфейсы?
Вы предлогаете объявить некий интефейс
IMyControl = interface
propery Top: Integer read GetTop write SetTop;
property Parent: THandle read GetParent write SetParent;
// и так далее
end;
и чтобы длл возвращала это интерфейс, а основно приложение само решало, что с ним делать?
← →
Palladin © (2004-07-09 01:44) [7]Взаимодействие должно быть двусторонним, PlugIn не может существовать без предоставляемого функционального интерфеса приложения IMyAppAPI (точнее конечно может, но ни к чему хорошему это не приведет), и соответственно приложению PlugIn как пятая нога без определенного IPlugin... если же все это работает через IDispatch и ипользуется в полной мере, будет построена вполне достойная система... COM... COM конечно может быть и не IDispatch, я не могу откровенно сказать в чем же конкретно заключается COM,( или ActiveX, а может все таки OLE) ? его критерии (и думаю никто не сможет), по этому скромненько ограничился понятием Interface, оно включает в себя все...
← →
Palladin © (2004-07-09 01:45) [8]А вот подробности построения прорабатываются в каждом случае отдельно. Общий случай - описан в статье.
← →
bloodman © (2004-07-09 14:44) [9]//Гаврила © (09.07.04 01:15) [2]
//Так что убери ее (pan:TWinControl) из параметров
//глядишь, и заработает.
без нее было , тоже не работает ,у меня работало так:
dll
function InitLib(App: Integer): Boolean;
begin
DLLApp :=Application;
Application :=TApplication(App);
Application.CreateForm(TfmDLL, fmDLL);
result:=true;
end;
function ShowPN(pn: HWND): Pointer;
begin
fmDLL.pnDLL.Parent:=nil;
fmDLL.pnDLL.ParentWindow:=pn;
Result:=fmDLL.pnDLL;
end;
fmDLL - форма, на ней размещена панель pnDLL на которой размещены контролы.
программа:
if not InitLib(Integer(Application)) then MessageDlg("Error!",mtError,[mbOK],0);
p:= TPanel(ShowPN(fCDBase.pMain.Handle));
p.Align:=alClient;
p.Parent:=fCDBase.pMain;
p.BorderStyle:=bsNone;
p.BevelInner:=bvNone;
p.BevelOuter:=bvNone;
p.BevelWidth:=1;
p - пустая панель .
Переносильсь все работало , НО при клику правой кнопкой мыши по такой панели появлялось сообщение :
Control (или что-то еще не помню) has NO PARENT WINDOW. Поэтому я решил пойти по другому - создавать каждый контрол в отдельности и присваивать им как парент панель из программы.Контрол то ведь создаеся! Только не показывается!!
//Sergey Kaminski (09.07.04 01:18) [3]
Грабли в том что этот контрол не показывается.
uses ShareMem сейчас попробую.
← →
bloodman © (2004-07-09 14:53) [10]Sharemem не помог :((
← →
evvcom © (2004-07-09 15:02) [11]
> bloodman © (09.07.04 14:44) [9]
Проблема скорее всего в том, что не используются run-time package. Из-за этого возникает стандартная ошибка, которую я уже устал подробно описывать. Вкраце, в exe и dll присутствует один и тот же код классов, но классы эти не отрабатывают с "чужими" объектами, хотя и полностью идентичны.
Если использовать run-time packages, то код классов уже не будет дублироваться в разных модулях, но это наложит другие ограничения. И exe и dll должны быть скомпилированы в одной версии Delphi и на машине, куда будут установлены эти модули, также должны присутствовать run-time packages (файлы *.bpl).
Соответственно такой подход сразу отсекает программистов, пишущих на других языках (например, С++), и даже тех, кто пишет в другой версии Delphi!
Вывод. Использовать универсальные средства, т.е. то, что предлагал Palladin © (09.07.04 01:03) [1].
← →
bloodman © (2004-07-09 16:41) [12]Разобрался я в проблемме: надо было parentWindow указать в самой библиотеке каждому контролу.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.037 c