Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.03 c
1-1089702141
fxmike
2004-07-13 11:02
2004.07.25
перебор компонентов формы


3-1088971224
Max Zyuzin
2004-07-05 00:00
2004.07.25
BDE и Referential Integrity


14-1089122964
Andryk
2004-07-06 18:09
2004.07.25
Западное общество загнивает?!


6-1085498736
diMAN
2004-05-25 19:25
2004.07.25
Выявление "коллизий" в сети


3-1088603725
Lesica
2004-06-30 17:55
2004.07.25
BDE транслирует поле типа MONEY в DECIMAL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский