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

Вниз

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

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

Наверх





Память: 0.46 MB
Время: 0.005 c
14-22828
VID
2002-02-27 23:42
2002.04.08
Interbase.Часть 2.


1-22638
LiNkS
2002-03-27 21:35
2002.04.08
Types of actual and formal var parameters must be identical


3-22565
_Oleg_
2002-03-13 22:34
2002.04.08
Не передается строка длинее 32768 символов


3-22572
Malder
2002-03-17 13:54
2002.04.08
Проблема с добавлением текста в Blob поле


1-22627
Zool
2002-03-27 19:37
2002.04.08
Очень просто





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский