Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-36573
Лариса
2003-11-20 13:31
2003.12.12
Запрос


1-36677
McSimm2
2003-12-02 16:50
2003.12.12
представление числа в виде строки


8-36771
Stexen
2003-08-14 01:10
2003.12.12
Рисование в увеличении


1-36602
aleks111
2003-12-01 14:23
2003.12.12
wmf в res и обратно...


3-36574
ViJen
2003-11-20 14:13
2003.12.12
Индексы в Dbase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский