![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Плагин на Delphi. [D6, Win2k]
bloodman © (2004-07-09 00:56:00)Здравствуйте! Делаю программу работающую с плагинами. Пытаюсь сделать так , чтобы плагин сам мог рисовать нужные ему контролы и обрабатывать сообщения от них , но есть проблема: После создания контрола и присваивания ему парента , он не появляется на форме главного приложения , хотя свойство 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 - панел. Без контроллов.
В чем может быть проблемма?
bloodman (2004-07-09 16:41:00) [1]Разобрался я в проблемме: надо было parentWindow указать в самой библиотеке каждому контролу.
evvcom (2004-07-09 15:02:00) [2]
> 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 14:53:00) [3]Sharemem не помог :((
bloodman (2004-07-09 14:44:00) [4]//Гаврила © (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 сейчас попробую.
Palladin (2004-07-09 01:45:00) [5]А вот подробности построения прорабатываются в каждом случае отдельно. Общий случай - описан в статье.
Palladin (2004-07-09 01:44:00) [6]Взаимодействие должно быть двусторонним, PlugIn не может существовать без предоставляемого функционального интерфеса приложения IMyAppAPI (точнее конечно может, но ни к чему хорошему это не приведет), и соответственно приложению PlugIn как пятая нога без определенного IPlugin... если же все это работает через IDispatch и ипользуется в полной мере, будет построена вполне достойная система... COM... COM конечно может быть и не IDispatch, я не могу откровенно сказать в чем же конкретно заключается COM,( или ActiveX, а может все таки OLE) ? его критерии (и думаю никто не сможет), по этому скромненько ограничился понятием Interface, оно включает в себя все...
jack128 (2004-07-09 01:30:00) [7]
> 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:27:00) [8]Использование принципов COM (не самого COM, а его рядомстоящего, замечательной вещи: Interface, а может это был OLE? DDE? или таки AX... ) делает создание системы PlugIn'ов изящным как балет, самопал обычно не предрасполагает их расширяемость и рефакторинг... а если и располагает то выглядит все это гораздо сложней...
Sergey Kaminski (2004-07-09 01:20:00) [9]Или uses ShareMem;
Sergey Kaminski (2004-07-09 01:18:00) [10]А по-моему, совсем ни к чему сюда (и сюда тоже!) COM пихать. Вполне решается без лишних абстракций, к тому же влекущих дополнительные нагрузки на систему.
Впрочем, где у автора ветки грабли, что-то никак не пойму.Кажется все правильно, но не проверял.
Гаврила (2004-07-09 01:15:00) [11]согласен с Palladin для данного случая
а вообще тут явная путаница
передается и handle панели, и сама панель.
Кстати, передача панели в DLL (без определенных условий), карается неотвратимыми ошибками доступа к памяти.
Так что убери ее (pan:TWinControl) из параметров
глядишь, и заработает
Palladin (2004-07-09 01:03:00) [12]
> В чем может быть проблемма?
не по тому пути пошел...
http://podgoretsky.com/ftp/Docs/Delphi/Tenser/2/index.htm