|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Программа с поддержкой плагинов
Дело вот в чем:
Пишу программу с поддержкой плагинов. Создал прогу и 1 плаигин - все хорошо. Прога грузить плагин, появляется пункт меню с данными из плагина, кликаем - MDI окно из плагина. ОК. Но как только я создал второй плаигн, то понял, что хоть программа грузить все 2 плагина - регистрируется в ней только первый загруженный! Меню появляется 2, но оба с данными из первого загруженного плагина. В качестве плагинов использую пакеты. Необходимо подгружать плагины при старте программы, а выгружать по ее завершению, дабы в процессе работы можно было эти плагины использовать! При необходимости могу предоставить используемый код. Заранее благодарю, Олег. P.S. Плагины подгружаю через LoadPackage в массив HMODULE. Мой мир! Мои правила! Как хочу, так и нарушаю! |
#2
|
||||
|
||||
Ну что могу сказать, при загрузки плагинов (form create) скорее всего есть ошибка, поэтому собственно и выполняет всего 1 плагин.
Поэтому есть 2 варианта: или выложи код с загрузкой / запуском плагинов или поищи вот сдесь, может чего и найдешь: http://api.farmanager.com/ru/articles/delphisimple.html и вот тут: http://www.realcoding.net/article/view/828 Помогаю за Спасибо |
#3
|
||||
|
||||
v1s2222 - спасибо за помощь, пороюсь на твоих ссылках, а пока:
Вот код загрузки плагинов: Код:
procedure TMainForm.FormCreate(Sender: TObject); var i: Integer; PluginsList: TStringList; PlugMenuClass: TPluginMenuClass; // тип описывающий все что нужно для меню плагина begin PluginsList := TStringList.Create; PluginsList := FindPlugins(ExtractFilePath(Application.ExeName)); // ищим все плагины и создаем список адресов файлов PluginsList.Sort; // вот здесь решается порядок загрузки плагинов :) SetLength(hPack, PluginsList.Count); // устанавливаю размер массива HMODULE равный кол-ву найденных плаинов for i := 0 to PluginsList.Count - 1 do begin hPack[i] := LoadPackage(PluginsList[i]); // гружу плагин if hPack[i] > 0 then begin PlugMenuClass := TPluginMenuClass(GetClass('TPluginMenu')); // получаю данные для меню if Assigned(PlugMenuClass) then begin with PlugMenuClass.Create(Self) do // создаю меню для плагина begin OnClick := OpenPluginForm; // процедура запускает плагин ShowHint := True; Name := 'PM' + IntToStr(i); // задаю имя пункта меню (пока на всякий случай) end; mmComponents.Add(TPluginMenu(Self.FindComponent('PM' + IntToStr(i)))); // добавляю меню плагина в меню программы end; end; end; PluginsList.Free; end; P.S. Ксожалению, по указанным ссылкам, ничего мне подходящего не нашел Но спасибо за попытку помочь. P.S. (2) Проверенно! Handle hPack[0] и hPack[1] (ну соответственно и дальше так будет) отличаются, а это значит, что в каждый hPack ГРУЗИТСЯ СВОЙ ПЛАГИН! НО ПОЧЕМУ ОН НЕ РАБОТАЕТ!!!!????? Мой мир! Мои правила! Как хочу, так и нарушаю! Последний раз редактировалось Rastaman, 03.10.2010 в 16:10. |
#4
|
||||
|
||||
Возможно ошибка при запуске плагина:
Код:
... OnClick := OpenPluginForm; // процедура запускает плагин ... Проверь ту процедуру, возможно именно она запускает один и тот же плагин... Помогаю за Спасибо |
#5
|
||||
|
||||
Цитата:
Нет, нет! Дело в том, что еще при запуске программы и открытия основного пункта меню (куда меню плагинов добавляются) имеется ряд пунктов меню в количестве загруженных плагинов, но, что названия, что подскажки и т.д. - все от первого загруженного плагина. (Открываешь прогу - а там 2 пункта от первого плагина "Блокнот" ) P.S. Вот процедура запуска плагина: Код:
procedure TMainForm.OpenPluginForm(Sender: TObject); var PackForm: TForm; FormClass: TFormClass; begin // Получаем имя формы плагина из его меню и поехали... FormClass := TFormClass(GetClass(TPluginMenu(Sender).PlugForm)); if Assigned(FormClass) then begin PackForm := FormClass.Create(Self); PackForm.Show; end else raise Exception.Create( 'Ошибка! Неудалось открыть окно плагина. Класс не найден.'); end; Мой мир! Мои правила! Как хочу, так и нарушаю! Последний раз редактировалось Rastaman, 03.10.2010 в 16:36. |
#6
|
||||
|
||||
Программа с поддержкой плагинов
Все разрешилось! Ура!
Вот код: (пока решал немного переделал) Данный код можно использовать для создания своих таких программ! При этом, как обычных, так и MDI !!! Основная программа: Код:
type TPlugInfo = record Caption: TCaption; Hint: String; end; IPInt = interface ['{85022A81-9BA8-4B23-815D-C25B03432E6A}'] function GetInfo: TPlugInfo; end; TPComp = class(TComponent) end; TPCompClass = class of TPComp; ............................................... public hPack: array of HMODULE; end; ............................................... // Процедура поиска и загрузки плагинов procedure TMainForm.LoadPlugins; function NewPlugMenuItem(const ACaption, AHint, AName: string; AOnClick: TNotifyEvent): TMenuItem; begin Result := TMenuItem.Create(nil); with Result do begin Caption := ACaption; Hint := AHint; Name := AName; OnClick := AOnClick; end; end; var I: Integer; PluginsList: TStringList; PComp: TPComp; PCompClass: TPCompClass; PInt: IPInt; PlugInfo: TPlugInfo; begin PluginsList := TStringList.Create; try PluginsList := FindPlugins(ExtractFilePath(Application.ExeName)); PluginsList.Sort; SetLength(hPack, PluginsList.Count); for I := 0 to PluginsList.Count - 1 do begin PComp := nil; PInt := nil; hPack[i] := LoadPackage(PluginsList[i]); if hPack[i] > 0 then begin PCompClass := TPCompClass(GetClass('TPC')); if Assigned(PCompClass) then begin PComp := PCompClass.Create(Self); PComp.GetInterface(IPInt, PInt); PlugInfo := PInt.GetInfo; try mmComponents.Add(NewPlugMenuItem(PlugInfo.Caption, PlugInfo.Hint, 'PM' + IntToStr(I), OpenPluginForm)); finally PComp.Free; UnRegisterClass(GetClass('TPC')); end; end; end; end; finally PluginsList.Free; end; end; // Процедура вызова плагина procedure TMainForm.OpenPluginForm(Sender: TObject); var PackForm: TForm; FormClass: TFormClass; begin FormClass := TFormClass(GetClass(TMenuItem(Sender).Hint)); if Assigned(FormClass) then begin PackForm := FormClass.Create(Self); PackForm.Show; end else raise Exception.Create( 'Ошибка! Неудалось открыть окно плагина. Класс не найден.'); end; Плагин: Код:
type TPlugInfo = record Caption: TCaption; Hint: String; end; IPInt = interface ['{85022A81-9BA8-4B23-815D-C25B03432E6A}'] function GetInfo: TPlugInfo; end; TPC = class(TComponent, IPInt) public function GetInfo: TPlugInfo; end; .......................... { TPC } function TPC.GetInfo: TPlugInfo; begin Result.Caption := 'Тестовый'; Result.Hint := 'TTestForm'; end; initialization RegisterClass({Та форма из плагина (главная), которую будем грузить при его вызове}); RegisterClass(TPC); Пользуйтесь на здоровье!!! )))))))))))))))))) Мой мир! Мои правила! Как хочу, так и нарушаю! |