Вниз
Скачать: CL | DM;

Как вызвать метод объекта по указателю?   Найти похожие ветки 

← →
makruha   (2003-06-21 15:05) [0]

Есть функция в которую надо передавать ссылку на методы принадлижащие объекту.
Необходимо внутри этой функции по указателю запустить метод и передать ему параметры.
Как проще это сделать? Помогите!!!!!:(


← →
mrcat ©   (2003-06-21 15:09) [1]

"проще" передать объект:

function LetsQuick(Ptr: Pointer);
begin
TMyObject(Ptr).MyMethod(a,b,c);
end;


← →
Digitman ©   (2003-06-21 15:16) [2]


> ссылку на методы принадлижащие объекту


это как ?


← →
Armen   (2003-06-22 18:40) [3]

type
TA = class
private
....
public
....
end;

var
A: TA
begin
A:= TA.Create;
end.

Ты как думаешь, что есть A?

p.s. А это и есть указатель на объект типа A.


← →
makruha   (2003-06-22 21:08) [4]

Наверное плохо объяснил. В обычной процедуре в качесте параметра
можно передавать функцию или процедуру, типа
type
TFunc=procedure(a:Extended):Extended;
...
procedure MyFunc(x:Extended;Func:TFunc);
begin
...
Func(x);
...
end;

procedure Sin(a:Extended);

procedure Cos(a:Extended);
begin
end;
.....
.....
begin
......
MyFunc(a1,sin);
......
MyFunc(a1,cos);
end;

Т.е. внутри MyFunc я могу запустить или cos или sin
Так вот c методами(процедурами, функциями)принадлижащими объектам это невыходит. Delphi не позволяет передавать метод объекат как параметр. Но можно передать указатель на этот метод.
Но тогда как запустить метод зная указатель?


← →
Ученик ©   (2003-06-22 21:16) [5]

type
TFunc= procedure (a:Extended) of object;

procedure MyFunc(x:Extended;Func:TFunc);
begin
Func(x);
end;

type
TSinCos = class
procedure Sin(a:Extended);
procedure Cos(a:Extended);
end;

procedure TSinCos.Sin(a:Extended);
begin

end;

procedure TSinCos.Cos(a:Extended);
begin

end;

var
B: TSinCos;
a1: Extended;
...
MyFunc(a1, B.sin);
MyFunc(a1, B.cos);
...


← →
VMcL ©   (2003-06-22 21:26) [6]

Чтобы выполнить метод (не class method) нужно в качестве одного из параметров (при соглашении register - первого) передать указатель на конкретный экземпляр класса.

Если bvttncz указатель на метод и указатель на экземпляр класса, имеющего этот метод, то можно написать что-то вроде этого:

procedure InvokeMethod(AObject, Method: Pointer); register;
asm
call edx
end;


Пример:
InvokeMethod(Self, @TForm1.BlaBla);


← →
VMcL ©   (2003-06-22 21:28) [7]

Oops. "bvttncz" = "имеется" :)


← →
VMcL ©   (2003-06-22 21:29) [8]

Замечание: в примере InvokeMethod подразумевается, что Method - метод-процедура класса без параметров с соглашением register (по умолчанию).


← →
makruha   (2003-06-22 21:47) [9]

Ученик, ты прав!!! Я залез в Help-Delphi7 и нашел там ответ, прямо как ты написал. Но всё равно большое большое спасибо!!!
Я буду жить %)



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.013 c
1-7479
Kiril
2003-06-20 22:34
2003.07.03
Insert не вставляет символ 0 , странно...


14-7651
Дмитрий Белькевич
2003-06-15 21:17
2003.07.03
MPL 1.1 - шо за зверь?


7-7746
Alex000
2003-04-20 23:51
2003.07.03
Запуск программы


1-7383
Михайлов Антон
2003-06-22 22:54
2003.07.03
коечто по реестру...


14-7592
Всеволод Соловьёв
2003-06-12 22:11
2003.07.03
Так в чём же всё таки писать 3D-игры ?




   Наверх