![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
В чем смысл указателей на методы, в книге написано "...один класс содержит указатель на метод, который связан с методом другого класса". Не понимаю этих слов
И не понимаю как это происходит в примере Вот пример:
Можете дать некоторые разъяснения по этой теме, спасибо -------------------- ![]() |
|||
|
||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
ну и что не ясно?
FOnchange это указатель на метод типа TNotifyEvent Скролл бар проверяет ссылается ли этот указаитель на какой-нить метод, и если да - вызывает этот метод. В примере явно не указано (но подразумевается) что FOnchange указывает на TForm1.ScrollBar1Change Таким образом скроллбар оповещает форму об изменениях. Все события которые ты видишь в инспекторе объектов это свойства типа "указатель на метод". когда ты в инспекторе объектов назначаешь обработчик события, это значит что при создании формы свойству-событию будет присвоен указатель на твой метод. можно делать и явно:
В основном для событий обычно есть такое приватное поле и свойство, дающее доступ к нему:
-------------------- Обижено школьников: 8 |
||||
|
|||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
Если не тяжело то напиши небольшой пример, что б понять что представялет собой указатель на метод, просто из 1 примера, не понятно...
И еще как такое возможно FOnChange(Self) - это же свойство и тут в скобках параметр?! И для чего нужны укзатели на методы так и не понял :( -------------------- ![]() |
|||
|
||||
| bems |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
это вызов метода, на который указывает указатель FOnChange ну я ж написал - например для событий
-------------------- Обижено школьников: 8 |
||||||
|
|||||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
### нифика не вкуриваю
-------------------- ![]() |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 8 Всего: 51 |
ScrollBar1.FOnchange:=Form1.ScrollBar1Change Christoph, ты компоненты используешь? События у компонентов используешь? Вот события как раз и являются указателем на метод. Событие в любом компоненте объявлено как указатель на обработчик события, который является методом другого класса. Когда именно должен вызваться обработчик события определяет сам компонент, но при этом компонент не ничего знает о том какому классу принадлежит этот обработчик. Положи на форму кнопку. Когда ты в Design-time присвоишь кнопке обработчик события, например OnClick, Delphi добавит к форме новый метод, который будет называться Button1OnClick(Sender). И когда ты запустишь программу, то получится, что когда ты кликнешь по кнопке, кнопка вызовет метод формы Button1OnClick(self). Так как обработчик события является членом другого класса(в нашем примере формы), то ему(обработчику) нужно как-то сообщить о том, кто его(обработчик) вызвал. Для этого в событие передаётся ссылка на вызвавшее событие класс(Self), а обработчик его обрабатывает как Sender. |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
спасибо Bose, буду вчитываться в пост, тут еще инфы в справке надыбал, буду готовить вопросы
-------------------- ![]() |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
Это получается что событие это указатель на метод, и это метод описываю сам, и когда возникает событие, вызывается мой метод? так?
И еще событие это свойства, только внутренние поле у них хранит указатель на метод, если ошибаюсь то поправте например если я кинул на форму кнопку, и создал обработчик события OnClick, то во время запуска происходит вот это?
Откуда Делфи знает, что отобразить в Инспекторе объектов, что отобразить в Properties а что в Event? Я думаю, отбор идет свойствам, у который тип является методом, могу и ошибаться Это сообщение отредактировал(а) Christoph - 27.1.2009, 19:18 -------------------- ![]() |
|||
|
||||
| MetalFan |
|
||||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
тут надо учитывать, что под понятием "указатель на метод" на самом деле прячется 8ми байтовая запись с двумя указателями...
т.е. нельзя написать:
но можно:
-------------------- There are always someone smarter than you... |
||||
|
|||||
| Bose |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 8 Всего: 51 |
Точно! Тогда имхо лучше вместо "указатель на метод" использовать "процедурный тип"(procedural type), чтобы асбтрагироваться от деталей реализации.
Да. Точнее: событие - это свойство(property) у класса. Свойство - процедурного типа.
Лучше абстрагироваться от использования термина "указатель". Это свойство процедурного типа. Свойства могут быть любых типов, как integer, string, enumeration, так и record, и класса, так и процедурного типа.
Да. Я не знаю. Может быть так. Это сообщение отредактировал(а) Bose - 27.1.2009, 19:56 |
||||||||||
|
|||||||||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
Спасибо
Bose, MetalFan, bems, ребята огромное спасибо что помогли разобраться, поставил бы всем по +, но помоему можно ставить раз в сутки) Так что не обижайтесь) если плюсик дам Bose, и еще раз спасибо! Тему не закрываю, хотел бы еще уточнить маленькую подробность, стандартная диспетчеризация событий - это стандартная обработка событий, так вот вопросом в чем, зачем обработчка события по умолчанию?ну пустой обработчик события, так и ничего не делает...вот этот момент не понимаю. Рассматривал примеры, метод диспечтчеризации как то связан с событием? В виде кода это не увидел, или быть может опять неявно связывается метод диспетчеризации и событие? Спасибо -------------------- ![]() |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
| Bose |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 8 Всего: 51 |
Даже не представляю себе, что это такое. Что это такое? |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
Цитирую с книги: "Методы диспетчеризации несут отвественность за исполнение метода, на который ссылается указатель на метод события..." И небольшой пример:
Не понимаю зачем нужен обработчик события по умолчанию и есть ли какая то явная свзязь, с событиями? -------------------- ![]() |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
что-то какая-то мутная в плане терминологии книжка...
Знаю понятие "диспетчеризация сообщений"... но при чем тут конкретная реализация (перекрытие виртуального метода предка и его вызов) и диспетчеризация -------------------- There are always someone smarter than you... |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 18 Всего: 88 |
Christoph, а, ну это нужно когда уведомление (о, например, щелчке мышкой) должен получить не только пользовательский код (например форма), а и дочерний класс. Для этой цели базовай класс вызывает виртуальный метод Click. В реализации этого базового класса этот метод просто вызывает обработчик события (на который ссылается поле процедурного типа). А когда кто-то наследует класс от этого базового класса и тоже хочет как-то реагировать на щелчек - он перекрывает виртуальный метод (Click). В своем перекрытом варианте он делает свою реакцию на нажатие и дальше перед ним встает вопрос, вызывать ли унаследованый метод. Если он хочет чтобы был вызван обработчик, естановленый в OnClick и сделана другая (если есть) работа базового класса, то он вызывает унаследованый метод так
-------------------- Обижено школьников: 8 |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: 5 Всего: 11 |
Спасибо, я все понял спасибо всем
-------------------- ![]() |
|||
|
||||
| Rasool |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 4.6.2011 Репутация: нет Всего: нет |
Хочу сделать в классе указатель на функцию и инициализировать его ссылкой на функцию. Сделал, как в здесь:
При компиляции выдает ошибку в 36-й строчке: E2009 Incompatible types: 'regular procedure and method pointer' Это сообщение отредактировал(а) Rasool - 16.8.2011, 20:05 |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 29 Всего: 89 |
Читать эту тему с начала. Всё разжёвано.
Christoph понял и вы сможете. Можно ещё почитать это: http://www.gunsmoker.ru/2008/12/static-delphi.html -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Rasool |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 4.6.2011 Репутация: нет Всего: нет |
Решил, что мне нужно реализовать указатель на функцию, а не на метод. Спасибо за ссылку.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |