Ayuda con modulo oculto

Ayuda con modulo oculto

Postby carlos vargas » Mon May 05, 2008 2:27 pm

Estimados

Necesito de su inestimable ayuda, con el siguiente problema:

el cliente me ha pedido un modulo qu eno aparesca en la estructura del menu, y que sea accesible desde un tecla de funcion.

ya he realizado esto, pero sucede que este donde este cada vez que presiono esta tecla, el modulo se carga, hay un a forma de saltar esto, ose que solo desde el menu funcione la tecla que carga el modulo.


salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Postby karinha » Mon May 05, 2008 3:59 pm

Con el SETKEY() no funciona??
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7860
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby Manuel Aranda » Mon May 05, 2008 4:21 pm

Se me ocurre que en el resto de módulos desactives esa tecla, por ejemplo:

SetKey(VK_F9, {|nKey| NIL })

Saludos,
Manuel
User avatar
Manuel Aranda
 
Posts: 604
Joined: Wed Oct 19, 2005 8:20 pm
Location: España

Re: Ayuda con modulo oculto

Postby Vikthor » Mon May 05, 2008 5:28 pm

carlos vargas wrote:Estimados

Necesito de su inestimable ayuda, con el siguiente problema:

el cliente me ha pedido un modulo qu eno aparesca en la estructura del menu, y que sea accesible desde un tecla de funcion.

ya he realizado esto, pero sucede que este donde este cada vez que presiono esta tecla, el modulo se carga, hay un a forma de saltar esto, ose que solo desde el menu funcione la tecla que carga el modulo.


salu2
carlos vargas


Mi buen Carlos :

Prueba haciendo lo siguiente :

Asigna una combinación de teclas a la ventana principal.
Y usando el evento BKeyDown , puedes ejecutar tu acción.

Algo parecido a esto:

Code: Select all  Expand view  RUN

      ::oWnd:bKeyDown := {|k,f| ::KeyDown( k, f )}

   ACTIVATE WINDOW ::oWnd MAXIMIZED
RETURN( Nil )

METHOD KeyDown( nKey, nFlags ) CLASS TVikthor
   IF nKey == VK_HOME .AND. GetKeyState( VK_SHIFT ) .AND. GetKeyState( VK_CONTROL )
      // aquí ejecutas lo que quieras
   Endif
RETURN 0


[/b]
Vikthor
User avatar
Vikthor
 
Posts: 271
Joined: Fri Oct 07, 2005 5:20 am
Location: México

Postby carlos vargas » Mon May 05, 2008 6:54 pm

la carga del modulo esta resuelta, con un set key ..
el problema es que desde cualquier parte funciona esa tecla y llama al modulo, lo que deseo es que solo desde el modulo de Menu funciones.

ejemplo estoy en el modulo de facturacion y presiono f10 y juan me carga el modulo oculto, esto no lo quiero.

he tomado en consideracion desactivar esa tecla en cada modulo que entre :-( pero si hay otra forma mas accesible mejor.


salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Postby karinha » Mon May 05, 2008 7:09 pm

Carlos, asi:

Code: Select all  Expand view  RUN
STATIC lAtivo := .F.


FUNCTION FILTRARM( DbClientes, oLbx, nOpcaoRadio )

    FIELD DEST_NOME
    FIELD RAZ_MATRIC

    LOCAL nRecNo
    LOCAL cCodigo
    LOCAL oDlg
    LOCAL oFont
    LOCAL nOrden   := 2
    LOCAL nCliente := 0
    LOCAL cNombre  := SPACE(30)

    // Para Que la Tecla F2 No Se Accione + de 1 viez
    If lAtivo // Se F2
        Return Nil  // Deshabilita  Tecla de Funcion...
    Endif

    SET SOFTSEEK ON

    If Eof()
        MsgStop( "Bancos de Dados Bloqueado," + CRLF +;
                 "Acesso Negado!!", "Cuidado!" )
        Return Nil
    Endif

    DbSetOrder( 1 )  //-> Por Matricula

    lAtivo := .T.  // Aqui F2

    IF MsgGet( "Buscar Por:", IF( nOrden=2, "Matricula", "Nome " ) +  ;
                                            " do Cliente",            ;
                              IF( nOrden=1, @nCliente, @cNombre ),    ;
               "Lupa.Bmp" )

        cNombre=RTRIM( Upper( cNombre ) )
        LOCATE FOR cNombre $ ALLTRIM(Raz_Matric)

        IF EOF()

            SndPlaySound(".\Erro.wav" )
            nMsgBox( "Não Encontrei Este Cliente", OemToAnsi( "Aten‡Æo" ) )

            DbSetOrder( 2 )
            Go Top

        ELSE

            nRecNo    := (DbClientes:cAlias)->( RecNo() )
            DbClientes:GoTo( nRecNo )

            oLbx:Refresh()
            oLbx:SetFocus()

            SndPlaySound( "Pronto.Wav" )

        ENDIF

    ENDIF

    lAtivo := .F.  // Aqui F2

    IF nOpcaoRadio == 2
        DbSelectArea( ( DbClientes:cAlias ) )
        DbClientes:SetOrder( 1 )
    ELSEIF nOpcaoRadio == 1
        DbSelectArea( ( DbClientes:cAlias ) )
        DbClientes:SetOrder( 2 )
    ENDIF

RETURN NIL


Saludos, desde Brasil y muchas gracias por todo.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7860
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Postby mmercado » Mon May 05, 2008 10:11 pm

carlos vargas wrote:he tomado en consideracion desactivar esa tecla en cada modulo que entre :-( pero si hay otra forma mas accesible mejor.
A ver, y si lo haces a través de los bloques bGotFocus y bLostFocus de tu ventana principal (donde SÍ quieres que se cargue), algo como lo siguiente:
Code: Select all  Expand view  RUN
oWnd:bGotFocus := {||SetKey( VK_F10, MiFuncion()}
oWnd:bLostFocus := {||SetKey( VK_F10, Nil}

Así no tendrías que hacer nada en otros módulos.

Saludos.

Manuel Mercado
User avatar
mmercado
 
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Postby mmercado » Mon May 05, 2008 10:14 pm

Me faltó cerrar los paréntesis, sorry :oops:
User avatar
mmercado
 
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Postby Antonio Linares » Tue May 06, 2008 5:53 am

Carlos,

Con ProcName( n ) puedes comprobar desde donde está siendo llamado y sólo actuar dependiendo de en donde esté el usuario
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42160
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby carlos vargas » Tue May 06, 2008 3:09 pm

A todos muchas gracias por sus comentarios y codigos. :-)

como comentaron anteriormente, integre una variable bandera para saber si estoy el modulo y no cargarlo nuevamente.

la idea de eliminar el set key en cada modulo y activarlo nuevamente es la que esta ganando, pero implica modificar cada modulo. :-(

El uso de procname(n), me parecio la mejor idea, pero en la prueba no me funciono. siempre acceso al modulo, la idea como indica Antonio Linares
es verificar de donde se genero el llamado y si no es del procedimiento
MAIN_MENU sale del modulo oculto y no continua su ejecucion.


lo hacia de este modo

Code: Select all  Expand view  RUN
static lEnModOcu

procedure main_menu()
  ...
  lEnModOcu:=.f.
  set key vk_f10 to mod_oculto()
  ...
  define dialog oMenu ...
  ...
  activate dialog oMenu ...
  ...
  set key vk_f10 to
  ...
return

procedure mod_oculto()
  ...
  ?procname(0),procname(1),procname(2)
  ...
  if "MAIN_MENU" $ procname(1)
    return
  else
    lEnModOcu := .t.
  endif
  ...
  define dialog oDlgOculto ...
  ...
  activate dialog oDlgOculto
  ...
return


Nota:

Umm, no habia percatado la idea de el bloques de codigo (bKeyDown, y bGotFocus ) de las propias ventanas o dialogos, de Vikthor y Manuel. es que ando mareado... voy a implementar una prueba... les comento en breve.... :-) me parece ver una luz al final de tunel :-o
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Postby Antonio Linares » Tue May 06, 2008 6:17 pm

Carlos,

En vez de usar ProcName( 1 ), tendrías que usar un bucle hasta que ProcName() devuelva vacio, así te servirá desde distintos lugares:
Code: Select all  Expand view  RUN
n := 0

while ! Empty( ProcName( n ) )
   if "MAIN_MENU" $ ProcName( n )
      return
   endif
   n++
end
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42160
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby carlos vargas » Wed May 07, 2008 11:45 pm

Conclusion
=======

Estimados despues de torcerme la nuca varias veces, con este asunto, la solucion llego y claro esta vino de la mano de uno de ustedes. :-)

debo reconocer que muchas veces uno se complica las cosas, y que luego de 10 año con fw aun mato pulgas a cañonazo.

luego de intentar con procname (al inicio pensaba que con esto lo solucionaba), luego de intentar los bGotFocus, y bLostFocus (estos funcionaron bien, con cambios, ya que implemente una bandera en ellos, una mezcla de la idea de manuel y kharina), la que funciono sin problemas fue la de viktor.
:-)

pego el codigo, para que noten que me estaba complicando la cosa, ya que el escenario era una ventana principal, esta no tenia una barra de menu como normalmente tiene nuestras aplicaciones, sino que tenia un dialogo al centro con unos botones, este dialogo tenia la clausula nowait y era esto lo que complicaba la cosa segun yo.

en este codigo he implementado dos teclas: f9 y f10 para llamar al modulo
oculto, para probar las dos implementaciones que funcionaron.

pero obviamente la idea del bKeyDown es la ganadora por excelencias. :-)

agradesco a todos por su gratuita y valiosa ayuda

Code: Select all  Expand view  RUN
...
FUNCTION Main()
   LOCAL oFont
   LOCAL oBrush1

   /*procedimiento inicial pra configuracion de entorno*/
   IF ! Main_Inicio()
      RETURN
   ENDIF

   /*color del get con foco*/
   SetGetColorFocus( CLR_SOFTYELLOW )

   /*valida acceso*/
   IF ! AccesoOk()
      Main_Final()
      RETURN
   ENDIF
   
   /*inicializa bandera*/
   lEnMenu := TRUE

   /*inicializa hotkey*/
   SET KEY VK_F10 TO ventas2()

   /*define brush*/
   DEFINE BRUSH oBrush1 NAME "FONDO1"
   DEFINE FONT  oFont  NAME GetDefaultFontName() SIZE 0, GetDefaultFontHeight()

   /*ventana principal*/
   DEFINE WINDOW oApp ;
      FROM 1, 1 TO 600, 800 ;
      TITLE  "Sistema de Control de Inventario v1.02 - Importaciones Hernandez" ;
      ICON   GetIcon() ;
      BRUSH  oBrush1

      /*barra de mensajes*/
      DEFINE MSGBAR oMsgBar OF oApp PROMPT "KDSoft(c), Managua 2008"
      DEFINE MSGITEM oItem1 OF oMsgBar PROMPT cStrTasa()               SIZE 100 COLOR CLR_YELLOW, CLR_BLACK ACTION Tasa()
      DEFINE MSGITEM oItem2 OF oMsgBar PROMPT "Usuario:" + cGUserName  SIZE 150 COLOR CLR_HGREEN, CLR_BLACK
      DEFINE MSGITEM oItem3 OF oMsgBar PROMPT "Tipo:"    + cGUserType  SIZE 100 COLOR CLR_HCYAN,  CLR_BLACK
      oMsgBar:KeybOn()

      /*iniciliza codeblock para el inicio, foco, y desfoco de la ventana principal*/
      oApp:bInit      := {|| oApp:SetFont( oFont ), Main_Menu() }
      oApp:bGotFocus  := {|| lEnMenu := TRUE  }
      oApp:bLostFocus := {|| lEnMenu := FALSE }
      oApp:bKeyDown   := {|nKey| iif(nKey=VK_F9, ventas2(), NIL ) } //Winner!!!!

   /*activa ventana*/
   ACTIVATE WINDOW oApp MAXIMIZED VALID MsgNoYes( "Desea salir del sistema?", "KDSoft" )

   /*desactiva hotkey*/
   SET KEY VK_F10 TO

   /*cierra tablas*/
   Main_Final()

RETURN nil

PROCEDURE Main_Menu()
   LOCAL oDlgMenu, oBrush2, oSay
   LOCAL oB1, oB2, oB3, oB4, oB5, oB6, oB7, oB8   

   /*brush del menu*/
   DEFINE BRUSH oBrush2 NAME "FONDO2"

   /*define dialogo de menu*/
   DEFINE DIALOG oDlgMenu NAME "DLG_MENU" OF oApp ICON GetIcon() BRUSH oBrush2

   /*copyright*/
   REDEFINE SAY oSay;
   ID 401 OF oDlgMenu;
   COLORS CLR_RED

   /*logo*/
   REDEFINE BITMAP;
   ID 501 OF oDlgMenu;
   NAME "MENU"

   /*opciones*/
   REDEFINE BUTTON oB1 ;
   ID 101 OF oDlgMenu ;
   PROMPT "Catalogo de Clientes" ;
   ACTION Clientes()

   REDEFINE BUTTON oB2 ;
   ID 102 OF oDlgMenu ;
   PROMPT "Catalogo de Productos" ;
   ACTION Productos()

   REDEFINE BUTTON oB3 ;
   ID 103 OF oDlgMenu ;
   PROMPT "Ingreso de Productos a Bodega" ;
   ACTION Entradas()

   REDEFINE BUTTON oB4 ;
   ID 104 OF oDlgMenu ;
   PROMPT "Registro de Venta Normal de Productos" ;
   ACTION Ventas()

   REDEFINE BUTTON oB5 ;
   ID 105 OF oDlgMenu ;
   PROMPT "Apertura/Cierre de Caja" ;
   ACTION caja()

   REDEFINE BUTTON oB6 ;
   ID 106 OF oDlgMenu ;
   PROMPT "Tablas de Soporte" ;
   ACTION Menu_PopUpTablas( oB6 )

   REDEFINE BUTTON oB7 ;
   ID 107 OF oDlgMenu ;
   PROMPT "Utilidades" ;
   ACTION Menu_PopUpUtilidades( oB7 )

   REDEFINE BUTTON oB8 ;
   ID 108 OF oDlgMenu ;
   PROMPT "Acerca de ..." ;
   ACTION AcercaDe()

   /*salida*/
   REDEFINE BUTTON ;
   ID 201 OF oDlgMenu ;
   ACTION oApp:END()

   oSay:lTransParent := TRUE

   /*activa dialogo de menu*/
   ACTIVATE DIALOG oDlgMenu CENTER NOWAIT

   /*elimina brush*/
   oBrush2:END()

   /*correcion por que este dialogo es nowait*/
   lEnMenu:=TRUE
   
RETURN




Code: Select all  Expand view  RUN
...
PROCEDURE Ventas2()
   LOCAL oCol   
   PRIVATE oDlg, oBrw   
   
   IF !lEnMenu
      RETURN
   ENDIF     
   
   /*Filtrar solo movimientos de salida*/
   TIPO->( OrdSetFocus( "CODIGO" ), cmFilter( "TIPO->TIPO='-'" ) )
   CLIE->( OrdSetFocus( "CODIGO" ) )
   VEND->( OrdSetFocus( "CODIGO" ) )
   PROD->( OrdSetFocus( "CODIGO" ) )
   DETS->( OrdSetFocus( "NUMERO" ) )
   SALI->( OrdSetFocus( "NUMERO" ), cmFilter( "SALI->TIPO='VL'" ) )
   DBSELECT "SALI"
   SET RELATION TO TIPO INTO TIPO, CODCLIE INTO CLIE, CODVEND INTO VEND

Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Postby carlos vargas » Wed May 07, 2008 11:49 pm

se me pas, la idea de manuel era funcional tambie, con la diferencia que requira mas trabajo.

ja, ja, ja,....

si me llevo dias la solucion

lo dicho, me complique de gratis
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 36 guests