Главная страница
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-1100012001
Bless
2004-11-09 17:53
2004.12.12
Как убрать эту удаленную запись из рекордсета


14-1100853189
Саке
2004-11-19 11:33
2004.12.12
Нужна программа для работы с дескрипторами окон


14-1100925769
Alex_Petr
2004-11-20 07:42
2004.12.12
Они просто издеваются !


14-1101400232
Undert
2004-11-25 19:30
2004.12.12
Опять Pointer


14-1101315996
Sicilla
2004-11-24 20:06
2004.12.12
Проверка почты