Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
ВнизКак сделать подключение форм в run time Найти похожие ветки
← →
Labert (2003-12-01 20:06) [0]Такая проблема:
Делаю сейчас программу, которой будет пользоваться большое количество людей. Причем разным пользователям нужны разные функции. Я хочу сделать PageControl с разными вкладками. Каждая вкладка доступна разным категориям пользователей. Ну вот. Вкладок получается много, соответственно прога получается очень тяжелая.
Хочется сделать так, чтобы вся функциональность не хранилась в одном exe-шнике, а нужные компоненты подгружались в зависимости от того, кто пользуется прогой.
Короче создаю в Run-time вкладку (TTabSheet) и подключаю ее к PageControlу - тут все нормально.
Хотел сделать еще Dll-ки, чтобы каждая соответствовала одной задаче. Например, хотел создать в Dll-ке Frame, а указатель на него передать обратно в прогу, а потом этот Frame положить на вкладку (ну типа frame.parent := PageControl1.Pages[0])
Тут ничего не получилось.
Не получается даже передавать в Dll-ку указатели на компоненты из главной проги так, чтобы в Dll-ке их можно было использовать
Например, нельзя, передав в длл-ку указатель на DataModule, работать там с эти датамодулем.
Подскажите как быть
В принципе, необязательно наверное использовать именно Dll-ки, главное, чтобы нужные модули подключались в Run time, и чтобы эти модули могли активно работать с VCL-компонентами главной проги, и использовать ее глобальные объекты.
Сорри за длинный вопрос
← →
Юрий Зотов (2003-12-01 20:12) [1]Объяснять долго... в общем так:
Замените DLL пакетами. Компилируйте программу с этими run-time пакетами. И все проблемы исчезнут.
← →
Labert (2003-12-01 20:42) [2]Вы имеете в виду Packages?
Но их же нельзя загрузить программно, по типу LoadLibrary?
И еще такой вопрос:
При использовании пакетов exe-шник, конечно, меньше получается.
Но подгружаются ли эти пакеты по мере надобности, или загружаются сразу? Мне кажется, они сразу подгружаются. Хотя я, может, и ошибаюсь.
Сегодня пробовал делать одну и ту же прогу в двух вариантах:
с рантайм-пакетами, и как обычно. Запускал эти проги и при этом смотрел параметр "физическая память" в Системном Мониторе. Так вот, если верить систем монитору прога с рантайм пакетами даже больше памяти жрала
← →
MaxDDinc (2003-12-01 21:30) [3]При работе с RunTime пакетами прграмма получится меньше, но при этом Вам придется устанавливать на машину пользователя соответствующие *.BPL, что очень неудобно.
А теперь по вопросу:
1. Главный модуль или Ваш EXE"шник
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls;
type
TIPluginDemo = class
public
function GetApplication: TApplication; virtual; stdcall;
procedure AddMenuItem(MenuItemCapt: String; Proc: TNotifyEvent); virtual; stdcall;
procedure AddItem(Item: String); virtual; stdcall;
end;
TPluginDemoForm = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
Utilities1: TMenuItem;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
PInterface: TIPluginDemo;
il:TList;
public
{ Public declarations }
end;
var
PluginDemoForm: TPluginDemoForm;
implementation
{$R *.DFM}
type
TInitPlugin = procedure(PlugClass: TIPluginDemo);
const
PlugInitProc: PChar = "InitPlugin";
function TIPluginDemo.GetApplication: TApplication;
begin
Result:=Application;
end;
procedure TIPluginDemo.AddMenuItem(MenuItemCapt: String; Proc: TNotifyEvent);
var
NewItem: TMenuItem;
begin
NewItem:=TMenuItem.Create(PluginDemoForm);
NewItem.Caption:=MenuItemCapt;
NewItem.OnClick:=Proc;
PluginDemoForm.Utilities1.Add(NewItem);
end;
procedure TIPluginDemo.AddItem(Item: String);
begin
PluginDemoForm.Memo1.Lines.Add(Item);
end;
procedure TPluginDemoForm.FormCreate(Sender: TObject);
var
PlugDir: String;
Found, Attr: Integer;
SearchRec: TSearchRec;
PluginHandle: THandle;
InitPlugin: TInitPlugin;
begin
il:=TList.Create;
PlugDir := ExtractFilePath(Application.ExeName) + "PlugIns\";
Attr := faReadOnly or faHidden or faSysFile or faArchive;
Found := FindFirst(PlugDir+"*.DLL", Attr, SearchRec);
while Found = 0 do
begin
try
PluginHandle:=LoadLibrary(PChar(PlugDir+SearchRec.Name));
@InitPlugin:=GetProcAddress(PluginHandle,PlugInitProc);
if Longint(@InitPlugin)<>0 then
begin
try
PInterface:=TIPluginDemo.Create;
InitPlugin(PInterface);
il.Add(PInterface);
except
raise Exception.Create("Ioeaea caa?ocee !");
end
end
else
FreeLibrary(PluginHandle);
except
raise Exception.Create("Ioeaea "+SearchRec.Name);
end;
Found := FindNext(SearchRec);
end;
FindClose(SearchRec);
end;
procedure TPluginDemoForm.Exit1Click(Sender: TObject);
begin
Close;
end;
procedure TPluginDemoForm.FormDestroy(Sender: TObject);
begin
il.Free;
end;
end.
2. DLL"ка, с которой надо взаимодействовать
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
procedure ShowMe(Sender: TObject);
procedure HideMe(Sender: TObject);
end;
TPluginInterface = class
public
function GetApplication: TApplication; virtual; stdcall; abstract;
procedure AddMenuItem(MenuItemCapt: String; Proc: TNotifyEvent); virtual; stdcall; abstract;
procedure AddItem(Item: String); virtual; stdcall; abstract;
end;
var
Form1: TForm1;
DemoInterface: TPluginInterface;
implementation
{$R *.DFM}
procedure TForm1.ShowMe(Sender: TObject);
begin
Show;
end;
procedure TForm1.HideMe(Sender: TObject);
begin
hide();
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage("Привет!");
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DemoInterface.AddItem("Новый элемент");
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Hide;
end;
end.
Здесь отображена идея взаимодействия DLL с модулем, по типу PLUG-IN ...
Удачи ...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.03 c