![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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);Пользуйтесь на здоровье!!! )))))))))))))))))) |