Главная страница
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.012 c
7-22851
ALex J@m
2001-12-07 07:16
2002.04.08
Переход в ждущий или спящий режим в Win 2k


3-22550
Dok_3D
2002-03-14 15:18
2002.04.08
Этот хитрый FOR XML AUTO .......


3-22545
Beer
2002-03-15 12:16
2002.04.08
Динамический отчет разбивка на страницы


1-22712
$Hic0
2002-03-26 16:24
2002.04.08
Непонятно отчего ошибка раз... неясно почему она не обрабатывается :(


1-22747
Filat
2002-03-26 20:36
2002.04.08
Где взять RxLib для Delphi 6.