Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
ВнизВопрос насчет событий, создаваемых Дельфи автоматически Найти похожие ветки
← →
Top Gun (2003-05-10 23:06) [0]Вот допустим кликну два раза на форме. Появится обработка события FormCreate. Но как оно реализовано ?
То есть, понятно, в класс TForm1 вставляется метод procedure FormCreate(Sender: TObject); и его реализация в implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
Но где идет присваивание, что FOnCreate:=Form1.FormCreate ? Как определяется, что при возникновении события должен вызываться TForm1.FormCreate ?
← →
Юрий Зотов (2003-05-10 23:24) [1]Просмотрите форму в виде текста. Там обработчики событий назначены в текстовом виде. Когда в run-time идет загрузка формы из ресурсов, инициализируются свойства самой этой формы и свойства ее компонентов. События - это те же свойства, только процедурного типа (tkMethod, если более точно). Загружающий код считывает имя очередного встретившегося ему свойства, вызывает GetPropInfo и по результату определяет, что это именно событие. Тогда считывается название его обработчика и у класса фоормы вызывается метод MethodAddress. Полученный в итоге адрес обработчика и прописывается в это свойство (обычно напрямую в поле, но если определен метод Set - значит, вызывается именно он). Вот и все.
Если хотите подробностей - ищите их в TReader.ReadComponent.
← →
Arch-vile (2003-05-10 23:30) [2]Но где идет присваивание, что FOnCreate:=Form1.FormCreate ? Как определяется, что при возникновении события должен вызываться TForm1.FormCreate ?
это определяется, когда ты два раза кликаешь на форму, или нужную событию в инспекторе объектов. А байда эта из сферы взаимодействия IDE с проектом. И да поправят меня Анатолий Подгорецкий да Юрий Зотов, коли я неправ :)
← →
Arch-vile (2003-05-10 23:31) [3]упс, я не видел ответ МАСТЕРА.
← →
Top Gun (2003-05-10 23:39) [4]Спасибо за ответ ! Почти понятно, кроме одного:
не знаю, что делает GetPropInfo точно (CTRL+click на нем не работает), но вероятно он определяет, что если свойство имеет процедурный тип, то значит это событие ?
← →
Arch-vile (2003-05-10 23:44) [5]что делает функция-процедура можно смотреть и через хелп :) не только через исходник
← →
Top Gun (2003-05-10 23:44) [6]И вот еще что интересно:
считывается название его обработчика и у класса фоормы вызывается метод MethodAddress
Это все в конструкторе формы делается ? Не похоже... тогда где ?
← →
Юрий Зотов (2003-05-11 00:07) [7]> не знаю, что делает GetPropInfo точно (CTRL+click на нем не
> работает)
Укажите в uses модуль TypInfo - заработает. А в самом этом модуле Вы найдете мно-о-го чего интересного (и полезного). Чуть ли не вся RTTI в нем и зашита.
> Это все в конструкторе формы делается
Да. В конструкторе TCustomForm вызывается метод InitInheritedComponent. Вот с него и начинается длинная-длинная цепочка загрузки ресурсов формы и инициализации всех свойств и ее самой, и ее компонентов. Если у Вас хватит терпения, то всю эту цепочку Вы можете пройти под отладчиком и увидеть все подробности. Для этого в опциях проекта поставьте Use Debug DCU"s, сделайте ему Build, в конструкторе TCustomForm поставьте BreakPoint - и вперед! Только терпения потребуется ОЧЕНЬ много, предупреждаю сразу.
← →
Top Gun (2003-05-11 13:16) [8]1) Не понимаю !
function GetPropInfo(Instance: TObject; const PropName: string; AKinds: TTypeKinds): PPropInfo;
begin
Result := GetPropInfo(Instance.ClassType, PropName, AKinds);
end
Разве это не приведет к бесконечной рекурсии ?!
2) Загружающий код считывает имя очередного встретившегося ему свойства
А как это у объекта можно определить, какие у него свойства есть ? Это все в этой самой TypeInfo определено ?
← →
vuk (2003-05-11 14:22) [9]to Top Gun:
1. Нет, это вызов перегруженного варианта функции, где первым параметром идет ссылка на класс, а не на экземпляр.
2. Список доступных свойств можно получить используя GetPropInfos или GetPropList.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c