Adler
> это адрес метода, а не процедуры.
Я это и имел ввиду)
Adler
> это адрес в котором предположительно хранится указатель на экземпляр класса.
Ну как выяснилось - нет. не храниться. см. пост 24 от DevilDevil
TarasB
> Короче, УМВР
можно было не распинаться. на первой странице сказал что такой метод работает.
Adler
> восемь шестнадцатеричных знаков это 4 байта. кэп
Спасибо, кэп). Чет не подумал, обычно везде по 6 знаков пишет
Вот не люблю в Паскале отсутствие необходимости писать пустые скобки для метода без параметров, из-за этого такая путаница.
Во-первых, метод не вызовется хотя бы из-за унификации: если для метода с параметрами не надо делать вызов, то хренли его делать для метода с параметрами.
Во-вторых, я проверил:
{$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.Для моей версии вызова не происходит. Я не знаю, описано ли это в стандарте, но для других версий дельфы см. "во-первых".
Oburec
>Ну как выяснилось - нет. не храниться. см. пост 24 от DevilDevil
>Method := TMethod(Form1.OnCreate);
fail же. На сколько я помню Form1.OnCreate - это не метод класса, а указатель на метод класса. Естественно если брать на него указатель получится ересь. Или я вас не понял и разговор был про указатель на указатель на метод класса?
TarasB
>Для моей версии вызова не происходит.
>e := o.a;
явно кастуешь к типу который является методом.
Такое с вот такими предположительно не прокатит:
c = class function a: eventproc; function b: pointer; end;
и придётся юзать либо Addr либо собаку.
Adler
речь о событиях
DevilDevil
ыЫЫЫ. ясно, не знал.
Adler
последнюю фразу не очень понял), но по адресу p = pointer(integer(@e.action)+4) ничего полезного явно не храниться.
Все так, последний вопрос для меня по теме не ясен остался. Как получить адрес на структуру tmethod, не используя типизированных указателей?
только поинтеры разыменования и eventproc.
eventproc = procedure(sender:tobject) of object;
C использованием примера из поста 24
Method := TMethod(OnCreate);
P:=@Method;
Как найти P не используя преобразование к TMethod
Adler
> function a: eventproc;
> function b: pointer;
И как это скомпилировать, чтобы не запарывалось на e := o.a?
Полный текст, вызывающий внутренний метод, покажи.
Oburec
> Как найти P не используя преобразование к TMethod
АХАХАХАХА
WriteLn(TObject(ppointer(integer(@@e) + 4)^).ClassName);
Это работает!!!
Только нафига тебе? Чтобы работало - это не тот случай, когда надо так делать. А чтобы потренироваться - лучше с битмапами без ГДИ поработай. Получаешь Mem := ScanLine[Height - 1]; и по этому адресу со смещением пикселы рисуешь.
TarasB
из спортивного интереса. это даже не компилируется. двойная собака на @@OnCreate
Можешь сделать пример на основе OnCreate формы?
procedure TForm1.Button1Click(Sender: TObject); begin Caption := TObject( ppointer( integer( @@OnCreate) + 4)^).ClassName; end;
у меня компилируется )
хз почему )
TarasB
ух ё, работает. благодарствую. прост проверял с помощью ctrl+f7 под отладчиком. там ошибка приключается при попытке вычисления такой лабуды
Короче
OnCreate - это вызов метода
@OnCreate - это адрес кода, тот самый pointer в структуре TMethod
@@Onreate - это ссылка на структуру TMethod.
Вот такая вот фигня.
А в си, чтобы передать массив строк по ссылке, используют при вызове функции параметр char***. Короче, всякое бывает.
Но в Си мне больше нравится система с именами функций:
OnCreate() - это вызов
OnCreate - адрес кода
&OnCreate - указатель на структуру.
То есть со скобочками - вызов, без скобочек - указатель на код.
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.
//проверять мне не на чем... поэтому могут быть опечатки и вообще возможно ничего не заработает. Тема в архиве.