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

Вниз

Как правильно зарегестрировать класс.   Найти похожие ветки 

 
Matveih1 ©   (2008-05-13 09:24) [0]

Добрый день. Есть основная программа и есть bpl. При загрузке bpl происходит регистрация класса

initialization
begin
 RegisterClass(TForm2);
end;


но основная программа не может найти класс Form2
var
ModuleP: HMODULE;
Intf: IMayIntf;
AClass: TComponentClass;
AObj: TComponent;
begin
ModuleP := LoadPackage("Pack.bpl");
 if ModuleP <> 0 then
 begin
   AClass := TComponentClass(FindClass("TForm2"));
    if Assigned(AClass) then
      AObj := AClass.Create(Self);
  end;


где я промазал?


 
Сергей М. ©   (2008-05-13 09:31) [1]


> где я промазал?


У твоего хост-приложения свой собственный экз-р RTTI, вот здесь ты и промазал.

Обеспечение единого экз-ра RTTI для всех модулей приложения достигается сборкой этих модулей с опцией использования рантайм-пакетов


 
Игорь Шевченко ©   (2008-05-13 09:53) [2]


> При загрузке bpl происходит регистрация класса


Я не совсем помню детали, но с регистрацией классов в инициализации загружаемых пакетов в какое-то время были проблемы. Поэтому проще предусмотреть отдельную, явно вызываемую функцию у пакета, которая будет заниматься регистрацией его классов после загрузки.


 
Ega23 ©   (2008-05-13 10:11) [3]

Кстати. Я любой потомок TPersistent могу зарегистрировать? Точнее, достаточно ли моему классу быть потомком TPersistent, если я его хочу зарегистрировать? Или ещё что-то нужно?


 
Сергей М. ©   (2008-05-13 10:16) [4]


> Ega23 ©


Справка дает однозначный ответ:

The AClass parameter is the class that is descended from TPersistent


 
Slym ©   (2008-05-13 10:18) [5]

Сергей М. ©   (13.05.08 9:31) [1]
собственный экз-р RTTI

причем тут RTTI? то что белее 1 копии ето верно, но копий rtl а не RTTI...
Pack.bpl пользует внешнюю rtl.bpl и в ней регистрируется класс, хост приложение использует прилинкованую rtl и поиск класса происходит в ней... решение скомпилировать хост приложение с пакетами, хватит одного rtl остальные можно выкинуть, но советую добавить и vcl т.к. RegisterClass(TForm2); ...


 
Slym ©   (2008-05-13 10:19) [6]

Ega23 ©   (13.05.08 10:11) [3]
TPersistentClass = class of TPersistent;
procedure RegisterClass(AClass: TPersistentClass);


 
Сергей М. ©   (2008-05-13 10:20) [7]


> Slym ©   (13.05.08 10:18) [5]


Угу. Ты прав, конечно же rtl, а не RTTI.
Думал о Фоме, а написал про Ерему)


 
Matveih1 ©   (2008-05-13 12:30) [8]


> Pack.bpl пользует внешнюю rtl.bpl и в ней регистрируется
> класс, хост приложение использует прилинкованую rtl и поиск
> класса происходит в ней... решение скомпилировать хост приложение
> с пакетами, хватит одного rtl остальные можно выкинуть,
> но советую добавить и vcl т.к. RegisterClass(TForm2);

Помогло! Спасибо



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

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

Наверх




Память: 0.48 MB
Время: 0.018 c
2-1209994183
tytus
2008-05-05 17:29
2008.06.01
CreateDesktop &amp; SwitchDesktop - что нужно....см. далее


2-1210594045
smartleds
2008-05-12 16:07
2008.06.01
Коллеги , подскажите как при выводе вместо запятой ,


2-1210171211
operator
2008-05-07 18:40
2008.06.01
Вывод графиков контрастными цветами


15-1208331528
Romkin
2008-04-16 11:38
2008.06.01
Прокси


2-1210096869
Dron2
2008-05-06 22:01
2008.06.01
Если ошибка соединения - закрыть приложение. Как это сделать?