Главная страница
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.023 c
3-1100171384
Fyc
2004-11-11 14:09
2004.12.12
Проблемка с Table.FindNearest и русским тексом


3-1100531559
Dionnis
2004-11-15 18:12
2004.12.12
Использование индексов


6-1096834754
Asia
2004-10-04 00:19
2004.12.12
TStringGrid


1-1101233951
Dot
2004-11-23 21:19
2004.12.12
Жизнь в Run-Time


3-1100111086
APXi
2004-11-10 21:24
2004.12.12
Как узнать ID созданной с помощью SQL записи?