![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 20.01.2008
Сообщений: 24
|
![]()
Такой вот вопросик.
Что нужно написать в коде программы, чтобы она нашла все имеющиеся у нее в каталоге DLL`ки и "забрала" у них их внутрении меню, включив эти меню в свое главное меню? Точнее что написать - второй вопрос, а первый - как организовать между программой и динамически подгружаемой DLL при инициализации последней обмен ссылками на компоненты, например, чтобы DLL-ка, приняв указатель на главное меню программы, смогла бы в этом меню накрутить что душе библиотечной угодно, например MainMenu.Items.Insert(0, Menu_from_DLL.Items) Использую тип вызова процедуры инициализации DLL-ки register и включаю модуль ShareMem в библиотеку и программу - вроди бы без ошибок на первый взгляд, НО! невероятным образом обработчики событий OnClick изменяются следующим образом: 1. Первым MenuItem вставляется меню из DLL 2. Существующие в меню программы двигаются вправо 3. Обработчики первого (точнее нулевого) MenuItem работают корректно 4. Обработчики следующего за ни - копируются из предыдущего (то есть библиотечного) 5. ...и это при том, что Sender остается из меню библиотеки, а не из того MenuItem (программы), который вызвал процедуру-обработчик Помогите справиться с этим чудом, плз. Или может быть есть менее извращенный способ написания плагинов? Спасибо. |
![]() |
![]() |
![]() |
#2 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
Странно тут Вы все сделали
![]() Код:
![]() ну пример поиска по индексу функции в длл на экспорт Код:
![]() да и еще таким образом в директиве uses у вас будет Windows ну может еще что ![]() |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 20.01.2008
Сообщений: 24
|
![]()
Ммм, наверно я не совсем точно проблему описал.
Дело не в том, чтобы организовать при помощи DLL механизм изменения главного меню программы, а в принципе его (меню) один раз изменить при инициадизации библиотеки и всё. Кстати TMenuItem - это не структура, а класс, причем уже существующий в VCL, это те самые пункты, которые мы видим в меню, открывая его (Open File, Edit, Cut, Paste...) Вот пример того, что мне нужно: Код:
|
![]() |
![]() |
![]() |
#4 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
Я Вам не помогу извените... я предпочитаю подход который я описал Выше, для меня в нем все более понятно. А все добавления меню делать в программе...
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 20.01.2008
Сообщений: 24
|
![]()
а что у Вас за подход - я тоже Вас не понял) Вы предложили, чтобы DLL формировала некоторую структуру, по которой программа будет редактировать меню. Это хорошо и понятно. Но как быть с обработчиками событий нажатия OnClick каждого из созданных программой пунктов меню по структуре из DLL? только если в структуру еще включить адрес на обработчика, прописанного в DLL - это трудоемкая работка. Желательно, чтобы в DLL мне нужно было бы всего лишь создать компонент TMainMenu например на DataModul`e и создать в нем всю нужную структуру пунктов и назначить для них обработку и написать для них код автоматизированными средствами Delphi, а не вручную все это делать (потом много придется писать подобных DLL-ок и часто изменять меню в них - нужно чтобы бало как можно проще, без большого кода)
|
![]() |
![]() |
![]() |
#6 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
Пишите процедуру обработки пункту типа
Код:
следовательно OnClick := @OnClickFirstItemMenu; отсюда и отталкивайтесь. А потом в форме вы получаете PItemMenu и чтобы обратиться к обработчику делаете типа TMenuItem.OnClick := TNotifyEvent(PItemMenu^.OnClick); вроде так или даже без TNotifyEvent. Последний раз редактировалось BOBAH13; 20.01.2008 в 23:55. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 20.01.2008
Сообщений: 24
|
![]()
Ах ну да, прошу пращения, не заметил OnClick в структуре.
... MenuItem.OnClick:=TNotifyEvent(PMen uItem^.OnClick) Значит придется в DLL писать нечто в роде построителя этой самой структуры по существующему компоненту TMainMenu, которую нужно отдавать приложению при инициализации DLL... неужели нельзя какой-нибудь Assign использовать... лень писать ![]() Благодарю за помощь |
![]() |
![]() |
![]() |
#8 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
В том то и дело что лень писать
![]() ![]() |
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 20.01.2008
Сообщений: 24
|
![]()
Да VCL все равно придется использовать, там ведь меню нужно только для того, чтобы вызывать остальные функции обработки данных, уже реально большие функции, формы, компоненты наборы данных и т.п... так что бог уж с ним размером
![]() |
![]() |
![]() |
![]() |
#10 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
![]()
Я имел ввиду передать данные в программу на уровне Api и Pascal
![]() А в проге в цикле через длл узнаем кол-во пунктов в длл и for i:= 0 to countitemfromdll do begin TMenuItem := TMenuItem.Create(NIL); ну тут свой-ва присваиваем из PItemMenu тут уже Menu.AddItem .. или как там, лень лезть смотреть с утра. end Вот и все.... после в длл можно ту структуру пунктов разрушить, и соответственно больше к ней не обращаться или сделать типа инициализации структуры и разрущения ее. Но указатели на обработки всеравно уже остануться и на них ( в длл ) будет ссылаться программа. Что Вас именно еще интерисует ? Если Вы конкретно еще не поняли могу попробывать сделать пример даже, если не буду занят. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Создание вкладки. | фЁдОр | Общие вопросы Delphi | 10 | 11.02.2008 16:27 |
Создание dll | John_chek | Общие вопросы Delphi | 3 | 24.09.2007 14:26 |
Помогите с разработкой приложения с поддержкой плагинов. | krik | Общие вопросы Delphi | 3 | 17.06.2007 13:40 |
Написание программ или плагинов для тюнера Behold TV | СТРАННИК | Общие вопросы Delphi | 0 | 29.01.2007 09:54 |