Verificando o código fonte da WVWTOOLS, na classe AddMenuItem, pude ver que os menus podem ser trabalhados com "condições". Se a condição é validada pelo EVAL, o menu fica habilitado, caso contrário, desabilitado.
Código: Selecionar todos
METHOD AddMenuItem( cCaption, bBlock, bCondition, cBitmap, lAddToContext, cFlag, nKeyCode ) CLASS WvW_tWindow
//****
RETURN ::AddToMenu( cCaption, bBlock, bCondition, cBitmap, lAddToContext, .F.,, cFlag, nKeyCode )
//****
METHOD AddToMenu( cCaption, bBlock, ;
bCondition, cBitmap, lAddToContext, lPopup, lSystem, cFlag, nKeyCode ) CLASS WvW_tWindow
//****
LOCAL hPopup, nID
//
DEFAULT cCaption TO [\-], ;
bCondition TO {|| .T.}, cBitMap TO [], lAddToContext TO .F., lSystem TO .F.
cCaption := ALLTRIM( cCaption )
IF ( lPopup )
IF EMPTY( ::aContextPopups )
hPopup := ::hContextMenu
ELSE
hPopup := ::aContextPopups[-1,1]
ENDIF
nID := ++ ::nContextMenuID
ELSE
IF ( lSystem )
hPopup := ::hSysMenu
nID := ++ ::nSysMenuID
ELSE
hPopup := ::aPopups[-1,1]
nID := ++ ::nMenuID
ENDIF
ENDIF
IF ( PCOUNT() = 0 .OR. ALLTRIM(cCaption) == [\-] )
WvW_AppendMenu( hPopup, MF_SEPARATOR )
ELSE
IF ( cFlag != NIL .AND. nKeyCode != NIL)
AADD( ::aAccelTable, { nKeyCode, cFlag, nId } )
cCaption += ( CHR(9) + cFlag )
ENDIF
IF EVAL( bCondition ) // ************* TESTA A CONDIÇÃO
WvW_AppendMenu( hPopup, MF_ENABLED + MF_STRING, nID, cCaption )
ELSE
WvW_AppendMenu( hPopup, MF_DISABLED + MF_STRING + MF_GRAYED, nID, cCaption )
ENDIF
IF ! EMPTY( cBitmap )
cBitmap := ( ::cImagePath + cBitmap )
WvW_MenuBitmap( hPopup, nID, cBitmap )
ENDIF
IF ( lPopup )
AADD( ::aContextMenuItems, { nID, bBlock, bCondition, cCaption } )
ELSEIF ( lSystem )
AADD( ::aSysMenuItems, { nID, bBlock, bCondition, cCaption } )
ELSE
AADD( ::aMenuItems, { nID, bBlock, bCondition, cCaption } )
ENDIF
IF ( lAddToContext )
::AddContextMenuItem( cCaption, bBlock, bCondition, cBitmap )
ENDIF
ENDIF
//
RETURN Self
Bom, eu não domino muito a sintaxe do EVAL, mas creio que a condição deva ser passada em code block, ou estou errado
