Приведу небольшой работающий примерчик, как я понял вам нужно в реал-тайме создавать компоненты из библиотеки? Вот на скорую руку написал примерчик, конечно он получился громоздким, но это ему придаёт ту шустрость которой нехватает делфи приложениям.По аналогии дополни рекорд TProcs своими функциями и наздоровье передавай их в библиотеку, откуда она будет манипулировать формой. Прикрепляю файл с исходниками и ЕХЕшником, я работаю на Delphi 2009, поэтому если у вас версия ниже, возможно не скомпилируется.
Этот код в основном приложении:
Код:
type
TForm1 = class(TForm)
...
public
...
procedure InitLib;
end;
TProcAddButton = function(AName: PChar): Cardinal;
TProcModButton = procedure(ABtn: Cardinal; ACaption: PChar;
AX, AY, AW, AH: Integer; AOnClick: TNotifyEvent);
PProcs = ^TProcs;
TProcs = record
AddBtn: TProcAddButton;
ModBtn: TProcModButton;
end;
TInitLibProc = procedure(AProcs: PProcs);
...
implementation
...
function ProcAddBtn(AName: PChar): Cardinal;
var
btn: TButton;
begin
//do add button
btn := TButton.Create(Form1);
btn.Parent := Form1;
btn.Name := AName;
Result := Cardinal(Pointer(btn));
end;
procedure ProcModBtn(ABtn: Cardinal; ACaption: PChar; AX, AY, AW, AH: Integer;
AOnClick: TNotifyEvent);
var
btn: TButton;
begin
//do modify button
btn := TButton(Pointer(ABtn));
btn.Left := AX;
btn.Top := AY;
btn.Width := AW;
btn.Height := AH;
btn.Caption := ACaption; // в спешке забыл, но не думаю что это суть меняет
btn.OnClick := AOnClick;
end;
procedure TForm1.InitLib;
const
lib = 'MyLib.dll';
var
lLib: Cardinal;
lProc: TInitLibProc;
lProcs: TProcs;
begin
lLib := LoadLibrary(pchar(lib));
if(lLib<>0)then
begin
lProc := GetProcAddress(lLib,pchar('Init'));
if(@lProc<>nil)then
begin
FillChar(lProcs,sizeof(lProcs),$00);
lProcs.AddBtn := ProcAddBtn;
lProcs.ModBtn := ProcModBtn;
lProc(@lProcs);
end
else MessageDlg('Неудалось инициализировать библиотеку mylib.dll',mtError,
[mbOK],0);
end
else MessageDlg('Неудалось загрузить библиотеку mylib.dll',mtError,
[mbOK],0);
end;
Вот код библиотеки:
Код:
...
type
TForm = class(TObject)
public
procedure btnTest1Click(Sender: TObject);
procedure btnTest2Click(Sender: TObject);
end;
TProcAddButton = function(AName: PChar): Cardinal;
TProcModButton = procedure(ABtn: Cardinal; ACaption: PChar;
AX, AY, AW, AH: Integer; AOnClick: TNotifyEvent);
PProcs = ^TProcs;
TProcs = record
AddBtn: TProcAddButton;
ModBtn: TProcModButton;
end;
...
var
procs: TProcs;
form: TForm;
procedure TForm.btnTest1Click(Sender: TObject);
begin
MessageBox(0,pchar('Clicked test button 1'),pchar('Echo'),
MB_OK or MB_ICONINFORMATION);
end;
procedure TForm.btnTest2Click(Sender: TObject);
begin
MessageBox(0,pchar('Clicked test button 2'),pchar('Echo'),
MB_OK or MB_ICONINFORMATION);
end;
procedure Init(AProcs: PProcs);
begin
procs := AProcs^;
form := TForm.Create;
procs.ModBtn(procs.AddBtn(pchar('btnTest1')),pchar('Test button 1'),10,10,
75,25,form.btnTest1Click);
procs.ModBtn(procs.AddBtn(pchar('btnTest2')),pchar('Test button 2'),10,40,
75,25,form.btnTest2Click);
end;
exports
Init;
...
зы: чота репа у меня низкая... 
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
|