Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.08;
Скачать: CL | DM;

Вниз

вызов функции-члена класса   Найти похожие ветки 

 
Толик   (2002-03-26 17:07) [0]

Проблема такая: есть несколько объектов, нужно для всех них вызвать один из их методов. Проблема в том, что заранее неизвестно, какой из методов надо вызывать. В С++ проблема решается так:

class TMyClass{
private:
int val;
public:
TMyClass(const int i){val = i};
void mem_fnc(){/*вывод зн-я val*/};
};

void Main(void){
//объявляем тип указателя на ф-ю класса TMyClass
typedef void __fastcall(TMyClass::*pmf)();
//получаем адрес ф-и mem_fnc
pmf p = &TMyClass::mem_fnc;

TMyClass1* pMC1 = new TMyClass1(1);
TMyClass2* pMC2 = new TMyClass2(2);
//вызов ф-и mem_fnc через указатель
(pMC1->*p)(); //получаем значение "1"
(pMC2->*p)(); //получаем значение "2"
delete pMC1;
delete pMC2;
}

А вот теперь внимание ВОПРОС: как сделать то же самое в Делфях???
Проблема в том, что следующий пример НЕ РАБОТАЕТ!

TProc = procedure()of object;
var
Proc: TProc;
MC1, MC2: TMyClass;
begin
MC1 := TMyClass.Create(1);
MC2 := TMyClass.Create(2);
Proc := MC1.mem_fnc;
{Вот здесь-то и проблема, т.к. Proc указывает на на ф-у mem_fnc ТОЛЬКО переменной MC1, в то время как в предыдущем примере p указывает на ф-ю mem_fnc ЛЮБОЙ переменной типа TMyClass}
MC1.Free();
MC2.Free();
end;

Дошло уже до того, что я объявлял эту ф-ю как виртуальную и через ClassType(), получая указатель на vmt, искал там нужную ф-ю и вызвал её. Всё работало до тех пор, пока ф-я не использовала переменные-члены-класса. Как вызывать ф-и члены класса из vmt я пока так и не понял. Help me pls...


 
DieHard ©   (2002-03-26 17:13) [1]

F1 Class methods


 
reonid ©   (2002-03-26 17:14) [2]

указатель на метод в Дельфи представляет собой след. структуру
TMethod = record
Code, Data: Pointer;
end;

Proc := SomeObj.mem_fnc;
TMethod(Proc).Data := OtherObj;
Proc(); {OtherObj.mem_fnc}


 
McSimm ©   (2002-03-26 17:22) [3]

type
TProc = function: Integer of object;
var
Proc: TProc;
MC1, MC2: TMyClass;
begin
...
TMethod(Proc).Code := @TMyClass.mem_fnc;
TMethod(Proc).Data := MC1;
ShowMessage(IntToStr(proc));
TMethod(Proc).Data := MC2;
ShowMessage(IntToStr(proc));


 
oomneeq ©   (2002-03-26 17:52) [4]

>TProc = procedure()of object;
>var
> Proc: TProc;
> MC1, MC2: TMyClass;
>begin
> MC1 := TMyClass.Create(1);
> MC2 := TMyClass.Create(2);
> Proc := MC1.mem_fnc;
>{Вот здесь-то и проблема, т.к. Proc указывает на на ф-у mem_fnc >ТОЛЬКО переменной MC1, в то время как в предыдущем примере p >указывает на ф-ю mem_fnc ЛЮБОЙ переменной типа TMyClass}
> MC1.Free();
> MC2.Free();
>end;



mem_fnc; - в описании класса надо объявить как

class function

Само собой, после этого она не должна/не может обращаться к данным конкретног экземпляра

Да, и вызвать ее можно будет вообще без создания экземпляра.

Пример из System
TObject = class
...
class function InitInstance(Instance: Pointer): TObject;
..
class function ClassName: ShortString;
class function ClassNameIs(const Name: string): Boolean;
class function ClassParent: TClass;
class function ClassInfo: Pointer;
class function InstanceSize: Longint;
class function InheritsFrom(AClass: TClass): Boolean;
class function MethodAddress(const Name: ShortString):
...


 
oomneeq ©   (2002-03-26 18:03) [5]

Сори, почитал повнимательней и понял, что я несовсем в тему, но надеюсь с толку не сбил :-)



 
Толик   (2002-03-27 12:32) [6]

Огромное всем спасибо.
class function - это не то (ведь в С"шном примере mem_fnc не была объявлена как static), а вот TMethod - это действительно то, что было нужно. Ещё раз спасибо...



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

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

Наверх




Память: 0.48 MB
Время: 0.014 c
3-22592
Siberia
2002-03-11 17:43
2002.04.08
использование UPPER в SQL-запросах


1-22685
Kirill_Other
2002-03-26 09:51
2002.04.08
Как проверить имеет ли порожденный объект переопределенный метод?


1-22693
Сатир
2002-03-26 15:05
2002.04.08
Директивы компилятора


1-22769
mahortov
2002-03-27 13:58
2002.04.08
Формы из D6 в D5?


14-22802
vajo
2002-02-26 15:15
2002.04.08
Всем привет! Вопрос по W2000 server