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

Вниз

Ошибка Cannot assign a TFont to a TFont    Найти похожие ветки 

 
Pupkov ©   (2004-11-28 23:20) [0]

Есть у меня тут один трабл.
Задумал е на днях одну програмку, работающую с плагинами. Плагин выполнен в виде библиотеки DLL. Для организации интерфейсов общения приложения и плагина спроектировал два класса:
1. TESPluginAppInterface = class
    public
     PluginType:1..3;
     procedure AddControl(AControl:TControl);virtual;stdcall;
   end;
   Для организации интерфейса плагин --> приложение. Его методы реализуются в модуле приложения, а в модуле плагина его методы описываются как абстрактные

 2. TESAppPluginInterface = class
    public
     procedure LoadFromFile(FileName:String;WinCtrl:TWinControl);virtual;stdcall;abstract;
    end;
    Для организации интерфейса приложение --> плагин. Его методы реализуются в модуле плагина, а в модуле приложенгия его методы описываются как абстрактные.

 Ну так вот. Когда приложению требуется открыть какой-либо файл то оно обращается за этим к плагину используя метод LoadFromFile класса TAppPluginInterface, в качестве параметров передаются название файла и некий оконный контрол. Метод реализован внутри плагина вот так:

procedure TESAppPluginInterface.LoadFromFile(FileName:String;
                                          WinCtrl:TWinControl);virtual;stdcall;abstract;
var
Control:TControl
begin
Control:=TControl.Create(WinCtrl);
PluginAppInterface.AddControl(Control);
end;

Тоесть если плагину нужно создать какойлиибо контрол и расположить его в приложении то он создаёт его и и используя метод AddControl класса TPluginAppInterface передаёт его приложению. Этот метод реализован внутри приложения вот так:

procedure TESPluginAppInterface.AddControl(AControl:TControl);virtual;stdcall;
 begin
  Control.Parent:=Panel1;
 end;

Тоесть получая контрол приложение само принемает решение куда запихать его и запихивает (вчастности здесь запивает на Panel1).
Так вот строчка Control.Parent:=Panel1 в рантайме генерирует ошибку:"Cannot assign a TFont to a TFont". После пристального разглядывания под микроскопом выяснилось что ошибку вызывает метод Control.InsertControl. Весь вечер бился с выявлением причины возникновения ошибки но так и не допедрил почему это происходит.


 
jack128 ©   (2004-11-29 00:23) [1]

нужно компилировать приложение и плагины с run time packages.


 
Игорь Шевченко ©   (2004-11-29 01:30) [2]


> Весь вечер бился с выявлением причины возникновения ошибки


В Exe TFont находится по одному адресу, в DLL по другому. Операция IS сравнивает адреса, если не совпадают, значит TFont-ы разные.


 
REA   (2004-11-29 10:10) [3]

Если планируется использовать классы в plugin, то лучше применять packages вместо DLL или COM-технологию. У всех способов впрочем есть свои достоинства и недостатки.


 
Amoeba ©   (2004-11-29 10:51) [4]

На http://www.delphikingdom.com ("Корорлевство Delphi") есть аж целых две серьезных статьи, посвященных созданию и использованию plugin-ов. Очень рекомендую.



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

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

Наверх




Память: 0.48 MB
Время: 0.025 c
8-1095077561
TiMER
2004-09-13 16:12
2004.12.12
скриншот изменившейся части экрана


14-1101226867
syte_ser78
2004-11-23 19:21
2004.12.12
Тюльпан из бумаги


1-1101287480
mid
2004-11-24 12:11
2004.12.12
Access violation


4-1098992943
Khabibulin
2004-10-28 23:49
2004.12.12
BIOS


8-1094821384
_Demik_
2004-09-10 17:03
2004.12.12
WebCam Logitech - как записать ролик и получить снимок