Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];

Вниз

Ошибка 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.06 c
14-1101281847
dr Tr0jan
2004-11-24 10:37
2004.12.12
HASP NT, Не могу установить сабж


3-1099041934
stud
2004-10-29 13:25
2004.12.12
dbchart delphi7


3-1100266024
REA
2004-11-12 16:27
2004.12.12
Положение записи в Grid


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


1-1101415483
Homa_Programer
2004-11-25 23:44
2004.12.12
переименовать ПАПКУ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский