:: Visual Foxpro, Foxpro for DOS
BUG: PAD() and POPUP()
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
Очередная застарелая проблема. Существует ещё со времён VFP7 и даже наверное
более ранних. Остаётся и в VFP9 Public Beta.

Функция PAD() с дополнительными параметрами не работает для пунктов главного
системного меню (_MSYSMENU). Ни с системными пунктами, ни с созданными
пользователем. В то время как хелп декларирует подобную функциональность
"You can also use PAD() with the Visual FoxPro system menu bar"

Например если я добавлю свой пункт к системному меню по умолчанию (в среде
разработки), то потом не смогу определить его наличие при помощи функции PAD

DEFINE PAD pad1 OF _MSYSMENU PROMPT "Test Pad"
? PAD("pad1") && return .F.
? PAD("pad1", "_MSYSMENU") && return .F.

Аналогично и для системных пунктов главного меню (например пункт File
существует на момент исполнения теста):

? PAD("_MSM_FILE") && return .F.
? PAD("_MSM_FILE", "_MSYSMENU") && return .F.

Как обходной манёвр можно использовать следующую функцию:

? PAD4sysmenu("_MSM_FILE")
? PAD4sysmenu("pad1")

FUNCTION PAD4sysmenu(tcPadName AS String)
LOCAL llResult, ln1
llResult = .F.
FOR ln1 = 1 TO CNTPAD("_MSYSMENU")
IF UPPER(GETPAD("_MSYSMENU", ln1)) == UPPER(m.tcPadName)
llResult = .T.
EXIT
ENDIF
ENDFOR
RETURN m.llResult

Другая ошибка наличествует в функции POPUP() - она не работает с системными
подменю (например _MEDIT, _MFILE), в тов ремя как хелп утверждает что "The
menu can also be a Visual FoxPro system menu"

? POPUP("_MEDIT") && return .F. while popup really exists

Как обходной манёвр можно использовать следующую функцию:

? POPUP4sysmenu("_MEDIT")
? POPUP4sysmenu("_MEDIT_DUMMY")

FUNCTION POPUP4sysmenu(tcPopupName AS String)
LOCAL llResult, loExc AS Exception
llResult = .T.
TRY
llResult = CNTBAR(m.tcPopupName) > 0
CATCH TO loExc WHEN m.loExc.ErrorNo = 165
llResult = .F.
ENDTRY
RETURN m.llResult

Надеюсь это несложно будет исправить.
Багрепорт также отослан на vfpfeed

P.S. Я не уверен, но возможно для существующих версий обходные способы
следует оформить как статьи KB, ибо в своё время долго и безуспешно искал
решение проблемы, но к сожалению так ничего ниде и не нашёл Естественно
решение с TRY ... CATCH не подойдёт для VFP7 и более ранних (а ON ERROR не
подойдёт т.к. функция может быть вызвана из метода класса и его обработчик
Error перехватит ошибку).
Кстати заодно интересное наблюдение - CNTBAR() не генерирует ошибку, если
вместо имени подменю указать любое имя из SYS(2013) т.е. не только имена
несуществующих подменю, но и имена их пунктов! Будет возвращено 0 - потому
надо учитывать, что мой обходной манёвр не гарантирует что меню таки
существует, он лишь гарантирует что если оно и определено, то оно "пусто", а
значит его можно безболезненно переопределять. Суть всех этих махинаций
лежит в неполной функциональности набора классов MENULIB от Mark Hall - они
во-первых имеют ошибку связанную с "неработой" PAD(), и во-вторых Марк при
создании подменю не использует их нормальные имена (из-за проблем с POPUP
надо полагать), а ставит для них SYS(2015) имена - соответственно потом
вылязят проблемы с отсуствием списка окон в подменю _mWindow (ибо у него не
такое имя!), и с работой функций SKPBAR()




------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 19 MikhsR  (Гостей: 18)

© 2000-2024 Fox Club 
Яндекс.Метрика