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

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

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

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

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

Сообщение iN0k »

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

вроде как раньше можно было

Код: Выделить всё

..
m:TNotifyEvent;
p:pointer;
..
m:=Button1.OnClick;
p:=pointer(m); //< но вроде как и приведения типа не надо было
..


сейчас так не работает, и приходится делать

Код: Выделить всё

p:=pointer((@m)^); 

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

как вернуть обратно?
Аватара пользователя
Vapaamies
постоялец
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vapaamies »

Только указатели на простые процедуры являются одинарными указателями. Указатель на метод -- запись с полями указателя на код метода и экземпляр объекта. В Delphi в TypInfo описан тип TMethod -- это как раз он.
iN0k
постоялец
Сообщения: 146
Зарегистрирован: 18.07.2012 14:09:50

Сообщение iN0k »

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

Код: Выделить всё

procedure tMyClass.A;
begin
...
end;
...
@MyClass.A //< возврящает ЗАПИСь а не указатель???


а с какого момента это произошло? а что вернет `Addr`?
читал оф. документацию, но там нет ничего внятного по этому поводу. где можно почитать?
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

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

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

Сообщение iN0k »

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

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

вроде разобрался.
Аватара пользователя
Vapaamies
постоялец
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vapaamies »

Код: Выделить всё

type
  TNotifyEvent = procedure(Sender: TObject) of object;
var
  OnClick: TNotifyEvent; // <-- TMethod
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

Vapaamies писал(а):

Код: Выделить всё

type
  TNotifyEvent = procedure(Sender: TObject) of object;
var
  OnClick: TNotifyEvent; // <-- TMethod

Код: Выделить всё

type
  TNotifyEvent = procedure(Sender: TObject) of object;
var
  OnClick: TNotifyEvent; // <-- PMethod

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

Сообщение kazalex »

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

Садись. Два.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

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

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

ЗЫ. Да, меня переклинило
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

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

Код: Выделить всё

TFoo = class
  procedure Hic(i: integer);
end;

эквивалентно

Код: Выделить всё

procedure Hic(Self: TFoo; i: integer);

Или как? :?
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

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

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

Код: Выделить всё

procedure Hic(Self: TFoo; i: integer);

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

(Self, @Hic) -- ссылка на метод, задающая функцию с одним аргументом
stanilar
постоялец
Сообщения: 289
Зарегистрирован: 09.03.2010 18:09:02

Сообщение stanilar »

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


Вот именно что скрытым. Поэтому и нужно использовать TMethod.
Ответить