Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.03;
Скачать: 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 вся ветка

Текущий архив: 2003.07.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
1-7432
BJValentine
2003-06-23 12:16
2003.07.03
Обработчики событий формы


3-7350
Man
2003-06-10 12:08
2003.07.03
локальная база с мин. требованием к ресурсам


3-7305
Fantasy
2003-06-09 05:06
2003.07.03
Пример простого лукап поля


9-7278
KoHe4Ho }|{e 6ot
2003-01-18 23:17
2003.07.03
Как перерисовывать image или canvas без мигания ?


1-7399
-=MAN=-
2003-06-23 06:48
2003.07.03
Вместо Sleep() есть что-нибудь?