![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
CROTishka |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: 1 Всего: 2 |
есть функция, у которой в качестве одного из аргуметов выступает переменная процедурного типа.
в первом случае - свободная процедура, во втором - метод объекта. как сделать так, чтобы не писать тело ххх два раза? по идее надо скастовать как-то так:
но происходит ошибка компиляции: [Pascal Fatal Error] ****.pas(700): F2084 Internal Error: C4989 Это сообщение отредактировал(а) CROTishka - 1.7.2010, 12:26 |
||||
|
|||||
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: 1 Всего: 2 |
Upd: разобрался - приведение к TMyProcedureType1 не нужно, достаточно TMethod(x).Code. вроде работает.
но возник ещё одни вопрос: можно ли в процедурном типе задать локальную процедуру?
ругается : [Pascal Error] ****.pas(788): E2094 Local procedure/function '****' assigned to procedure variable |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
CROTishka, к сожалению локальные функции используют стековые переменные вышестоящих функций, так что думаю это ограничение.
Добавлено через 7 минут и 9 секунд Начиная с делфи 2009 можно использовать не локальную функцию, а анонимную. Например
Добавлено через 9 минут и 12 секунд Еще один вариант реализации без перегрузки, это шаблонная функция с параметром типа. Т.е. заставить компилятор, чтобы он сам сделал 2е реализации функии. Одну для метода, другую для простой функции. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: 1 Всего: 2 |
ну, передать её у меня получилось по @MyLocalproc, но к сожалению с доступом к переменным косяк - при такой передаче локальные переменные процедуры недоступны для изменения, хотя можно передать через глобальные. но глобальные переменные - зло =(
буду думать, как ещё извернуться. Это сообщение отредактировал(а) CROTishka - 1.7.2010, 13:27 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
CROTishka, если переделать через анонимную функцию, то создается мини-объект, куда копируются все локальные переменные функции и значения оказываются доступными даже по выходу из нее.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: 1 Всего: 2 |
В делфи(2006) есть анонимные функции? о.О
Добавлено через 1 минуту и 35 секунд UPD: я уже передал нужную мне переменную параметром. не очень красиво, но надёжно работает. |
|||
|
||||
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: 1 Всего: 2 |
что-то наврал я =(
xxx(***; TMyProcedureType1 (TMethod(x).Code)); не работает. TMyProcedureType = procedure; TMyProcedureType1 = procedure ******; TMyProcedureType2 = procedure ****** of object; ...... var x: TMyProcedureType; if x is TMyProcedureType1 then тоже не работает. =( что-то я совсем запутался. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Анонимные начиная с версии 2009. Шаблонные параметры кажись начиная с 2007й. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
CROTishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 30.7.2009 Репутация: 1 Всего: 2 |
в итоге сделал как хорошие люди насоветовали:
http://www.wehlou.com/Code/d6_items.htm#co...gproceduretypes Добавлено через 4 минуты и 31 секунду Хмм. а чем шаблонные функции отличаются от функций, аргументами которых выступают генерики? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Я это и имел ввиду. Единственное, что все таки все вкусности появились начиная с 2009й версии. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |