Текущий архив: 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.46 MB
Время: 0.005 c