![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#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); Пользуйтесь на здоровье!!! ![]() Мой мир! Мои правила! Как хочу, так и нарушаю! ![]() |