![]() |
|
|
Регистрация | << Правила форума >> | 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 и др модули компонентов) и повторно ничего не придётся писать.
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#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; ... зы: чота репа у меня низкая... ![]() TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; Последний раз редактировалось AleD, 11.10.2009 в 15:54. |