Algo asi
Redefine Get oGetCodigo ...
oGetCodigo:cToolTip := "C贸digo obligatorio"
...
if Empty( oGetCodigo:VarGet() )
oGetCodigo:showToolTip()
end if
Este c贸digo ahora no funciona.
Gracias, Manuel Calero.
Nose, si es complicarte, pero yo lo trabajo en un VALID() que llama una funcion y le doy el mensaje que quiera y sirve para cualquier oGET que no cumpla la condicion de que que de vacio, claro imagino que con un tooltip debe verse mas coqueto, pero debes crear 1 tooltip para cada oGET, eso creo, te doy mi ejmplo.
FUNCTION novacio(variable) // VALIDA CAMPO NO QUEDE VACIO
IF EMPTY(variable)
MSGALERT("Campo no puede quedar vacio"," ATENCI脫N")
RETURN .F.
ENDIF
RETURN .T. // FIN VALIDA CAMPO NO QUEDE VACIO
y llamo la funcion desde el VALID del oGET.
REDEFINE GET oGET1 VAR oDbf:ben_codigo ID 103 OF oDlgDatBen PICTURE "@!";
VALID(novacio(oDbf:ben_codigo), vcodigo(oDbf:ben_codigo, lAPPEND));
WHEN(lAPPEND) UPDATE
espero te sirva, aclare o de nuevas ideas para tu pregunta...
El tema de MsgAlert y MsgStop es como lo tengo en la actualidad pero asi, estamos obligando al usuario a pulsar INTRO por cada mensaje, mi idea es mostrar el tootip para informar al usuario de por que no se valida el formulario, y puede seguir trabajando sin darle a INTRO.
Saludos
*** Ejemplo:
...
if ! "NB" $ cSit
WinInfo("Situacion debe ser:"+CRLF+;
"N=Normal"+CRLF+;
"B=Bloqueado", oGetSit)
endif
Se tienes problema con focus cuando llamar WinInfo intenta:
WinInfo("Texto", oGet, .F.)
*** La funcion:
//-----------------------------------------------------------------------------
// WinInfo : Cria ventana estilo tooltip
// <cText> : Texto o bloco de texto
// <oObj > : Objeto (get, button, say, etc) de la ventana
// <lLetLostFocus>: Debe cerrar cuando perder el focus?
//----------------------------------------------------------------------------
function WinInfo(cText, oObj, lLetLostFocus)
local oFont, oWnd, aPos, hOldFont
local aText, nLenText, hWnd, oClose, oTempo
local nRow := oObj:nHeight()
local nCol := 7
local nTxtWidth := 0
local nTxtHeight:= 0
DEFAULT lLetLostFocus := .T.
if ValType( cText ) == "B"
cText := Eval( cText )
endif
cText := strtran(cText,"\n", chr(13)+chr(10)) // \n = CRLF cText := ""+CRLF+cText+CRLF+" "
define window oWnd from 0, 0 to 1, 5 ;
style nOr( WS_POPUP, WS_BORDER ) ;
color 0, nRGB(255,255,164) of oObj
define font oFont name GetSysFont() size 0, -8
aPos := {nRow-1, -1}
aPos := ClientToScreen( oObj:hWnd, aPos )
nTxtHeight := max(14, GetTextHeight( oWnd:hWnd )-2)
aText := array( nLenText := mlcount( cText, 254 ) )
aeval( aText, {|c, n| aText[ n ] := trim(memoline( cText, 252, n )), ;
nTxtWidth := max(nTxtWidth, GetTextWidth( 0, aText[ n ], oFont:hFont ) + 7 ) })
if aPos[ 2 ] + nTxtWidth + 3 > GetSysMetrics(0) //0 = SM_CXSCREEN
aPos[ 2 ] = GetSysMetrics( 0 ) - nTxtWidth - 3
endif
oWnd:bRClicked := oWnd:bLClicked := {|a, b, c, Me| Me:End() }
//-----------------------------------------------------------------------------------
// Truco: Boton fuera de la ventana. Cierra la ventana se pulsa enter
//-----------------------------------------------------------------------------------
@ -10, -10 button oClose of oWnd action (if(oTempo # Nil, oTempo:End(),), oWnd:End())
oWnd:Move( aPos[ 1 ], aPos[ 2 ], nTxtWidth, nTxtHeight * nLenText + 3 )
oWnd:Show()
SysRefresh()
if oWnd != Nil
SetBkMode( oWnd:GetDC(), 1 )
SetTextColor( oWnd:hDC, 0 )
hOldFont := SelectObject( oWnd:hDC, oFont:hFont )
aeval( aText, {| c, n | TextOut( oWnd:hDC, n * nTxtHeight - (nTxtHeight-1), 2, aText[ n ] ) })
SelectObject( oWnd:hDC, hOldFont )
oWnd:ReleaseDC()
endif
oWnd:Setfocus()
if lLetLostFocus
oWnd:bLostFocus := {|| oWnd:End() }
else
// Cierra la ventana despues de 2600 milisegundos
define timer oTempo interval 2600 of oWnd action (oWnd:End(), oTempo:End())
oTempo:Activate()
endif
oFont:End()
return( Nil )No ser铆a m谩s sencillo dise帽ar la pantalla directamente, de forma que al lado de cada GET (u otro CONTROL) coloques un peque帽o GRAFICO (o un simple SAY) donde des una peque帽a explicaci贸n de lo que hace/tiene que hacer el GET (o CONTROL)
Si esa explicaci贸n tiene que aparecer al entrar en el GET (o activar el CONTROL) pon los comentarios en HIDE() al iniciar el DIALOGO, despUES los "ense帽as" con SHOW() en el WHEN y los "escondes" HIDE() en el VALID de cada GET/CONTROL.
A falta de que desarrolles el algoritmo pertinente esto te podr铆a servir.
Un saludo
analizando tu idea, termine probando y creo que con msgwait() te ayudaria, prueba ver, muestra el mensaje y no obliga al usuario usar ENTER, espero te ayude, es mas cambie mis mensajes a ese estylo, saludos desde Venezuela...