Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.29;
Скачать: CL | DM;

Вниз

MDI Form в DLL ошибка Can not assign TFont to TFont при OnHint   Найти похожие ветки 

 
Balu ©   (2002-08-15 21:28) [0]

Ситуация такова - главная форма приложения является 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


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

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


 
McSimm ©   (2002-08-16 10:41) [2]

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

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

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

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

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


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

McSimm © (16.08.02 10:41)

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

С уважением,


 
McSimm ©   (2002-08-16 11:42) [4]

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

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


 
McSimm ©   (2002-08-16 11:59) [5]

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

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

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


 
Balu ©   (2002-08-16 18:52) [6]

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



Страницы: 1 вся ветка

Текущий архив: 2002.08.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
4-96017
StAL
2002-05-29 19:33
2002.08.29
LastMsgBoxInfo. Переват API-вызовов


1-95870
zezik
2002-08-18 01:39
2002.08.29
Как написать свой PlugIn на WinAMP


1-95766
-= Like =-
2002-08-19 15:21
2002.08.29
Как проверить, есть ли строка в INI файле?


14-95968
faith
2002-08-02 21:20
2002.08.29
delphi, С++ и т.п. ВООБЩЕ не запускается, HEEELP!!!!


3-95689
Kinder
2002-08-07 15:04
2002.08.29
Копирование баз