Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.25;
Скачать: CL | DM;

Вниз

Плагин на 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.053 c
1-1089299151
Andy BitOff
2004-07-08 19:05
2004.07.25
Мистика !!! Где утечка ???


1-1089601985
Kost
2004-07-12 07:13
2004.07.25
Взаимозависимые классы


3-1088411194
homer
2004-06-28 12:26
2004.07.25
Соединение к базе


3-1088552573
Alexey Leonchik
2004-06-30 03:42
2004.07.25
Быстрый поиск по первым символам


3-1088573748
Ratiborr
2004-06-30 09:35
2004.07.25
На сколько облегчает DLL