Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MDI Form в DLL ошибка Can not assign TFont to TFont при OnHint [D5, D6, NT4, Win2k, WinXP]


Balu ©   (2002-08-15 21:28:00) 

Ситуация такова - главная форма приложения является fsMDIForm, затем я загружаю DLL, передаю ей значения Application и Screen, показываю окно fsMDIChild. Все отлично.
А далее, при попытке показать подсказку возникает ошибка "Can""not assign TFont to TFont".
Код библиотеки:
library mdidll;
uses
SysUtils,
Classes,
Forms,
Windows,
MDILIB in "MDILIB.pas" {frmMDI_dll};

var
DLLApp: TApplication;
DLLScr: TScreen;

procedure InitPlugin(App, Scr: integer); StdCall;
begin
DLLScr := Screen;
Screen := TScreen(Scr);
DLLApp := Application;
Application := TApplication(App);
end;

procedure DonePlugin; StdCall;
begin
if DLLScr <> nil then Screen := DLLScr;
Application := DLLApp;
end;

function CreateMDI: integer; StdCall;
begin
Result := integer(TfrmMDI_dll.Create(Application));
end;

exports
InitPlugin,
DonePlugin,
CreateMDI;

begin
end.


Код программы
type
TInitProc = procedure(App, Scr: integer); StdCall;
TDoneProc = procedure; StdCall;
TCreateProc = function: integer; StdCall;
...
procedure TfrmMain.FormCreate(Sender: TObject);
begin
FLib := LoadLibrary(PChar("mdidll.dll"));
@InitPlugin := GetProcAddress(FLib, PChar("InitPlugin"));
@InitPluginbalu := GetProcAddress(FLib, PChar("InitPluginbalu"));
@DonePlugin := GetProcAddress(FLib, PChar("DonePlugin"));
@CreateMDI := GetProcAddress(FLib, PChar("CreateMDI"));
InitPlugin(integer(Application), integer(Screen));
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
begin
DonePlugin;
FreeLibrary(FLib);
end;
procedure TfrmMain.NewDLL1Click(Sender: TObject);
var X: TForm;
begin
X := TForm(CreateMDI);
end;


Подскажите, пожалуйста, что и как.

Пример кода взял с КОРОЛЕВСТВА DELPHI


Balu   (2002-08-16 18:52:00) [1]

Спасибо McSimm за
http://www.delphikingdom.com/mastering/plugins.htm
Переделал систему через BPL всё заработало отлично.


McSimm   (2002-08-16 11:59:00) [2]

>Balu © (15.08.02 21:28)
Андрей это ты :)
А я и не заметил.

У меня появилась идея насчет твоей проблемы. Если докопаюсь - сообщу.

>moderator
извиняюсь за личную переписку.


McSimm   (2002-08-16 11:42:00) [3]

Маленькая поправка.
Не заметил, что ситуация возникает при OnHint.
Суть проблемы - та же, только ошибка Assign не при слиянии меню, а при создании хинта.

>Игорь Шевченко © (16.08.02 10:49)
Полностью согласен.


Игорь Шевченко   (2002-08-16 10:49:00) [4]

McSimm © (16.08.02 10:41)

3-ий путь наиболее правильный. Во втором есть подводные камни, в частности, нельзя DLL линковать статически, необходимо использовать только динамическую загрузку.

С уважением,


McSimm   (2002-08-16 10:41:00) [5]

Проблема в том, что одноименные классы в DLL и EXE - это разные классы. И Assign между ними невозможен.

При таком подходе при внедрении меню MDI формы в меню главной формы эта ошибка и происходит.

Есть несколько путей:
1. Отказаться от слияния меню. (но потенциально возможны другие проблемы)

2. Откомпилировать и DLL и EXE с использованием r/t package Vcl??.bpl Тогда и переназначения Application и Screen делать не придется - они и так общие.

3.Отказаться от DLL и создавать MDI в BPL. При этом подходе также придется использовать vcl??.bpl


Ученик   (2002-08-15 21:47:00) [6]

А что написано в OnHint ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо