Sugerencia para mostrar un mensaje

2,580 views
Skip to first unread message

Luis Gerardo

unread,
Apr 25, 2013, 1:51:59 PM4/25/13
to publice...@googlegroups.com
Tengo un form y ejecuto una comando SQLExec, el proceso se lleva de 10 a 15 segundos, quisiera mostrar un mensaje de "Espere por favor".

En otro post Luis Maria, comento que no recomendaba el uso de Gif's animados porque relentizan el proceso, siguiendo su consejo, solo pongo una etiqueta oculta y la muestro antes de lanzar el proceso, pero en tiempo de ejecucion la etiqueta no se muestra cuando la invoco, sino que se muestra hasta que el proceso se ejecuto.

Alguien tiene alguna sugerencia, de donde poner un mensaje de espera.

Mil Gracias

Luis Gerardo

Analyzer

unread,
Apr 25, 2013, 2:00:38 PM4/25/13
to Comunidad de Visual Foxpro en Español
Por ahi recuerdo que el maestro Victor Espina me dijo que..

WAIT "Procesando, por favor espere..." WINDOW NOWAIT

Hace eso.  La clausula NOWAIT le indica a VFP que muestre el mensaje y continue con la ejecucion.  Luego, para quitar la ventana de WAIT haces:

WAIT WINDOW CLEAR

GeoSys Diseño de Software

unread,
Apr 25, 2013, 2:03:16 PM4/25/13
to Comunidad de Visual Foxpro en Español
Thisform.Label1.Caption="Empezando la Actualización"
Thisform.Label1.Visible=.T.
Thisform.Refresh

*- Acciones a realizar.

Thisform.Label1.Visible=.F.



Saludos

Anthony Contreras Peralta

Costa Rica.




Luis Gerardo

unread,
Apr 25, 2013, 2:11:15 PM4/25/13
to publice...@googlegroups.com
No me gusta como se ve la ventanita del Wait, como sugiere Analizer
y lo que propones Anthony es justamente lo que tengo, pero como menciono, como que la ejecucion de comando SQLExec le "gana" en la ejecucion a los otros eventos y no se muestra hasta que el proceso SQLExec termina.

Le puse un
For i=1 to 1000000
EndFor
y solo asi lo muestra, pero no quisiera perder esos valiosos ms (aunque suena a vanidad)

GeoSys Diseño de Software

unread,
Apr 25, 2013, 2:13:05 PM4/25/13
to Comunidad de Visual Foxpro en Español
Es que recuerda refrescar antes de hacer la consulta, para que se muestre antes entiendes???

Ariel D'Alfeo

unread,
Apr 25, 2013, 2:26:13 PM4/25/13
to publice...@googlegroups.com
este procedimiento hace que la ventana wait este centrada. el mensaje de espera se llamaria asi:
msgespera("Espere un momento por favor") y msgespera("") para ocultar el wait
*********************
PROCEDURE msgespera
*********************
LPARAMETERS p_mensaje
IF p_mensaje<>"" AND p_mensaje<>"clear"
    _SCREEN.SCALEMODE = 0
    WAIT WINDOW p_mensaje AT INT(_SCREEN.HEIGHT/2),INT(_SCREEN.WIDTH/2 - LEN(p_mensaje)/2) NOWAIT NOCLEAR
ELSE
    WAIT CLEAR
    _SCREEN.SCALEMODE = 3
ENDIF
ENDPROC
-- 
Ariel D'Alfeo
Córdoba, Argentina

Luis Gerardo

unread,
Apr 25, 2013, 2:40:17 PM4/25/13
to publice...@googlegroups.com
Gracias Ariel finalmente me resigne a mostrar el "wait" pero con este procedimiento que centra el msg hace que se vea menos feo (para mi gusto)
Pero aun asi tuve que dejarle el ciclo For i= 1000000, porque si lo quito no muestra nada, hasta que finaliza el proceso, ¿acaso sera un bug?
Message has been deleted

Víctor Hugo Espínola Domínguez

unread,
Apr 25, 2013, 2:45:48 PM4/25/13
to publicesvfoxpro
Hola Luís Gerardo

Muéstranos el código que estás usando.

Saludos,
Víctor.

Ariel D'Alfeo

unread,
Apr 25, 2013, 3:02:26 PM4/25/13
to publice...@googlegroups.com
deberia mostrarlo, seria:

Msgespera("Espere un momento")
*comienza el proceso
SQLExec.....
.
.
.

*el proceso termino

MSGESPERA("")

no entiendo bien como usas el For i= 1000000

Luis Gerardo

unread,
Apr 25, 2013, 3:16:15 PM4/25/13
to publice...@googlegroups.com
*!* Este es el Metodo Click del boton que ejecuta este Procedimiento Almacenado en una Base de Datos Firebird *!*

Set Procedure To .\Codigo\Utility.prg
=MsgEspera('Recalculando datos de captura, espere por favor...')

*!* SI QUITO ESTE FOR, NO SE MUESTRA NADA *!*

For i=1 to 1000000
EndFor

lcSQL_Text =     "EXECUTE PROCEDURE ACTUALIZAR_MIEMBROS(?Thisform.nId_Programa)"
If SQLExec(Thisform.nConHandle,lcSQL_Text) > 0
    Thisform.ActualizarDatos()
    =MsgEspera('')
    MessageBox('Datos actualizados correctamente.',MB_ICONINFORMATION + MB_OK,'Proceso concluido')
EndIf

Ariel D'Alfeo

unread,
Apr 25, 2013, 3:24:23 PM4/25/13
to publice...@googlegroups.com
y si pones asi tampoco?


MsgEspera('Recalculando datos de captura, espere por favor...')

Set Procedure To .\Codigo\Utility.prg
lcSQL_Text =     "EXECUTE PROCEDURE ACTUALIZAR_MIEMBROS(?Thisform.nId_Programa)"
If SQLExec(Thisform.nConHandle,lcSQL_Text) > 0
    Thisform.ActualizarDatos()
    MessageBox('Datos actualizados correctamente.',MB_ICONINFORMATION + MB_OK,'Proceso concluido')
EndIf

MsgEspera('')

-- 
Ariel D'Alfeo
Córdoba, Argentina

Víctor Hugo Espínola Domínguez

unread,
Apr 25, 2013, 3:24:46 PM4/25/13
to publicesvfoxpro
Hola Luís Gerardo

Lo que sucede es que el procedimiento almacenado "ACTUALIZAR_MIEMBROS" termina tan rápidamente que no te deja ver el mensaje.

Saludos,
Víctor.
 

Luis Maria Guayan

unread,
Apr 25, 2013, 3:33:07 PM4/25/13
to publice...@googlegroups.com
Si no muestra nada, es que el proceso es rápido. ¿Por que fuerzas a que tu proceso  tarde mas con un FOR ln = 1 TO 10000000000000000000?

Yo utilizo una clase derivada de Pageframe y la muestro antes de iniciar un proceso y la oculto al terminar. El código de la clase es el sig:

**************************************************
*-- Class:        _espera (x:\_class\gral\gral.vcx)
*-- ParentClass:  pageframe
*-- BaseClass:    pageframe
*-- Time Stamp:   02/19/10 03:38:01 PM
*
DEFINE CLASS _espera AS pageframe
    ErasePage = .T.
    PageCount = 1
    BorderWidth = 1
    Width = 300
    Height = 100
    Tabs = .F.
    Visible = .F.
    Themes = .T.
    Name = "_espera"
    Page1.Caption = "Page1"
    Page1.BackStyle = 1
    Page1.BackColor = RGB(200,222,255)
    Page1.Name = "Page1"

    ADD OBJECT _espera.page1.label1 AS label WITH ;
        AutoSize = .T., ;
        FontBold = .T., ;
        FontName = "Trebuchet MS", ;
        FontSize = 12, ;
        BackStyle = 0, ;
        Caption = "Espere un momento por favor ...", ;
        Height = 24, ;
        Left = 22, ;
        Top = 36, ;
        Width = 251, ;
        Style = 3, ;
        Name = "Label1"

    PROCEDURE visible_assign
        LPARAMETERS vNewVal
        THIS.ZORDER(0)
        IF m.vNewVal
          THIS.TOP = (THISFORM.HEIGHT - THIS.HEIGHT) / 2
          THIS.LEFT = (THISFORM.WIDTH - THIS.WIDTH ) / 2
        ELSE
          THIS.TOP = THISFORM.HEIGHT
          THIS.LEFT = THISFORM.WIDTH
        ENDIF
        THIS.VISIBLE = m.vNewVal
    ENDPROC

    PROCEDURE Init
        THIS.TOP = THISFORM.HEIGHT
        THIS.LEFT = THISFORM.WIDTH
    ENDPROC

ENDDEFINE
*
*-- EndDefine: _espera
**************************************************

Lo tengo en una librería de clases visuales y tiro el objeto _espera en el formulario y lo utilizo de la sig. manera

ThisForm._espera.Visible = .T.
*...
*Proceso
*...
ThisForm._espera.Visible = .F.



También a veces utilizo una función de  Wait Windows centrado que lo tengo en mi librería de procedimientos:

*------------------------------------------------------
* FUNCTION WaitWindowsCentrado(tcTexto, tcOpc, tnTimeout)
* - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Muestra la ventana de WAIT WINDOWS centrada
* PARAMETROS:
*   tcTexto   = Texto a mostrar. Puede contener saltos de línea CHR(13)
*   tcOpc     = Opciones NOCLEAR y NOWAIT del WAIT WINDOWS nativo
*   tnTimeOut = Segundos de espera para terminar el WAIT
* USO: WaitWindowsCentrado(tcTexto, tcOpc, tnTimeOut)
* EJEMPLO: WaitWindowsCentrado("Espere un momento...", "NOWAIT", 0)
* RETORNA: Caracter
* AUTOR: LMG - 20090824
*------------------------------------------------------
 FUNCTION WaitWindowsCentrado(tcTexto, tcOpc, tnTimeOut)

  LOCAL lnMaxLen, lnNroLin, lnRelFil, lnRelCol, ;
    lnRows_VFP, lnFil, lnCol, lcRet, lcCmd, ln, la(1)

  *-- Texto del mensaje
  IF EMPTY(m.tcTexto)
    m.tcTexto = "Presione una tecla para continuar..."
  ENDIF

  *-- Linea mas larga de tcTexto (si es multilinea)
  m.lnMaxLen = 0
  m.lnNroLin = ALINES(la, m.tcTexto)
  FOR m.ln = 1 TO m.lnNroLin
    m.lnMaxLen = MAX(m.lnMaxLen,LEN(m.la(m.ln)))
  ENDFOR

  *-- Filas de ventana completa _VFP, distinto a WROWS(_SCREEN.NAME)
  m.lnRows_VFP = _VFP.HEIGHT / FONTMETRIC(1,_SCREEN.FONTNAME,_SCREEN.FONTSIZE)

  *-- Relación entre el tamaño de las
  *-- fuentes de WAIT WINDOWS y _SCREEN
  m.lnRelFil = FONTMETRIC(1,'Arial',9) / FONTMETRIC(1,_SCREEN.FONTNAME,_SCREEN.FONTSIZE)
  m.lnRelCol = FONTMETRIC(6,'Arial',9) / FONTMETRIC(6,_SCREEN.FONTNAME,_SCREEN.FONTSIZE)
  m.lnFil = WLROW(_SCREEN.NAME) + (m.lnRows_VFP - m.lnNroLin * m.lnRelFil) / 2
  m.lnCol = WLCOL(_SCREEN.NAME) + (WCOLS(_SCREEN.NAME) - m.lnMaxLen * m.lnRelCol) / 2

  *-- Comando
  m.lcCmd = [WAIT WINDOWS tcTexto TO lcRet AT lnFil,lnCol]

  *-- Clausulas NOWAIT y NOCLEAR
  IF NOT EMPTY(m.tcOpc) AND VARTYPE(m.tcOpc) = "C"
    IF "NOWA" $ UPPER(m.tcOpc)
      m.lcCmd = m.lcCmd + [ NOWAIT]
    ENDIF
    IF "NOCL" $ UPPER(m.tcOpc)
      m.lcCmd = m.lcCmd + [ NOCLEAR]
    ENDIF
  ENDIF

  *-- Clausula TIMEOUT
  IF NOT EMPTY(m.tnTimeOut) AND VARTYPE(m.tnTimeOut) = "N"
    m.lcCmd = m.lcCmd + [ TIMEOUT tnTimeOut]
  ENDIF

  *-- Ejecuto el comando
  &lcCmd
  RETURN m.lcRet
ENDFUNC

*------------------------------------------------------

Para usarlo hago:

WaitWindowsCentrado("Espere un momento ..." + CHR(13) + "Generando el gráfico ...", "NOWAIT")
*...
* Proceso
*...
WAIT CLEAR



Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 25/04/2013 15:40, Luis Gerardo escribió:

Luis Gerardo

unread,
Apr 25, 2013, 3:50:57 PM4/25/13
to publice...@googlegroups.com
Mi estimado Luis Maria, siento decirte que no, el proceso si lo ejecuto directamente en el server, se lleva unos +/-10 segundos aprox cuando lo corro con fox aumenta unos 2 o 3 segundos mas, como dije en otro mensaje, pareciera que VFP cuando ejecuta estas dos lineas:


lcSQL_Text =     "EXECUTE PROCEDURE ACTUALIZAR_MIEMBROS(?Thisform.nId_Programa)"
If SQLExec(Thisform.nConHandle,lcSQL_Text) > 0

Lo que esta anteriormente escrito no se ejecuta.

Set Procedure To .\Codigo\Utility.prg
=WaitMsg('Recalculando datos de captura, espere por favor...')

mpulla

unread,
Apr 25, 2013, 5:54:16 PM4/25/13
to publice...@googlegroups.com
Hola Luis Gerardo.

Tal vez se pueda optimizar el SP?
A lo mejor si explicas y expones el SP te podamos colaborar.

Que DB usas?

Saludos.
Mauricio

ZeRoberto

unread,
Apr 25, 2013, 9:43:11 PM4/25/13
to publicesvfoxpro
De nada va servir una barra de progreso o un timer, porque al parecer cuando el VFP hace un proceso paraliza todo, es como cuando un Lee se le bloquean las piernas y los brazos.
Reply all
Reply to author
Forward
0 new messages