![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перебрать все классы, присутвующие в пакете (Run-Time)
Priest © (2006-12-26 16:42:00)Загружаю пакет через LoadPackage. А как найти дальше?
Priest (2006-12-27 12:17:00) [1]Так и сделал :) Просто бумал может есть более обобщённый механизм получения информации о пакете
Юрий Зотов (2006-12-27 12:12:00) [2]> Priest © (27.12.06 10:12) [5]
Дык... если пакет свой, то какие же проблемы? Он же про себя сам все знает и может выдать наружу, даже и без регистрации классов.
Например, пакет может содержать процедуру EnumPackageClasses. Вызывая ее и передавая в нее callback, центральное приложение получает нужную информацию. Другой вариант - пакет строит список своих классов и выдает ссылку на него.
И т.д., и т.п.
Priest (2006-12-27 10:12:00) [3]Я счас пробую по другому. Создал свой базовый класс. Все производные от него регистрирую с помощью RegisterClass(). Затем с помощью класса TClassFinder прохожу по всем зарегистрированным классам
ors_archangel (2006-12-27 02:10:00) [4]Юрий Зотов правильно заметил, что [1] может сработать только для зарегестрированных наследников TComponent.
Есть кривой способ для наследников TPersistent:
делаем пустой проект, грузим в него нужный пакет, вызываем GetClass для всех подстрок пакета длиной от 1 до 32 символов (возможная длина идентификатора в Делфи), которые содержат символы _, a..z или A..Z: где GetClass <> nil - класс существует, но он также найдёт классы самого приложения, из которого запускается, т.к. поиск - глобальный, поэтому желательно сделать пустой проект и как-то это учесть…
Юрий Зотов (2006-12-26 22:50:00) [5]Вдогонку. Насколько я в курсе, легального решения этой задачи нет. Встречал полухакерское и не факт, что оно годится для всех версий.
Юрий Зотов (2006-12-26 22:48:00) [6]1. Класс не обязан быть компонентским.
2. Даже компонентский класс не обязан входить в Register.
ors_archangel (2006-12-26 22:10:00) [7]Не проверял, но судя по
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.