Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-70164
Skalp
2003-05-02 14:20
2003.05.22
Транзакция


14-70437
fighter@str
2003-04-30 18:56
2003.05.22
Жесткий диск IBM


14-70499
Kloksus
2003-05-04 13:16
2003.05.22
Как работать со спикером


14-70458
Supreme 2
2003-05-01 10:19
2003.05.22
Очень запутанная ситуация. Нужна помощь.


1-70367
Zew
2003-05-10 13:14
2003.05.22
Узнать время!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский