Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2014, 13:20   #1
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию Помогите передать указатель на функцию класса

Добрый день
Не получается передать указатель на функцию Firstfunction класса TNewClass :

Код:
	
	TFunctionPointr = function: Boolean;

	TMainClass = class (TThread)
	protected
		procedure GetFriends(FunctionPointr: TFunctionPointr);
	public
		destructor Destroy; override;
	end;

	TNewClass = class(TMainClass)
	strict private
	  function  Firstfunction: Boolean;
	public
	  constructor Create;
	  destructor Destroy; override;
	end;


	...

	implementation
        
        function Test: Boolean;
        begin
        end;
	
	constructor TNewClass.Create;
	begin
	  inherited;
	  GetFriends(@Firstfunction); // вот тут вылетает  [dcc32 Error] ***.pas(109): E2036 Variable required
          GetFriends(@Test); // Все ок
        end;
Не могу понять что компилятор хочет от меня, подскажите пожалуйста чего нужно сделать))
Спасибо

Последний раз редактировалось bakanaev; 21.09.2014 в 15:07.
bakanaev вне форума Ответить с цитированием
Старый 21.09.2014, 14:50   #2
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Pointer(указатель) содержит адресс твоей функции в адресном пространстве процесса. И любой указателя на тип делатся так:
Код:
type
TFunc = function (): Boolean; //тип 
PFunc = @TFunc; //указатель на него
Так же, функция должна иметь ешё и кодовое описание(то есть, что она делать будет).
Использовать её можно примерно так:
Код:
procedure DoSomethink(Func: PFunc);
begin
if Func<> nil then 
begin
Func^; 
ShowMessage('Функция отработала');
end;
end;
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 21.09.2014, 15:07   #3
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

саша40 зачем вы описали то, что и так есть в коде? Я просто опустил все лишнее.

Если передавать функцию не описаную в классе, ту все ок. Если функция описана в классе, то вылетает ошибка как в первом посте

Код:
	TFunctionPointr = function: Boolean;

	TMainClass = class (TThread)
	protected
		procedure GetFriends(FunctionPointr: TFunctionPointr);
	public
		destructor Destroy; override;
	end;

	TNewClass = class(TMainClass)
	strict private
	  function  Firstfunction: Boolean;
	public
	  constructor Create;
	  destructor Destroy; override;
	end;


	...

	implementation
        
        function Test: Boolean;
        begin
        end;
	
	constructor TNewClass.Create;
	begin
	  inherited;
	  GetFriends(@Firstfunction); // вот тут вылетает  [dcc32 Error] ***.pas(109): E2036 Variable required
          GetFriends(@Test); // Все ок
        end;
bakanaev вне форума Ответить с цитированием
Старый 21.09.2014, 15:16   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Код:
TFunctionPointr = function: Boolean of object;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 21.09.2014, 15:19   #5
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
Код:
TFunctionPointr = function: Boolean of object;
Не помогло, все равно пишет:
[dcc32 Error] ***.pas(109): E2036 Variable required
bakanaev вне форума Ответить с цитированием
Старый 21.09.2014, 15:32   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Экспериментируй:
Код:
GetFriends(Firstfunction);
GetFriends(TFunctionPointr(Firstfunction));
GetFriends(TFunctionPointr(@Firstfunction));
GetFriends(@(Self.Firstfunction));
// и т.п. варианты
B попробуй из strict private запихать её, например, в protected.
Чудес-то не бывает, ёмаё.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...

Последний раз редактировалось min@y™; 21.09.2014 в 15:35.
min@y™ вне форума Ответить с цитированием
Старый 21.09.2014, 15:34   #7
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от bakanaev Посмотреть сообщение
Не помогло, все равно пишет:
[dcc32 Error] ***.pas(109): E2036 Variable required
Убирайте у себя везде собачки - это снимает контроль типов. Не надо его снимать, если нет абсолютного понимания происходящего.
Firstfunction - это уже сам по себе указатель, но еще типизированный =-)
StriderX вне форума Ответить с цитированием
Старый 21.09.2014, 18:33   #8
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от StriderX Посмотреть сообщение
Убирайте у себя везде собачки - это снимает контроль типов. Не надо его снимать, если нет абсолютного понимания происходящего.
Firstfunction - это уже сам по себе указатель, но еще типизированный =-)
Спасибо, помогло
bakanaev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП в C++Builder: помогите передать в функцию указатель на структуру =A_Z_A= Помощь студентам 2 13.03.2014 12:05
Передать указатель на указатель в функцию erro Общие вопросы C/C++ 3 29.10.2012 17:59
Как передать указатель на функцию в функцию WIN32APIist Общие вопросы C/C++ 1 27.01.2011 10:35
как в timeSetEvent CALLBACK передать функцию класса ? Teksa Общие вопросы C/C++ 0 23.07.2010 11:21
Как передать в функцию указатель на String avd Общие вопросы C/C++ 6 06.06.2010 17:52