|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
28.06.2011, 10:25 | #1 |
Форумчанин
Регистрация: 24.03.2009
Сообщений: 375
|
События Delphi
Приветствую Вас господа программисты!
Ранее в своих прогах не приходилась использовать событийную модель, вот решил попробовать. Сразу возникло куча вопросов, возможно вы на них сможете дать ответ (код примера ниже). Насколько я понял привязка событий вовсе не событийная. Судя по всему речь идет всего лишь о сохранении адреса процедуры в поле объекта, с последующим вызовов данной процедуры через ее сохраненный адрес. Не совсем понятен становится смысл данного усложнения логики. Код:
TNotifyEvent = procedure(Sender: TObject) of object; - тут не понятен постфикс "of object;"? Хотя в хелпе указано, что это на подобие OnClick у кнопки. В данном случае ни какой асинхронности не будет? Т.е. когда мы жмем кнопку мы отправим сообщение и программа сразу получает управление без входа в этот OnClick. И только тогда, когда форма получит наше сообщение управление перейдет в OnClick. А при вызове нашего события if Assigned(l.FOnLog) then l.FOnLog(l); управление передастся сразу процедурке и пока она не отработает, ничего не сделаешь? Последний раз редактировалось VadEr; 28.06.2011 в 10:52. |
28.06.2011, 10:41 | #2 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
События - это индивидуальное определение этих действий. Смысл событий в том, чтоб дать возможность программисту связать некий код с срабатыванием некого условия. Т.Е. не полагаться на стандартные обработчики, которые кстати далеко не всегда доступны программисту, а переопределить их под свое. Если ты написал некой компонент, он в цикле вращает некой массив. Задача - выполнить некое действие если элемент массива ниже нуля. Ты можешь описать процедуру, которую ты в это условие вставишь (имею ввиду вызов), но представь что ты этот компонент будешь распространять, платно причем. Ты врядли поделишься исходниками, а я как пользователь скажу - "А мне нужно чтоб при этом условии делалось то что я хочу - лампочка должна включаться". Поскольку ты в своем компоненте не предусмотрел для меня дать возможность описать свое действие, я плюну на компонент и потребую деньгу назад. Если же ты описал в компоненте событие, которое в цикле (внутри компонента, в недоступном для меня месте) будет вызываться, я вполне смогу описать свое тело обработчика и останусь доволен решенной задачей. Понял в чем смысл событий? Дать возможность описать действие для класса вне его пределов.
I'm learning to live...
|
|
28.06.2011, 11:40 | #3 |
Форумчанин
Регистрация: 24.03.2009
Сообщений: 375
|
Уважаемый Stilet это как раз я и хотел бы узнать: if Assigned(l.FOnLog) then l.FOnLog(l) это моя оконная процедура будет задействована?, т.е. адресс обработчика в WinProg передастся?
В бесконечном цикле будет создана отдельная ветка на обработчик FOnLog(l))?:con fused: Последний раз редактировалось VadEr; 28.06.2011 в 11:58. |
28.06.2011, 11:46 | #4 |
Форумчанин
Регистрация: 24.03.2009
Сообщений: 375
|
вот попробовал по другому, тут точно будет событийная модель с обработкой сообщений
Код:
Код:
В целом бы хотелось бы уяснить: эти реализации суть одно и тоже или все таки разные? Последний раз редактировалось VadEr; 28.06.2011 в 11:52. |
28.06.2011, 11:48 | #5 | ||
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
Цитата:
На самом деле для полей объекта для хранения данных типа procedure|function(..) of object компилятор резервирует область памяти, описываемую структурой TMethod: TMethod = record Code, // это поле хранит собственно точку входа в код подпрограммы, ассоциированной с методом некоего объекта или класса Data: Pointer; // а это поле предназначено для хранения ссылки на конкретный объект или класс; при вызове подпрограммы по адресу из поля Code компилятор запишет этот указательв РОН ebx и доступ к нему в теле вызванной подпрограммы будет возможен через явное или неявное обращение к Код:
Цитата:
|
||
28.06.2011, 11:51 | #6 | |
Заблокирован
Регистрация: 27.05.2010
Сообщений: 1,099
|
Цитата:
Не следует путать ее с методом дельфийского класса или объекта. |
|
28.06.2011, 13:04 | #7 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,527
|
Исправленная схема работы для поста #1
Код:
программа — запись алгоритма на языке понятном транслятору
|
28.06.2011, 14:20 | #8 | |
Форумчанин
Регистрация: 24.03.2009
Сообщений: 375
|
Цитата:
Код:
но опять же, мы посылаем сообщение на ответ который, вызывается обработчик из формы или все таки мы передаем управление по адрессу данного метода? Последний раз редактировалось VadEr; 28.06.2011 в 14:50. |
|
28.06.2011, 16:20 | #9 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,527
|
вызов процедуры Fon.... это
Цитата:
Это событие потому что мы не знаем кто и когда вызовет данную процедуру.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 28.06.2011 в 16:22. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
События в edit (Delphi) | Евгений1 | Помощь студентам | 8 | 08.03.2011 21:34 |
События в idTCPServer и idTCPClient (Delphi) | _PROGRAMM_ | Помощь студентам | 3 | 11.11.2010 19:35 |
События в WPF. Обращение к компонентам формы из события | Casper-SC | Общие вопросы .NET | 3 | 25.07.2010 19:03 |
Delphi события кнопки | Alexmur07 | Помощь студентам | 3 | 29.11.2009 11:16 |
События мыши в Delphi | -COREY- | Помощь студентам | 0 | 15.11.2009 15:27 |