Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.12.2009, 23:32
PG81 PG81 вне форума
Прохожий
 
Регистрация: 15.10.2009
Сообщения: 31
Репутация: 10
По умолчанию Панель управления из DLL для управления формой из DLL

дочерние MDI формы находятся в DLL, dll-это плагины. Подскажите можно ли сделать так
1)чтобы при установке этого так называемого плагина на главной форме появлялись дополнительные кнопки в панели управления, которые бы выполняли определеные действия в форме из плагина.
2)в главной форме даже не известно что эти кнопки на панели будут выполнять.Чтобы плагин сам все настраивал
3)При этом если запущено несколько экземпляров дочерних форм из этого плагина, то панель с кнопками была бы одна и управляла бы выбранной формой.(не очень обязательно, но желательно)
4)при выборе окна из другого плагина, чтобы кнопки были не активны
5)при закрытии окна, чтобы панель не пропадала и загрузилась при запуске программы в следующий раз, или может как-то зарание настраивалась бы это(тоже не очень обязательно, но желательно)
Ответить с цитированием
  #2  
Старый 02.12.2009, 08:38
Аватар для glaZZ
glaZZ glaZZ вне форума
Прохожий
 
Регистрация: 18.11.2008
Сообщения: 26
Репутация: 10
По умолчанию

Я бы наверное сделал следующим образом (обозначу только общую логику):
1) Основная программа при старте ищет плагины/dll, поочередно их подключает и при подключении вызывает какую-либо единую для всех плагинов функцию, которая собственно и будет указывать основной форме, что добавлять и куда. Для реализации этого глянь мануалы по работе с длл и создании элементов управления в процессе выполнения программы.
2) Ну собственно говоря при создании кнопки необходимо ей на событие onclick назначить вызов определенной функции из плагина. Как реализовать не скажу - нет делфи под рукой.
3) Самое простое на мой взгляд - не связывать добавление кнопок и отображение экземпляра дочерней формы. Т.е. при старте программы плагин подключается и сразу добавляются кнопки, а потом уже при необходимости создаются экземпляры дочерних форм. Иначе можно перед добавлением кнопок проверять их наличие, или же сразу после добавления записывать определенное значение в файл настроек (скажем в обычный ini) и при подключении плагина проверять это значение. А чтобы кнопки управляли именно выбранной формой, достаточно просто получить имя формы, которая находится в фокусе.
4) Ну опять таки можно проверять, какое окно получило фокус, а какое потеряло. Если фокус получило окно, не связанное с плагином, просто ставить кнопкам свойство enabled в false.
5) Опять таки можно использовать файл настроек (или реестр) и при старте программы проверять значение данной настройки.

P.S.: если что-то не так понял, прошу строго не судить скажу только то, что все выше перечисленное можно реализовать и не одним способом.
Ответить с цитированием
  #3  
Старый 02.12.2009, 09:12
PG81 PG81 вне форума
Прохожий
 
Регистрация: 15.10.2009
Сообщения: 31
Репутация: 10
По умолчанию

Цитата:
Сообщение от glaZZ
1) Основная....
Тут вроед все ясно, конечно хотелось бы немного почитать чегонть, если есть ссылки буду рад
Цитата:
Сообщение от glaZZ
2) Ну собственно говоря при создании кнопки необходимо ей на событие onclick назначить вызов определенной функции ...
вот тут немного не ясно как действовать.Я хочу организовать подобную технологию для любых плагинов, я думаю так. сделать интерфейс для всех дочерних окон, в котором будет одна фанкция с параметром, в параметре указывать какая кнопка эту функцию запустила.Любая добавленая кнопка на понели задач будет получать интерфейс дочерней формы и выполнять эту функцию передавая параметр, например текстовый 'parAdd','parDel' ну и т.д. и форма уже сама обрабатывает параметр и выполняет действия в соответствии с ним.Подскажите если что не правильно думаю
Цитата:
Сообщение от glaZZ
3) Самое простое ....
4) Ну опять таки м...
5) Опять таки мож....
Тут тоже вроед все ясно, опять же хотелось бы немного почитать чегонть, если есть ссылки буду рад
Ответить с цитированием
  #4  
Старый 02.12.2009, 09:41
Аватар для glaZZ
glaZZ glaZZ вне форума
Прохожий
 
Регистрация: 18.11.2008
Сообщения: 26
Репутация: 10
По умолчанию

Очень много полезной информации есть в разделе FAQ данного сайта http://www.delphisources.ru/pages/faq.html
В данном случае наиболее полезны будут разделы
http://www.delphisources.ru/pages/faq/file_system.html
http://www.delphisources.ru/pages/fa...s_classes.html
Ответить с цитированием
  #5  
Старый 02.12.2009, 09:50
Аватар для glaZZ
glaZZ glaZZ вне форума
Прохожий
 
Регистрация: 18.11.2008
Сообщения: 26
Репутация: 10
По умолчанию

А вообще если честно, то не очень понятно, зачем такие трудности себе создавать? Гораздо проще было бы в плагине реализовать дочернюю форму целиком со всеми необходимыми кнопками и прочими контроллами и при необходимости в родительской форме создавать нужное количество экземпляров этой дочерней формы. Не пришлось бы мучаться со многими вещами Т.е. если на пальцах - в плагине/dll создана самодостаточная форма, которая только лишь передает родительской форме результаты своей работы.
Ответить с цитированием
  #6  
Старый 02.12.2009, 15:54
PG81 PG81 вне форума
Прохожий
 
Регистрация: 15.10.2009
Сообщения: 31
Репутация: 10
По умолчанию

заказчику хоцца чобы как в MS SQL Server было все кнопки на панели задач были, проитв этого не порпешь))), мое мнение тоже такое лучше чтобы каждая форма была самодостаточной
Ответить с цитированием
  #7  
Старый 02.12.2009, 16:09
PG81 PG81 вне форума
Прохожий
 
Регистрация: 15.10.2009
Сообщения: 31
Репутация: 10
По умолчанию

сделал таким образом (тестовый вариант)
PHP код:
procedure TfrmMDI_dll.FormActivate(SenderTObject);
var 
MainForm:IMainForm;//интерфейс главной формы
btn:tbutton;
begin
  
if not application.MainForm.GetInterface(IMainForm,MainForm)then exit;
  
MainForm.setdsc(dsc);//в этой процедуре в главной форме на DBNav вешается источник данных TDataSource
  
btn:=MainForm.getbtn;//функция главной формы возвращает ссылку на кнопку
  
if not assigned(btn)then exit;
    
btn.OnClick:=Button1Click;//вешаем на нее метод из плагина
    
btn.Enabled:=true;
end
GLAZZ как такой вариант оценишь?
хотел сделать на OnDeactivate чтобы btn.Enabled:=false , но он как-то срабатывает не понятно когда ему вздумается, особенно если есть дочерние локальные формы не из плагинов.
Тут еще нарисовалось парочка проблем
1)не работают свойства MDIChildCount, и ActiveMDIChild.
MDIChildCount=только количество локальных дочерних форм
ActiveMDIChild=nil или ссылка на локальные дочерние формы
если передавать в плагин screen то ситуация немного меняется
MDIChildCount отображает правильно, то тогда выдается сообщение об ошибке "cannot assign Tfont to a tfont" при показе подсказок
а ActiveMDIChild по прежнему не выдает форму из плагина
screnn не передаю и веду отдельный свой список форм запущеных из плагина и там уже среди них искать активные
2)табуляция на форме из плагина не работает
Вот как эти вопросы решить?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:10.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025