![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое копирование частей форы из DLL [D7, WinXP]
LeoTon © (2007-06-18 12:22:00)Нужно скопировать панель, хранящуюся в DLL в главное окно программы. Ведь, простым присвоением Parent'ов тут не обойдешься...
Я использую такой код, который найден в инете, но не работает:
DLL
function crGetInterface(pn: Cardinal): Pointer; register;
begin
unForm.crFMain.Panel1.Parent := nil;
unForm.crFMain.Panel1.ParentWindow := pn;
Result := unForm.crFMain.Panel1;
end;
exports crGetInterface;
EXE
<credit>
func := GetProcAddress(crH,'crGetInterface');
TPanel(func(Form1.Handle)).Parent := Form1;
</credit>
Загрузка DLL происходит по всем правилам, там нареканий быть ен может. Ошибка срабатывает именно на вызове функции из DLL.
Первоистоник: http://www.delphirus.com/article70.html
Подскажите кому не трудно, где мне себе руки ровнять и как. По возможности, исправте код на правильный...
Зарание, спасибо.
vpbar (2007-06-18 14:02:00) [1]Тут телепатов мало. И хоть я не телепат но попробую.
>>connecting to brain .... пи пи
>>ok
Вы проверьте ваша панель вообще создана, ибо если она nil, то ошибка буде
Вот у меня код в длл
procedure CreateForm; register;
begin
Form1:=TForm1.Create(nil);
end;
function crGetInterface(pn: Cardinal): Pointer; register;
begin
Form1.Panel1.Parent := nil;
Form1.Panel1.ParentWindow := pn;
Result := Form1.Panel1;
end;
exports crGetInterface,CreateForm;
Это код в программе
....
procedure CreateForm; register; external 'Project1.dll';
function crGetInterface(pn: Cardinal): Pointer; register; external 'Project1.dll';
....
procedure TForm1.SpeedButton2Click(Sender: TObject);
var P:TPanel;
begin
CreateForm; // если не создать форму в длл то ошибка
P:= TPanel(crGetInterface(self.Handle));// поместим панель на форму
P.Top:=100; // позицию моно поменять
P.Left:=20; //
// хотя позвращать указатель не всегда гуд.
//В приложении придется использовать TPanel что увеличит размер exe
// лучще Хендл возвращать и посылать сообщения
end;
....
И все работает