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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.10.2010, 15:29
Аватар для Rastaman
Rastaman Rastaman вне форума
Прохожий
 
Регистрация: 09.09.2009
Адрес: Ставрополь
Сообщения: 6
Репутация: 10
Восклицание Программа с поддержкой плагинов

Дело вот в чем:
Пишу программу с поддержкой плагинов. Создал прогу и 1 плаигин - все хорошо. Прога грузить плагин, появляется пункт меню с данными из плагина, кликаем - MDI окно из плагина. ОК.
Но как только я создал второй плаигн, то понял, что хоть программа грузить все 2 плагина - регистрируется в ней только первый загруженный! Меню появляется 2, но оба с данными из первого загруженного плагина.
В качестве плагинов использую пакеты.
Необходимо подгружать плагины при старте программы, а выгружать по ее завершению, дабы в процессе работы можно было эти плагины использовать!
При необходимости могу предоставить используемый код.
Заранее благодарю, Олег.

P.S.
Плагины подгружаю через LoadPackage в массив HMODULE.
__________________
Мой мир! Мои правила! Как хочу, так и нарушаю!
Ответить с цитированием
  #2  
Старый 03.10.2010, 15:36
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Ну что могу сказать, при загрузки плагинов (form create) скорее всего есть ошибка, поэтому собственно и выполняет всего 1 плагин.
Поэтому есть 2 варианта:
или выложи код с загрузкой / запуском плагинов
или поищи вот сдесь, может чего и найдешь:
http://api.farmanager.com/ru/articles/delphisimple.html
и вот тут:
http://www.realcoding.net/article/view/828
__________________
Помогаю за Спасибо
Ответить с цитированием
  #3  
Старый 03.10.2010, 15:52
Аватар для Rastaman
Rastaman Rastaman вне форума
Прохожий
 
Регистрация: 09.09.2009
Адрес: Ставрополь
Сообщения: 6
Репутация: 10
Восклицание

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  
Старый 03.10.2010, 16:18
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Возможно ошибка при запуске плагина:
Код:
  ...  
  OnClick := OpenPluginForm; // процедура запускает плагин
  ...

Проверь ту процедуру, возможно именно она запускает один и тот же плагин...
__________________
Помогаю за Спасибо
Ответить с цитированием
  #5  
Старый 03.10.2010, 16:32
Аватар для Rastaman
Rastaman Rastaman вне форума
Прохожий
 
Регистрация: 09.09.2009
Адрес: Ставрополь
Сообщения: 6
Репутация: 10
Восклицание

Цитата:
Сообщение от v1s2222
Возможно ошибка при запуске плагина:
Код:
  ...  
  OnClick := OpenPluginForm; // процедура запускает плагин
  ...

Проверь ту процедуру, возможно именно она запускает один и тот же плагин...

Нет, нет! Дело в том, что еще при запуске программы и открытия основного пункта меню (куда меню плагинов добавляются) имеется ряд пунктов меню в количестве загруженных плагинов, но, что названия, что подскажки и т.д. - все от первого загруженного плагина.
(Открываешь прогу - а там 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  
Старый 03.10.2010, 22:48
Аватар для Rastaman
Rastaman Rastaman вне форума
Прохожий
 
Регистрация: 09.09.2009
Адрес: Ставрополь
Сообщения: 6
Репутация: 10
Восклицание Программа с поддержкой плагинов

Все разрешилось! Ура!

Вот код:
(пока решал немного переделал)
Данный код можно использовать для создания своих таких программ! При этом, как обычных, так и 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);

Пользуйтесь на здоровье!!! ))))))))))))))))))
__________________
Мой мир! Мои правила! Как хочу, так и нарушаю!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter