23 de agosto de 2009

WAIT WINDOWS centrado en _Screen

A veces deseamos que el mensaje mostrado con el comando WAIT WINDOWS esté centrado en la pantalla de VFP. Aquí una función que lo hace con las consideraciones necesarias cuando la pantalla principal de VFP no esta maximizada y respetando todas las cláusulas adicionales del comando WAIT WINDOWS.

Ejemplos:
lcTexto = "Espere un momento ..." + CHR(13) + ;
  "generando el informe del día " + TRANSFORM(DATE()) + CHR(13) + ;
  "NADA CORRE COMO UN ZORRO"

? WaitWindowsCentrado()

? WaitWindowsCentrado(lcTexto,,5)

? WaitWindowsCentrado(lcTexto,"NOWAIT")

*------------------------------------------------------
* FUNCTION WaitWindowsCentrado(tcTexto, tcOpc, tnTimeout)
* - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Muestra la ventana de WAIT WINDOWS centrada
* USO: WaitWindowsCentrado(tcTexto, tcOpc, tnTimeOut)
* EJEMPLO: WaitWindowsCentrado("Espere un momento...", "NOWAIT", 0)
* RETORNA: Caracter
* AUTOR: LMG
*------------------------------------------------------
FUNCTION WaitWindowsCentrado(tcTexto, tcOpc, tnTimeOut)

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

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

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

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

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

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

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

  *-- Cláusula TIMEOUT
  IF NOT EMPTY(tnTimeOut) AND VARTYPE(tnTimeOut) = "N"
    lcCmd = lcCmd + [ TIMEOUT tnTimeOut]
  ENDIF

  *-- Ejecuto el comando
  &lcCmd

  RETURN lcRet
ENDFUNC
Saludos,

Luis María Guayán

12 de agosto de 2009

Corrección Ortográfica en VFP con el Diccionario de MSWord

El siguiente es un código que he adaptado, usando como base un mensaje de Luis María Guayán. Creo haber solucionado algunos problemas. Yo lo estoy usando con éxito. Espero que les sea de utilidad.
PUBLIC oForm
oForm = createobject("claseCorrector")
oForm.show()

DEFINE CLASS claseCorrector AS form
    Autocenter = .T.
    Top = 0
    Left = 0
    Height = 220
    Width = 377
    DoCreate = .T.
    Caption = "Corrector ortográfico de WORD"
    Name = "Form1"

ADD OBJECT edit1 AS editbox WITH ;
    Height = 170, ;
    Left = 10, ;
    TabIndex = 2, ;
    Top = 10, ;
    Width = 358, ;
    ControlSource = "", ;
    Name = "Edit1"

ADD OBJECT command1 AS commandbutton WITH ;
    Top = 185, ;
    Left = 285, ;
    Height = 27, ;
    Width = 84, ;
    Caption = "Ortografía", ;
    TabIndex = 1, ;
    Name = "Command1"

PROCEDURE Init
  LOCAL cString
   cString = "La gran mayoria de programadores Visual FoxPro se recisten a dejar " + ;
             "de programar en este lenguaje porque consideran que es una herramienta " + ;
             "muy poderosa, versátil y robusta que les permite crear aplicaciones " + ;
             "tan poderosas y hasta más estables que las creadas por otros lenguajes. " + ;
             "Incluso programadores que han tenido la oportunidad de desarrollar tanto " + ;
             "en Visual Basic.NET y Visual FoxPro 9.0 coinciden que FoxPro es largamente " + ;
             "superior en cuanto a practicidad y flexibilidad al momento de programar."
   thisform.edit1.Value = cString
ENDPROC

**********************************************************************************
* para incluír en los fuentes de cualquier programa, solo copiar el código       *
* del siguiente procedimiento en el evento "Click" del boton llame al corrector. *
* IMPORTANTE: cambiar el nombre del control que tiene el texto a corregir!       *
**********************************************************************************
PROCEDURE command1.Click
   LOCAL loWord, lnOldMousePointer, loControl
   loControl = Thisform.Edit1    && control que tiene el texto a corregir.
   lnOldMousePointer = loControl.Mousepointer
   loControl.Mousepointer = 11
      WAIT WINDOW NOWAIT "Iniciando la Corrección Ortográfica..."+CHR(13)+;
                         " Espere por favor" TIMEOUT 3
      IF VARTYPE( loWord ) <> 'O'
         loWord = CREATEOBJECT('word.application')
      ENDIF
      IF VARTYPE ( loWord ) = "O"
         loWord.documents.ADD()
         WITH loWord
            .documents(1).content = loControl.VALUE
            .windowstate = 2    && ventana minimizada
            .visible = .T.
            .documents(1).CheckSpelling()  &&Comenzando Corrección Ortográfica...
            .SELECTION.WholeStory
            IF .selection.text <> loControl.VALUE
               loControl.VALUE = .SELECTION.TEXT  
               WAIT WINDOW NOWAIT "Corrección Ortográfica Finalizada..."+CHR(13)+;
                                  " El texto fue reemplazado" TIMEOUT 3             
            ELSE
               WAIT WINDOW NOWAIT "Corrección Ortográfica Finalizada..."+CHR(13)+;
                                  " No se encontraron errores" TIMEOUT 3
            ENDIF
            .documents(1).CLOSE(.F.)
            .QUIT
         ENDWITH
         loWord = .NULL.
         RELEASE loWord
      ELSE
         MESSAGEBOX("Lo siento, no se puedo iniciar Word",48,_SCREEN.CAPTION)
         loControl.Mousepointer = lnOldMousePointer
         RETURN .F.
      ENDIF
   loControl.Mousepointer = lnOldMousePointer
ENDPROC

ENDDEFINE
Jorge Daniel Romero, Río Gallegos, Santa Cruz, Argentina