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 |
© 2000-2024 Fox Club  |