![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Не знаю точно в какую тему писать, так что напишу в эту(да простит меня администратор)
Задача в следующем в run time я строю на форме некоторые объекты родителями для которых является Tpanel (его родитель форма). Потом, после выполнения своих функций Tpanel уничтожается(с ней уничтожаются все её потомки). После процесс повторяется и т.д Понятное дело объем кода сильно возрастает. Вот и пришло в головумысль вынести часто повторяющиеся процедуры создания раунда в отдельную DLL , и тут возникла проблема как назначить в DLL обьекту родителя , ведь Форма размещена в проекте а её потомок Tpanel в DLL. А значит если напишем Код:
one:=TPanel.Create(AOwner); one.Parent:=Form1; Код:
type
Tround1 = class(TForm)
Panel1: TPanel;Отсюда вопрос, как реализовать это и в какую сторону копать ? Буду благодарен за ссылки на материалы по теме ![]() |
|
#2
|
||||
|
||||
|
В приложении опиши функции добавления\манипулирования с компонентами и передай их в dll, где библиотека и будет делать то что ей нужно. И размер dll'ки будет маленький (если не добавлять Forms и др модули компонентов) и повторно ничего не придётся писать.
|
|
#3
|
|||
|
|||
|
А можно подробнее о
"опиши функции добавления\манипулирования с компонентами и передай их в dll," или ссылку на статью ![]() |
|
#4
|
||||
|
||||
|
Приведу небольшой работающий примерчик, как я понял вам нужно в реал-тайме создавать компоненты из библиотеки? Вот на скорую руку написал примерчик, конечно он получился громоздким, но это ему придаёт ту шустрость которой нехватает делфи приложениям.По аналогии дополни рекорд 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;
...зы: чота репа у меня низкая... ![]() Последний раз редактировалось AleD, 11.10.2009 в 15:54. |