On-line: PSP, tnsr2, гостей 0. Всего: 2 [подробнее..]
АвторСообщение





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.03.06 12:29. Заголовок: Проверка UDF-функции в программе


Если пользовательские функции вызываются
с помощью макроса ( пример: &UDFunc ).
Имеется ли возможность проверить наличие имя такой
функции в программе?

Спасибо: 0 
Профиль
Ответов - 12 [только новые]


постоянный участник


Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.03.06 12:33. Заголовок: Re:


Интересно, а что выдает TYPE() для этой функции?

Спасибо: 0 
Профиль
постоянный участник


Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.03.06 12:55. Заголовок: Re:


Не знаю, но может быть включать вызов функции в блок
BEGIN SEQUENCE? И если ошибка перехватывается, то предпринимать нужные действия.
На низком уровне есть функции которые проверяют наличие соответствующего символа. Одна из таких функций например используется в MEMOEDIT() для пользовательской функции. Это функции типа (я могу не правильно их yfpdfnm) chk_sym() (или sym_chk()) и еще ряд других для работы с символами.
Можно к ним написать "обертку" для вызова из программы на Clipper.

Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.03.06 14:19. Заголовок: Детально


Если использую блок BEGIN SEQUENCE и есть ошибка
внутри вызываемой функции - то эта функция также
попадает в блок RECOVERY.

Спасибо: 0 
Профиль
постоянный участник


Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.03.06 14:42. Заголовок: Re:


Тогда кроме низкоуровнего программирования ничего в голову мне не приходит. Могу с вашего позволения задать этот вопрос на форуме по FiveWin.

Спасибо: 0 
Профиль
постоянный участник


Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 22.03.06 15:32. Заголовок: Re:


На форуме по FiveWin первое пришедшее предложение тоже ссылается на функцию TYPE( "SomeUDF()" ).
Кстати, а что эта функция выдает для стандартных функций Clipper и для пользовательских функций? Я ни разу ей не пользовался, так как меня устраивала VALTYPE().

Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 23.03.06 11:35. Заголовок: Re:


К сожалению, TYPE() и ValType() применяются
только к переменным (Private, Public, static ...)

Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 23.03.06 11:37. Заголовок: Re:


TYPE() в любом случае выдает 'U'

Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 23.03.06 12:48. Заголовок: type работает


PROC MAIN
? Type('QQ1()') // UI
? Type('QQ2()') // U
RETURN

FUNC QQ1
? '..qq1'
RETURN Nil

Спасибо: 0 
Профиль
постоянный участник


Не зарегистрирован
Зарегистрирован: 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.

Спасибо: 0 
Профиль
постоянный участник


Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 23.03.06 13:00. Заголовок: Re:


Еще одно замечание в пользу написания собственной функции. Как я уже сообщал, на мой вопрос на форуме по FiveWin Антонио Линарес вообще предложил использовать TYPE( cExp ), то есть проверять все выражение целиком, в которое включены функции. Однако я вчера получил результат, который по-моему отвергает предложение Антонио.
Так для выражения TYPE( "ABS() + UNDEFINED()" ), где UNDEFINED() - неразрешенная ссылка на функцию, я получил результат "UE".

Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 24.03.06 10:41. Заголовок: Re:


Владимир, Спасибо за столь внимательное отношение к
моему вопросу. Буду еще пытаться дальше -
у меня почему то TYPE всегда выдает 'U' , может
я где-то неверно написал операторы.

Спасибо: 0 
Профиль





Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 24.03.06 10:50. Заголовок: Re:


Ура! Получилось. Владимир, все правильно, если UDF-функция
определена то TYPE('UDF()') выдает 'UI' . Спасибо!


Спасибо: 0 
Профиль
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 89
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет