skalogryz
> вангую, что такое безымянный объект, на самом деле "лежит" внутри "списка"
Да, безымянный объект действительно лежит внутри поименованного, но я думал это и так очевидно. Просто сам факт что внутри именованного объекта, имя которого соответствует некоторой структуре внутри кода, можно добавлять вот такие безымянные не прибегая к перекомпиляции приложения и всё будет работать. Этот момент я и хотел уточнить.
Вообщем, что я понял на текущий момент:
1. dfm-файл при компиляции конвертируется в очередной текстовый формат, но более компактный. В дальнейшем приложение парсит именно его.
2. Парсинг res-файлов происходит из вызова функции ReadRootComponent( nil ); То есть имя и тип корневого компонента читаются из res-файла
3. Затем происходит чтение дочерних компонентов уже внутри корневого, они от него как бы наследуются, но на уровне WinAPI, а на уровне самого Delphi, там просто линейный список этих компонентов в классе TScreen.
4. для пользовательского класса, где на компоненты указывают переменные происходит автоматическая линковка объектов, созданных при парсинге res-файла с членами этого класса. Если у объекта нет своего имени, то он просто остаётся в списке класса TScreen и ведёт себя как контрол соответствующего класса, но из пользовательского кода к нему нет явного доступа (как правило он просто не нужен).
g-cont
> значит гарантированно в массиве ClassTable не может быть двух одинаковых имён,
могут быть два одинаковых имени.
имя класса в делфи не уникально. Т.к. classname это лишь строка из 256 символов, и НЕ содержит в себе имени модуля (как это делает имя класса в шарпе).
т.е. ты в двух разных модулях можешь объявить два разных класса с одним и тем же именем.
И один может быть наследником другого....
Более того, это можно использовать для разного рода... хаков.
Например, переобъявив свой собственный класс.
Изначально:
unit Unit1; uses ... type TForm1= class ... Button1 : TButton;
добавляем свою "прослойку"...
unit Unit1; uses ... type TButton = class(StdCtrls.TButton) ... end; TForm1= class ... Button1 : TButton;
В итоге, даже если Delphi честно дизайнила кнопочки основываясь на TButton из StdCtrls, в рантайме будут создавать объекты класса Unit1.TButton.
О как! Получается вся эта замута с RegGroups и TClassFinder для того и нужна, чтобы выявлять разные классы с одинаковыми именем, но в разных модулях? Меня смутило что там классы группируются по какому-то признаку. Вот видимо по имени юнита.