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

Вниз

Как перебрать все классы, присутвующие в пакете (Run-Time)   Найти похожие ветки 

 
Priest ©   (2006-12-26 16:42) [0]

Загружаю пакет через LoadPackage. А как найти дальше?


 
ors_archangel ©   (2006-12-26 22:10) [1]

Не проверял, но судя по

procedure RegisterComponents(const Page: string;
 const ComponentClasses: array of TComponentClass);
begin
 if Assigned(RegisterComponentsProc) then
   RegisterComponentsProc(Page, ComponentClasses)
 else
   raise EComponentError.CreateRes(@SRegisterError);
end;

можно установить свой RegisterComponentsProc (в приложении он обычно равен nil), а затем вызвать Register для всех юнитов (он экспортируется) пакета bpl.


 
Юрий Зотов ©   (2006-12-26 22:48) [2]

1. Класс не обязан быть компонентским.
2. Даже компонентский класс не обязан входить в Register.


 
Юрий Зотов ©   (2006-12-26 22:50) [3]

Вдогонку. Насколько я в курсе, легального решения этой задачи нет. Встречал полухакерское и не факт, что оно годится для всех версий.


 
ors_archangel ©   (2006-12-27 02:10) [4]

Юрий Зотов правильно заметил, что [1] может сработать только для зарегестрированных наследников TComponent.
Есть кривой способ для наследников TPersistent:
делаем пустой проект, грузим в него нужный пакет, вызываем GetClass для всех подстрок пакета длиной от 1 до 32 символов (возможная длина идентификатора в Делфи), которые содержат символы _, a..z или A..Z: где GetClass <> nil - класс существует, но он также найдёт классы самого приложения, из которого запускается, т.к. поиск - глобальный, поэтому желательно сделать пустой проект и как-то это учесть…


 
Priest ©   (2006-12-27 10:12) [5]

Я счас пробую по другому. Создал свой базовый класс. Все производные от него регистрирую с помощью RegisterClass(). Затем с помощью класса TClassFinder прохожу по всем зарегистрированным классам


 
Юрий Зотов ©   (2006-12-27 12:12) [6]

> Priest ©   (27.12.06 10:12) [5]

Дык... если пакет свой, то какие же проблемы? Он же про себя сам все знает и может выдать наружу, даже и без регистрации классов.

Например, пакет может содержать процедуру EnumPackageClasses. Вызывая ее и передавая в нее callback, центральное приложение получает нужную информацию. Другой вариант - пакет строит список своих классов и выдает ссылку на него.

И т.д., и т.п.


 
Priest ©   (2006-12-27 12:17) [7]

Так и сделал :) Просто бумал может есть более обобщённый механизм получения информации о пакете



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

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

Наверх




Память: 0.48 MB
Время: 0.05 c
4-1160299759
breeze
2006-10-08 13:29
2007.02.18
дата создания процесса


1-1166811629
i-am-vladko
2006-12-22 21:20
2007.02.18
Изменение имени класса


4-1160023000
MN
2006-10-05 08:36
2007.02.18
Хинт наподобие "Обнаружено новое устройство" для программы в трее


2-1170070648
rosl
2007-01-29 14:37
2007.02.18
следующий номер автоинкриментного поля


15-1169634716
Ega23
2007-01-24 13:31
2007.02.18
знатоки Sybase PowerDesigner - отзовитесь!