Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

вызов функции-члена класса [D6, Win2k]


Толик ©   (2002-03-26 17:07:00) 

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

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...


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

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


oomneeq   (2002-03-26 18:03:00) [2]

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


oomneeq   (2002-03-26 17:52:00) [3]

>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; - в описании класса надо объявить как

classfunction

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

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

Пример из 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):
...


McSimm   (2002-03-26 17:22:00) [4]

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));


reonid   (2002-03-26 17:14:00) [5]

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

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


DieHard   (2002-03-26 17:13:00) [6]

F1 Class methods


Наверх

Титульная страница Поиск, карта сайта Написать письмо