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

Вниз

Вопрос насчет событий, создаваемых Дельфи автоматически   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
4-70573
dv81
2003-03-21 23:37
2003.05.22
Как отобразить стандартное окно поиска Windows ?


11-70200
Sam Stone
2002-08-18 14:21
2003.05.22
KOLMemo


14-70474
vic_vm
2003-05-03 18:05
2003.05.22
Как сделать в ToolBar чтобы названия на кнопках были справа


1-70393
MAX22
2003-05-10 22:14
2003.05.22
Код для создаваемого объекта


3-70190
-=DeMoH=-
2003-05-04 12:41
2003.05.22
КАК УЗНАТЬ, КАКАЯ ИЗ ЗАПИСЕЙ РЕДАКТИРУЕТСЯ В DBGrid?