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

Delphi. Как узнать владельца метода (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
23:23, 8 дек 2010

Adler
> это адрес метода, а не процедуры.
Я это и имел ввиду)

Adler
> это адрес в котором предположительно хранится указатель на экземпляр класса.
Ну как выяснилось - нет. не храниться. см. пост 24 от DevilDevil

TarasB
> Короче, УМВР
можно было не распинаться. на первой странице сказал что такой метод работает.
Adler
> восемь шестнадцатеричных знаков это 4 байта. кэп
Спасибо, кэп). Чет не подумал, обычно везде по 6 знаков пишет

#31
23:25, 8 дек 2010

Вот не люблю в Паскале отсутствие необходимости писать пустые скобки для метода без параметров, из-за этого такая путаница.
Во-первых, метод не вызовется хотя бы из-за унификации: если для метода с параметрами не надо делать вызов, то хренли его делать для метода с параметрами.
Во-вторых, я проверил:

{$APPTYPE CONSOLE}

type
  eventproc = function: TMethod of object;

  c = class
    function a: TMethod;
  end;

function c.a;
begin
  WriteLn('ОЛОЛО');
end;

var
  e: eventproc;
  o: c;

begin
  o := c.Create;
  e := o.a;

  WriteLn(TObject(TMethod(e).Data).ClassName);

  o.Free;
  ReadLn;
end.

Для моей версии вызова не происходит. Я не знаю, описано ли это в стандарте, но для других версий дельфы см. "во-первых".

#32
23:28, 8 дек 2010

Oburec
>Ну как выяснилось - нет. не храниться. см. пост 24 от DevilDevil
>Method := TMethod(Form1.OnCreate);
fail же. На сколько я помню Form1.OnCreate - это не метод класса, а указатель на метод класса. Естественно если брать на него указатель получится ересь. Или я вас не понял и разговор был про указатель на указатель на метод класса?

#33
23:36, 8 дек 2010

TarasB
>Для моей версии вызова не происходит.
>e := o.a;
явно кастуешь к типу который является методом.
Такое с вот такими предположительно не прокатит:

c = class
    function a: eventproc;
    function b: pointer;
  end;

и придётся юзать либо Addr либо собаку.

#34
23:36, 8 дек 2010

Adler
речь о событиях

#35
23:37, 8 дек 2010

DevilDevil
ыЫЫЫ. ясно, не знал.

#36
23:40, 8 дек 2010

Adler
последнюю фразу не очень понял), но по адресу p = pointer(integer(@e.action)+4)  ничего полезного явно не храниться.

Все так, последний вопрос для меня по теме не ясен остался. Как получить адрес на структуру tmethod, не используя типизированных указателей?
только поинтеры разыменования и eventproc.
  eventproc = procedure(sender:tobject)  of object;

C использованием примера из поста 24
  Method := TMethod(OnCreate);
  P:=@Method;

Как найти P не используя преобразование к TMethod

#37
23:43, 8 дек 2010

Adler
> function a: eventproc;
> function b: pointer;

И как это скомпилировать, чтобы не запарывалось на e := o.a?
Полный текст, вызывающий внутренний метод, покажи.

#38
23:46, 8 дек 2010

Oburec
> Как найти P не используя преобразование к TMethod


АХАХАХАХА

  WriteLn(TObject(ppointer(integer(@@e) + 4)^).ClassName);

Это работает!!!

Только нафига тебе? Чтобы работало - это не тот случай, когда надо так делать. А чтобы потренироваться - лучше с битмапами без ГДИ поработай. Получаешь Mem := ScanLine[Height - 1]; и по этому адресу со смещением пикселы рисуешь.

#39
23:50, 8 дек 2010

TarasB
из спортивного интереса. это даже не компилируется. двойная собака на @@OnCreate
Можешь сделать пример на основе OnCreate формы?

#40
23:57, 8 дек 2010
procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption := TObject(ppointer(integer(@@OnCreate) + 4)^).ClassName;
end;
#41
0:01, 9 дек 2010

у меня компилируется )
хз почему )

#42
0:02, 9 дек 2010

TarasB
ух ё, работает. благодарствую. прост проверял с помощью ctrl+f7 под отладчиком. там ошибка приключается при попытке вычисления такой лабуды

#43
0:05, 9 дек 2010

Короче
OnCreate - это вызов метода
@OnCreate - это адрес кода, тот самый pointer в структуре TMethod
@@Onreate - это ссылка на структуру TMethod.
Вот такая вот фигня.
А в си, чтобы передать массив строк по ссылке, используют при вызове функции параметр char***. Короче, всякое бывает.
Но в Си мне больше нравится система с именами функций:
OnCreate() - это вызов
OnCreate - адрес кода
&OnCreate - указатель на структуру.
То есть со скобочками - вызов, без скобочек - указатель на код.

#44
0:10, 9 дек 2010

Oburec
>но по адресу p = pointer(integer(@e.action)+4) ничего полезного явно не храниться.
я думал, что action - это метод класса, а у вес это событие(то есть уже взятый указатель на метод).

>Как получить адрес на структуру tmethod,
в delphi есть записи(record), а структур нету.

>Как найти P не используя преобразование к TMethod
у тебя тут P - это указатель на переменную Method. Причём не важно какой у неё тип, это всё равно указатель на переменную. как его получить? можно, но сначала убеди, что ты хочешь именно этого.

TarasB
>АХАХАХАХА
Наконец-то ты перечитал топик, я рад.
>Полный текст, вызывающий внутренний метод, покажи.

{$APPTYPE CONSOLE}

type
  eventproc = function: TMethod of object;

  c = class
    function a: eventproc;
    function b: pointer;
  end;

function c.a:eventproc;
begin
  WriteLn('ОЛОЛО');
  result=0;
end;

function c.b:pointer;
begin
  WriteLn('TОЛОЛО');
  result=0;
end;

var
  e: eventproc;
  o: c;

begin
  o := c.Create;
  e := o.a; //eventproc = eventproc вроде должно проживать. если не прожуёт то так: e := pointer(o.a); если снова не прожуёт, то так:e := eventproc(pointer(o.a));
  e := pointer(o.b); //eventproc = pointer вроде должно проживать. если не прожуёт то так: e := eventproc(pointer(o.b));
  WriteLn(TObject(TMethod(e).Data).ClassName);

  o.Free;
  ReadLn;
end.
//проверять мне не на чем... поэтому могут быть опечатки и вообще возможно ничего не заработает. 
Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

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