Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Примеры использования Пакетов (Package) 
:(
    Опции темы
Wowa
Дата 29.12.2004, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Приведу примеры испоьзования Pack-ей. 

Статическое подключение пакетов. 

Создаешь новую форму(размещаешь на ней нужные компоненты и пишешь код), после чего сохраняешь ее например в C:\Borland\Delphi7\Projects\Plugins\.
Создаешь свой пакет(не закрывая созданной формы) - Components>Instal Component. Там выбираешь вкладку Into New Package. Указываешь путь к своей форме и прописываешь название нового пакета(в эту же директорию). В окне созданного пакета открываешь Options>Directories/Conditionals: в Output directory пишешь путь до текущего местонахождения пакета, что бы пакет результирующие файлы сохранялись не в Project\Bpl а в твоем каталоге. Так же указываешь этот путь в DCP Outpu directory (В данном примере C:\Borland\Delphi7\Projects\Plugins). После чего сохраняешь и компилишь пакет. Инсталить его нет необходимости. Закрываешь окно с твоим пакетом. Создаешь новый проект в этом же каталоге и в его uses добавляешь название юнита твоей формы в этом пакете, т.е. если ты не изменил его названи это Unit1, тогда код будет выглядеть примерно так:

Выделить всёРазвернуть кодкод Pascal/Delphi
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
unit TestUnit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit1{Добавленный юнит из пакета};
type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
//Твоя форма в пакете
PackForm:TForm1;
begin
  PackForm:= TForm1.Create(Self);
  try
    PackForm.ShowModal;
  finally
    FreeAndNil(PackForm);
  end;
end;
end.


В действительности код формы в пакете будет включен в результирующий exe файл, для того чтобы этого не было необходимо использовать пакеты времени исполнения и свой пакет включить к списку пакетов времени исполнения(смотри Project>Options>Packages Runtime packages тут установи галочку Build with runtime packages, если в списке пакетов нету твоего пакета, то добавь его кнопкой Add).

Загрузка пакетов во время исполнения программы 

Наиболее интересный на мой взгляд способ, но тут я стокнулся с одной проблемой, которую уже как 2 часа не могу решить(может кто поимет в чем дело).
Открываешь созданный тобою уже пакет и добавляешь такой код.

Выделить всёкод Pascal/Delphi
1:
2:
initialization
  RegisterClass(TForm1){или твое название формы}


Данный код нужен для того чтобы получить доступ к этому классу функцией GetClass.
Сохраняешь свой пакет и компилишь его.

Создаешь тестирующее приложение:
Выделить всёРазвернуть кодкод Pascal/Delphi
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
unit ULoaderPlugin;
interface
uses
  SysUtils, Windows, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, Buttons, TypInfo;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
PackForm:TForm;
FormClass:TFormClass;
hPack:HMODULE;
begin
  hPack:= LoadPackage(ExtractFilePath(ParamStr(0))+'PluginPack.bpl');
  if hPack > then
  begin
    FormClass:= TFormClass(GetClass('TPackForm'));
    if Assigned(FormClass) then
    begin
      PackForm:= FormClass.Create(Self);
      try
        PackForm.ShowModal;
      finally
        FreeAndNil(PackForm);
      end;   
    end
    else
      Showmessage('Class not found');
    UnLoadPackage(hPack);
  end
  else
    ShowMessage('Error load package');
end;
end.


Если тебе нужно получить доступ к полям свойствам твоей формы(не стандартным), то этого можно добиться при помощи SetPropValue  (необходимо подключить модуль TypInfo), например:

Выделить всёкод Pascal/Delphi
1:
2:
3:
4:
//Устанавливаешь значения свойств
SetPropValue(PackForm, 'Caption''New Caption');
//Получаешь значения свойств
GetPropValue(PackForm, 'Caption');


Но эти свойства должны быть обязательно обьявлены в секции published.

Проблема, о которой я уже писал, заключается в том, что когда я вызываю GetClass он всегда возвращает nil. Хотя похожий пример из книги "Delphi 6" Марко Кенту работает нормально. Может у кого есть идей на этот счет?

Таким образом, если разобраться с этой проблемой, то можно написать класс для юзания плагинов, например в своей программе можно отвести соответствующую директорию и при каждом запуске проги получать из нее все все файлы и загружать их. Чем я и займусь, если эта проблема решится.

Если тебе нужно разместить в пакете кнопку с реакцией на нажатие, то можно, например, сделать так:
Создаешь наследника от нужного тебе компонента(в данном случае от TButton), причем он должен быть в свою очередь наследником TPersistent, если ты будешь подключать пакет динамически, для генерироавния соответствующей RTTI инфы. Вот пример для TButton:

Выделить всёкод Pascal/Delphi
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
unit UMyButton;
interface
  uses StdCtrls, Dialogs;
type
  TMyButton = class(TButton)
     public
       procedure Click; override;
   end;
implementation
{ TMyButton }
procedure TMyButton.Click;
begin
  inherited;
  ShowMessage('Hello from my click');
end;
end.

 Запихиваешь кнопку в пакет приведенным выше способом.

Твоя прога(Подключение с помощью LoadPackage пока не могу показать, так как не разобрался почему GetClass возвращает nil):

Выделить всёРазвернуть кодкод Pascal/Delphi
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
unit UMyButtonTest;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, UMyButton;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
 Button:TMyButton;
begin
  Button:=TMyButton.Create(Self);
  try
    Button.Parent:=Self;
    Button.Left:=10;
    Button.Top:=10;
    Button.Caption:='MyButton';
  except
    FreeAndNil(Button);
  end;
end;
end.

Файл UMyButton.pas можешь удалть из этого каталога, чтобы увидеть что исползуется юнит в bpl.

Ну вот пока и все. Надеюсь кто нить знает причину моей ошибки при динамическом подключении, так как мне самому это интересно.

Автор: <Spawn>
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0767 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.