есть директива (of object) в Delphi. Используется например так eventproc = procedure(sender:tobject) of object
Храню набор таких процедур в списке EventList, иногда вызываю.
при вызове помимо sender туда неявно передается self, следовательно метод знает какому объекту он принадлежит.
Как извне получить ссылку на этот объект?
Нужна функция типа GetObj(proc:eventproc):tobject, есть такая?
Oburec
попробуй eventproc кастануть к poiner'у и посмотреть, что хранится по этому адресу. Наверняка self лежит либо как 4 байта слева(мб справа) либо либо со смещение на 4 байта.
пасиба, попробую
событие - это структура TMethod (System.pas)
TMethod = record
Code: Pointer;
Data: Pointer; // то, что тебе нужно
end; DevilDevil благодарю, помогло. как и сказал предыдущий оратор со сдвижкой 4 байта.
Кстати попытался, не нашел как сдвинуть указатель в делфях.
addr(X)
Oburec
А ты уверен, что эта инфа прописана в стандарте и гарантируется, что в следующей Делфе не будет иначе?
А не проще переделать список, чтобы он хранил ещё и ссылки на сами объекты, чем вот такими хаками пользоваться?
Oburec
>Кстати попытался, не нашел как сдвинуть указатель в делфях.
с этим туго
если указатель типизированный, то для него действует Inc и Dec, в качестве второго параметра принимается количество увеличиваемых/уменьшаемых пунктов. Но я пользуюсь так:
var P: pointer; P2: pointer; begin P := SOME_POINTER; // смещение в памяти P2 := Pointer(integer( P) + 4 {offset}); end;
DevilDevil
так и пытался...
Вариант раз, там правда не адрес процедуры а ссылка на адресс.
tobject(integer(@e.action)+{-}4) (но значение @e.action совпадает с полем Code приведенной процедуры к TMethod)
при попытке сделать так
tobject(integer((@e.action)^)+4) - такая конструкция по моему разумению вроде верна (разыменование указателя указывающего на процедуру)? но возвращает хрень. как в случае +4, так и -4.
при вычислении реального объекта с помощью приведения к tMethod возвращается
tmethod=($4FA028, $7F904020)
адреса ведь сдвинуты не на 4 байта. 4FA028 - моя процедура @e.action без всяких ^.
при сдвиге +4 получаем 4FA02C, при -4 = 4FA024. Но никак не $7F904020.
unit System;
TMethod = record
Code, Data: Pointer;
end;
Что-то я недопонимаю...
>tobject(integer((@e.action)^)+4)
ересь
попробуй так:
var e:TSuperClass; ... if(Integer( e)=pInteger( Integer( @e.action)+4)^)then Win( );
или так:
type PMethod=^TMethod ;//мб чё напутал var e:TSuperClass; ... if(Integer( e)=PMethod( @e.action)^.Data)then Win( );
правка: пре-опечатка.
PMethod(@Action)^.Data
Не то?
Ну чтобы без хаков, которые могут поменяться в новой версии.
Твою мать, Адлер опередил...
TObject(TMethod(e.action).Data) ?
DevilDevil
> TObject(TMethod(e.action).Data) ?
А это скомпилируется?
TObject(TMethod(e.action).Data) - это работает. я прост доразобраться хотел как через сдвиги указателей до объекта добраться. интересно именно через безтиповый pointer
Тема в архиве.