Page 1 of 1

bAction en el Boton ? de la barra Titulo (SOLUCIONADO)

PostPosted: Tue Sep 17, 2013 4:04 am
by cuatecatl82
Saludos Maestro antonio y colegas del Foro:

De nuevo con otra pregunta, estuve revisando este post:

http://forums.fivetechsupport.com/viewtopic.php?f=3&t=13225&hilit=bHelpIcon&start=15

Necesito poner un modulo de Ayuda dentro del programa pero necesito hacerlo de forma unica incluida con el programa principal, en el post anterior indica como hacer 2 modificaciones a la clase TDialog para usar un codeblock para llamar a una función desde el boton de ayuda de la barra de titulo del dialogo, la cual trabaja como necesito, pero tiene unos inconvenientes que me gustaria corregir.

Si establesco oDlg:lHepIcon:= .F. no pasa nada, y trabaja todo bien.

Pero....
si defino en el dialogo oDlg:lHepIcon:= .T. Aparece el boton " ? ", puedo llamar a la funcion de Ayuda pero el cursor que el dialogo y los say tienen establecidos desaparecen, además de que al cerrar la ventana de mi función de Ayuda queda modificado el cursor por otro que tiene el simbolo de "?" y no se donde modificar para que no lo muestre, y para recuperar el cursor que tengo definido tengo que hacer click forzosamente en el dialogo supongo que es donde se queda en espera de saber a que control buscara su ID para mostrar su Topic de Ayuda.

Image


Como poder corregir estos detalles, dejo un archivo autocontenido para que vean de que se trata:
http://www.mediafire.com/?wvwer7e4syaqq1i

En espera de Posibles soluciones.. :x :lol: :lol: :oops: :oops:

Re: bAction en el Boton ? de la barra Titulo

PostPosted: Tue Sep 17, 2013 2:20 pm
by cuatecatl82
+1

Alguien ha probado el ejemplo que puse..?

Alguna sugerencia..?

Gracias.

Re: bAction en el Boton ? de la barra Titulo

PostPosted: Wed Sep 18, 2013 2:36 am
by cuatecatl82
Solucionado señores:

Después de revisar y probar con detenimiento los metodos de la Clase TDialog pude solucionar los detalles que tenia pendiente, aqui como quedo:

Code: Select all  Expand view
# Include "FiveWin.ch"
# Include "xHbCls.ch"

# Define GWL_EXSTYLE           -20
# Define WS_EX_CONTEXTHELP    1024
# Define SC_CLOSE            61536
# Define SC_HELP             61824


FUNCTION Main()

LOCAL oDlg, oBmp, oBtn, oSay
LOCAL cText:= "El Cursor del Mouse FLECHA VERDE para el Dialogo y el Say se muestra correcto"

  EXTEND CLASS  TDialog       WITH DATA bHelpIcon
OVERRIDE METHOD SysCommand    IN CLASS TDialog WITH MiSysComnd

     DEFINE CURSOR    oCur           RESOURCE "OPCION"
     DEFINE CURSOR    oSel           RESOURCE "MANO"
     DEFINE ICON      oIco           RESOURCE "01"
     DEFINE DIALOG    oDlg           RESOURCE "MENSAJE"  TITLE "Bug en Help de TDialog" ICON oIco
   REDEFINE IMAGE     oBmp  ID 100   RESOURCE "02"       OF oDlg TRANSPARENT ADJUST
   REDEFINE SAY       oSay  ID 101   PROMPT    cText
   REDEFINE BUTTONBMP oBtn  TEXTRIGHT BITMAP   "ACEPTAR"   ACTION (oDlg:END()) ID 102 OF oDlg
   
   oDlg:lHelpIcon:= .F.
   oDlg:bHelpIcon:= {|| MSGInfo("Se ha llamado a la Ayuda","En Costrucción") }
   oDlg:oCursor:= oCur
   oSay:oCursor:= oCur
   oBmp:oCursor:= oCur
   oBtn:oCursor:= oSel
   
   ACTIVATE DIALOG    oDlg  CENTERED ON INIT(SetWindowLong( oDlg:hWnd, GWL_EXSTYLE,;
                                                            nOr( GetWindowLong( oDlg:hWnd, GWL_EXSTYLE ), WS_EX_CONTEXTHELP ) ))


RETURN Nil


//-----------------------------------------------------------------------------------------------------------------//
STATIC FUNCTION MiSysComnd(nWParam, nLParam)

LOCAL Self:= qSelf()

IF nWParam == SC_CLOSE .AND. ::lModal
      IF GetCapture() != 0
         ReleaseCapture()
      ENDIF  
      RETURN .F.
ENDIF

IF nWParam == SC_HELP
      IF VALTYPE( ::bHelpIcon ) == "B"
         EVAL( ::bHelpIcon, Self )
      ENDIF
      RETURN .T.
ENDIF

   
RETURN Nil


//-----------------------------------------------------------------------------------------------------------------//
FUNCTION HelpIndex()
//Para Deshabilitar la llamada de ayuda desde Help32.prg del Api de Windows con la tecla F1
RETURN Nil
 



La idea es de mantener mis proyectos lo más independiente posible sin agregar los fuentes de las Clases de Fivewin modificados para no depender de futuras versiones y mejoras haciendo uso de OVERRIDE Y EXTEND para modificar los metodos de las Clases desde dentro de mis fuentes:

Observaciones:

Al establecer oDlg:lHelpIcon:= .T. Se muestra el boton "?" nativo de TDialog, pero desactiva el Cursor definido para los Say y el Dialogo, para quitar este defecto lo desactivo oDlg:lHelpIcon:= .F. para mostrar el boton de forma independiente lo invoco desde On Init().

Al hacer click en el boton se activa la ayuda del API, para desactivarlo añadimos la función HelpIndex() retornando "Nil" ya que aqui es donde aparece el aviso de que no se encuentra la ayuda desde SetHelpFile(),

Aqui es donde aplica añadir el metodo bHelpIcon, lo hago desde mi archivo fuente con EXTEND CLASS y ahora modificamos la Clase SysCommand que es llamada para mostrar la ayuda, pero invocaremos a nuestra función que estará modifcada con OVERRIDE METHOD

MiSysComnd Tiene 2 partes: la primera es para hacer click en el boton "X" o Cerrar, la segunda es para el boton "?", si bHelpIcon es un codeblock se evalua y ejecuta la ayuda, al terminar estaba ::lHelpIcon = .t. "Esto hacia que el cursor cambiara a una flecha con un simbolo de ayuda", al quitarlo el cursor ya no aparece, pero se queda el click del mouse capturado obligando a hacer un click dentro del dialogo para activar cualquier control, esto se resuelve cambiando RETURN .F. por RETURN .T. y vuala... Enigma resuelto.

Ahora si con estas pequeñas modificaciones ya se puede invocar de forma correcta a una función de ayuda independiente a los archivos .HLP y .CHM.

Espero les sirva y perdón por tanto cuento, pero creo que vale la pena explicar un poquito la logica del funcionamiento..

Saludos. :wink: :wink: :wink: :D :D