juice |
Отправлено: 10.02.2005, 20:42 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 33
|
Как в BCB работать с процедурным типом?
Мне надо в зависимости от хода выполнения программы в опр. момент вызывать одну из множества функций. Хочу сделать переменную типа функция, присваивать ей настоящую функцию и запускать ее.
Как это сделать? |
|
olegenty |
Отправлено: 11.02.2005, 10:45 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
процедурного типа С++ не поддерживает. тут всё более близко к реальной сути "процедурного" типа. вместо этого есть понятие "указатель на функцию", который, при разыменовании и выполнении опреатора "()" применительно к разыменованному указателю даёт "вызов" функции. поясню на примере:
CODE |
class TfmUIForm;
typedef void __fastcall (__closure *TUnregisterFunc)(TfmUIForm*);
|
это определение типа TUnregisterFunc указателя на функцию-член некоего VCL класса, в данном случае — формы, с одним принимаемым параметром типа TfmUIForm* и возвращающую тип void (т.е. ничего не возвращающую)
использовать можно следующим образом:
1. Есть некая форма (для конкретного данного примера)
2. У неё объявлен метод UnregisterForm
CODE |
void __fastcall UnregisterForm(TfmUIForm*);
|
3. Есть некий другой модуль, из которого нужно вызвать метод UnregisterForm данной формы, не имея её определения
4. Для этого в модуле объявляется параметр
CODE |
TUnregisterFunc pUnregister;
|
5. В некотором месте он инициируется передачей указателя на функцию-член формы:
CODE |
pUnregister = UnregisterForm;
|
6. Затем, отложенно вызывается из модуля так:
CODE |
pUnregister(SomeValueOfPointerToTfmUIForm);
|
вуаля
|
|
Asher |
Отправлено: 11.02.2005, 11:27 |
|
Мастер участка
Группа: Модератор
Сообщений: 550
|
Проще обойтись классом с одной этой функцией в виде public метода и отнаследовать его столько, сколько надо.
Или вообще перегрузкой функций обойтись.
Все зависит от конкретного случая.
|
|
olegenty |
Отправлено: 11.02.2005, 11:53 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
пример надуманный, я от этого решения отказался, просто сорец остался, а код рабочий.
|
|