Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
14-7639
Rasa
2003-06-16 02:16
2003.07.03
Скроллинг файлов на экране вверх вниз


1-7416
Yurique
2003-06-23 09:31
2003.07.03
Фокус ввода в TListBox


9-7284
K@zzel
2003-01-21 16:54
2003.07.03
Просто вопрос


1-7462
Переяслов Григорий
2003-06-19 19:46
2003.07.03
Работа с памятью


1-7502
Alexey
2003-06-21 12:32
2003.07.03
Отчеты из Quickreport в Word





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский