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

Delphi Sources



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

 
 
Опции темы Поиск в этой теме Опции просмотра
  #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, время: 19:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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