ПрограммированиеФорумОбщее

Delphi. Как узнать владельца метода

Страницы: 1 2 3 4 Следующая »
#0
21:34, 7 дек 2010

есть директива (of object) в Delphi. Используется например так eventproc = procedure(sender:tobject) of object
Храню набор таких процедур в списке EventList, иногда вызываю.
при вызове помимо sender туда неявно передается self, следовательно метод знает какому объекту он принадлежит.
Как извне получить ссылку на этот объект?
Нужна функция типа GetObj(proc:eventproc):tobject, есть такая?

#1
21:44, 7 дек 2010

Oburec
попробуй eventproc кастануть к poiner'у и посмотреть, что хранится по этому адресу. Наверняка self лежит либо как 4 байта слева(мб справа) либо либо со смещение на 4 байта.

#2
21:59, 7 дек 2010

пасиба, попробую

#3
23:01, 7 дек 2010

событие - это структура TMethod (System.pas)

  TMethod = record
    Code: Pointer;
    Data: Pointer; // то, что тебе нужно
  end; 
#4
23:07, 7 дек 2010

DevilDevil благодарю, помогло. как и сказал предыдущий оратор со сдвижкой 4 байта.
Кстати попытался, не нашел как сдвинуть указатель в делфях.

#5
1:10, 8 дек 2010

addr(X)

#6
12:00, 8 дек 2010

Oburec
А ты уверен, что эта инфа прописана в стандарте и гарантируется, что в следующей Делфе не будет иначе?

#7
12:19, 8 дек 2010

А не проще переделать список, чтобы он хранил ещё и ссылки на сами объекты, чем вот такими хаками пользоваться?

#8
12:47, 8 дек 2010

Oburec
>Кстати попытался, не нашел как сдвинуть указатель в делфях.

с этим туго
если указатель типизированный, то для него действует Inc и Dec, в качестве второго параметра принимается количество увеличиваемых/уменьшаемых пунктов. Но я пользуюсь так:

var
  P: pointer;
  P2: pointer;
begin
  P := SOME_POINTER;

  // смещение в памяти
  P2 := Pointer(integer(P) + 4 {offset});
end;
#9
21:07, 8 дек 2010

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;

Что-то я недопонимаю...

#10
21:40, 8 дек 2010

>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();

правка: пре-опечатка.

#11
21:44, 8 дек 2010

PMethod(@Action)^.Data
Не то?
Ну чтобы без хаков, которые могут поменяться в новой версии.

Твою мать, Адлер опередил...

#12
21:44, 8 дек 2010

TObject(TMethod(e.action).Data) ?

#13
21:45, 8 дек 2010

DevilDevil
> TObject(TMethod(e.action).Data) ?

А это скомпилируется?

#14
21:49, 8 дек 2010

TObject(TMethod(e.action).Data)  - это работает. я прост доразобраться хотел как через сдвиги указателей до объекта добраться. интересно именно через  безтиповый pointer

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.