Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.12;
Скачать: CL | DM;

Вниз

Как сделать подключение форм в 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
3-36535
a123
2003-11-21 12:06
2003.12.12
left join


1-36610
Valday
2003-11-30 21:54
2003.12.12
Сохранение приложения


3-36505
Элина
2003-11-22 17:46
2003.12.12
Проверка поля на пустоту в SQL


1-36709
Johnmen
2003-12-02 13:33
2003.12.12
RichEdit, непонятное поведение


1-36734
LittleGirly
2003-12-02 10:24
2003.12.12
Вопрос по TreeView