Автор | Сообщение |
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.03.06 12:29. Заголовок: Проверка UDF-функции в программе
Если пользовательские функции вызываются с помощью макроса ( пример: &UDFunc ). Имеется ли возможность проверить наличие имя такой функции в программе?
|
|
|
Ответов - 12
[только новые]
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.03.06 12:33. Заголовок: Re:
Интересно, а что выдает TYPE() для этой функции?
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.03.06 12:55. Заголовок: Re:
Не знаю, но может быть включать вызов функции в блок BEGIN SEQUENCE? И если ошибка перехватывается, то предпринимать нужные действия. На низком уровне есть функции которые проверяют наличие соответствующего символа. Одна из таких функций например используется в MEMOEDIT() для пользовательской функции. Это функции типа (я могу не правильно их yfpdfnm) chk_sym() (или sym_chk()) и еще ряд других для работы с символами. Можно к ним написать "обертку" для вызова из программы на Clipper.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.03.06 14:19. Заголовок: Детально
Если использую блок BEGIN SEQUENCE и есть ошибка внутри вызываемой функции - то эта функция также попадает в блок RECOVERY.
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.03.06 14:42. Заголовок: Re:
Тогда кроме низкоуровнего программирования ничего в голову мне не приходит. Могу с вашего позволения задать этот вопрос на форуме по FiveWin.
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 22.03.06 15:32. Заголовок: Re:
На форуме по FiveWin первое пришедшее предложение тоже ссылается на функцию TYPE( "SomeUDF()" ). Кстати, а что эта функция выдает для стандартных функций Clipper и для пользовательских функций? Я ни разу ей не пользовался, так как меня устраивала VALTYPE().
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 23.03.06 11:35. Заголовок: Re:
К сожалению, TYPE() и ValType() применяются только к переменным (Private, Public, static ...)
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 23.03.06 11:37. Заголовок: Re:
TYPE() в любом случае выдает 'U'
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 23.03.06 12:48. Заголовок: type работает
PROC MAIN ? Type('QQ1()') // UI ? Type('QQ2()') // U RETURN FUNC QQ1 ? '..qq1' RETURN Nil
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 23.03.06 12:55. Заголовок: Re:
Замечу, что функции не бывают LOCAL в смысле определений переменных в Clipper. Они либо глобальные, либо статические. Но так как я понимаю, вы имеете дело с функциями пользователей, которые могут использоваться в выражениях, то скорей всего это не STATIC функции, а глобальные. Я вчера дома проверил. TYPE() для стандартных функций выдает "UE". Для определенных пользователем функций, которые приредактированы, выдает "UI". А для функций, ссылка на которых не разрешена", выдает "U". То есть есть три различных идентификационных констант "UE", "UI" и "U". С другой стороны, если бы я этим был озабочен, то скорей всего бы подумал о написании своей функции с использованием функций низкого уровня Clipper для работы с символами: __get_sym, __chk_sym, __sym_search.
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 23.03.06 13:00. Заголовок: Re:
Еще одно замечание в пользу написания собственной функции. Как я уже сообщал, на мой вопрос на форуме по FiveWin Антонио Линарес вообще предложил использовать TYPE( cExp ), то есть проверять все выражение целиком, в которое включены функции. Однако я вчера получил результат, который по-моему отвергает предложение Антонио. Так для выражения TYPE( "ABS() + UNDEFINED()" ), где UNDEFINED() - неразрешенная ссылка на функцию, я получил результат "UE".
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 24.03.06 10:41. Заголовок: Re:
Владимир, Спасибо за столь внимательное отношение к моему вопросу. Буду еще пытаться дальше - у меня почему то TYPE всегда выдает 'U' , может я где-то неверно написал операторы.
|
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 24.03.06 10:50. Заголовок: Re:
Ура! Получилось. Владимир, все правильно, если UDF-функция определена то TYPE('UDF()') выдает 'UI' . Спасибо!
|
|
|
|