Указатели. Процедурные типы.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Указатели. Процедурные типы.

Сообщение iN0k » 17.02.2015 11:31:30

Столкнулся с различием моего представления о мире и текущим положением дел.

вроде как раньше можно было
Код: Выделить всё
..
m:TNotifyEvent;
p:pointer;
..
m:=Button1.OnClick;
p:=pointer(m); //< но вроде как и приведения типа не надо было
..


сейчас так не работает, и приходится делать
Код: Выделить всё
p:=pointer((@m)^);

оно работает, но взятие адреса переменной чтобы получить её значение ... как-то на мой взгляд перебор

как вернуть обратно?
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Указатели. Процедурные типы.

Сообщение Vapaamies » 17.02.2015 12:28:42

Только указатели на простые процедуры являются одинарными указателями. Указатель на метод -- запись с полями указателя на код метода и экземпляр объекта. В Delphi в TypInfo описан тип TMethod -- это как раз он.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Указатели. Процедурные типы.

Сообщение iN0k » 17.02.2015 13:10:17

тоесть теперь

Код: Выделить всё
procedure tMyClass.A;
begin
...
end;
...
@MyClass.A //< возврящает ЗАПИСь а не указатель???


а с какого момента это произошло? а что вернет `Addr`?
читал оф. документацию, но там нет ничего внятного по этому поводу. где можно почитать?
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Указатели. Процедурные типы.

Сообщение wavebvg » 17.02.2015 13:47:53

iN0k писал(а):возврящает ЗАПИСь а не указатель???

Возвращает указатель на запись в экземпляре класса.
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: Указатели. Процедурные типы.

Сообщение iN0k » 17.02.2015 14:04:51

wavebvg писал(а):Возвращает указатель на запись в экземпляре класса.

ага ... спасибо

вроде разобрался.
iN0k
постоялец
 
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Re: Указатели. Процедурные типы.

Сообщение Vapaamies » 17.02.2015 16:14:10

Код: Выделить всё
type
  TNotifyEvent = procedure(Sender: TObject) of object;
var
  OnClick: TNotifyEvent; // <-- TMethod
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Указатели. Процедурные типы.

Сообщение wavebvg » 17.02.2015 18:29:11

Vapaamies писал(а):
Код: Выделить всё
type
  TNotifyEvent = procedure(Sender: TObject) of object;
var
  OnClick: TNotifyEvent; // <-- TMethod

Код: Выделить всё
type
  TNotifyEvent = procedure(Sender: TObject) of object;
var
  OnClick: TNotifyEvent; // <-- PMethod

:-)
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: Указатели. Процедурные типы.

Сообщение kazalex » 17.02.2015 18:49:16

wavebvg писал(а):OnClick: TNotifyEvent; // <-- PMethod

Садись. Два.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: Указатели. Процедурные типы.

Сообщение wavebvg » 18.02.2015 11:04:34

kazalex писал(а):Садись. Два.

Вам бы свои тетрадки проверять

ЗЫ. Да, меня переклинило
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: Указатели. Процедурные типы.

Сообщение Cheb » 21.02.2015 23:29:29

Почемуй-то мне всегда казалось, что метод - это обычная функция/процедура с одним скрытым параметром в начале?
Т.е.
Код: Выделить всё
TFoo = class
  procedure Hic(i: integer);
end;

эквивалентно
Код: Выделить всё
procedure Hic(Self: TFoo; i: integer);

Или как? :?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Указатели. Процедурные типы.

Сообщение Дож » 22.02.2015 00:04:53

Почемуй-то мне всегда казалось, что метод - это обычная функция/процедура с одним скрытым параметром в начале?

Это утверждение верно, а вот ссылка на метод -- это не то же самое, что ссылка на эквивалентную ему процедуру.

Код: Выделить всё
procedure Hic(Self: TFoo; i: integer);

@Hic -- ссылка на процедуру с двумя аргументами

(Self, @Hic) -- ссылка на метод, задающая функцию с одним аргументом
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Указатели. Процедурные типы.

Сообщение stanilar » 22.02.2015 23:08:11

Cheb писал(а):Почемуй-то мне всегда казалось, что метод - это обычная функция/процедура с одним скрытым параметром в начале?


Вот именно что скрытым. Поэтому и нужно использовать TMethod.
stanilar
постоялец
 
Сообщения: 289
Зарегистрирован: 09.03.2010 19:09:02


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru