8 de abril de 2014

Ubicacion de la carpeta System32, Font, y Programs File

Este codigo permite saber la ubicacion fisica de las carpetas System32, Font, y Programs File.

**** LLevado De VISUAL Basic a lenguaje FOXPRO por In_21
#DEFINE CSIDL_FONTS 20 && Carpeta de Fuentes
#DEFINE CSIDL_PROGRAM_FILES 0x0026 && Carpeta de Programas
#DEFINE CSIDL_SYSTEM 37&& Carpeta de Sistema, System32
* La Api
DECLARE INTEGER SHGetSpecialFolderPath IN shell32.DLL ;
   LONG HWND , STRING @sPath ,LONG Folder
#DEFINE MAX_PATH 255 && Maximo de caracteres del Buffer

LOCAL strLocation,La_Ruta
* Inicializacion
strLocation = ""
La_Ruta = ""
* Aqui determinas cual de las carpetas quieres buscar, 
*   en este caso buscamos la carpeta para programas
lngCSIDL = CSIDL_PROGRAM_FILES 
* Rellenamos la variable con el maximo de espacios (255)
strLocation = SPACE(MAX_PATH) 
* Llamada a la API de Windows, pasando la varibale strLocation por valor
La_Ruta = ObtenerCarpetaEspecial(@strLocation, lngCSIDL) 

* A pantalla para saber la ruta
MESSAGEBOX(La_Ruta) 

FUNCTION ObtenerCarpetaEspecial()
  PARAMETERS strParamLocation, lngParamCSIDL
  LOCAL La_Carpeta
  =SHGetSpecialFolderPath(0, @strParamLocation, lngParamCSIDL)
  *  Quitarle el caracter de Nulo al final
  La_Carpeta = SUBSTR(RTRIM(strParamLocation),1,LEN(RTRIM(strParamLocation))-1)
  RETURN La_Carpeta
ENDFUNC

28 de febrero de 2014

NotePad++ (NotePad plus) y Visual FoxPro

"VISUAL FOXPRO" EN NOTEPAD++

NotePad++ permite que el usuario defina las características de coloreado y envoltura para un lenguaje no definido de forma nativa, en este articulo proporciono una configuración "sugerida" para el leguaje de "Visual FoxPro".

Notepad++ es un editor de texto GPL con soporte para varios lenguajes de programación que incluye opciones avanzadas para desarrolladores.

Este editor incluye características como coloreado y envoltura de sintaxis, pestañas, resaltado de paréntesis e indentación, grabación y reproducción de macros y soporte de extensiones.

Entre los lenguajes de programación que soporta están Ada, ASP, ASM Ensamblador (x86), ASM Ensamblador (Z80), AutoIt, Batch, C, C#, C++, Caml, CMake, COBOL, CSS, D, Diff, Flash ActionScript, Fortran, Gui4Cli, Haskell, HTML, INNO, Java, JavaScript, JSP, KiXtart, Lisp, Lua, Makefile, MATLAB, MS INI (archivo), NSIS, Objective-C, Pascal, Perl, PHP, PostScript, PowerShell, Properties, Python, R, RC (fichero de recurso), Ruby, Shell, Scheme, Smalltalk , SQL, Tcl, TeX, VB, VHDL, Verilog, XML, YAML.

Lamentablemente de forma nativa no incluye "Visual FoxPro", sin embargo se puede personalizar de tal forma que soporte el lenguaje, a continuación se explica como hacerlo.

INSTALE NOTEPAD++

Ingrese a la pagina del creador http://notepad-plus-plus.org, descargue e instale la ultima versión.

"VISUAL FOXPRO" EN NOTEPAD++

NotePad++ permite que el usuario defina las características de coloreado y envoltura para un lenguaje no definido de forma nativa, en este articulo proporciono una configuración "sugerida" para el leguaje de "Visual FoxPro".

Descargue los archivos

Definicion de Visual FoxPro (UDL)
Opcionales
Funciones/Procedimientos en programa (functionList.xml)
NotePad como editor oredeterminado de programas VFP (defaultnotpadeditvfpprg.reg)
Definir el lenguaje
  1. Ingrese a "NotePadd++"
  2. En el menú principal ingrese a "Lenguaje -> Definir idioma"
  3. En la ventana que desplegada presione el botón "Importar.." y seleccione el archivo "userDefineLang-VisualFoxPro-Jgoh.xml" en la ubicación en donde se descargo
Con estos pasos ya se definió el lenguaje y cada uno de sus atributos. Cierre NotePad++ para asegurar que tome el nuevo lenguaje.

Lista de funciones

NotePad tiene la opción "Lista de funciones" (En el menú principal ingrese a "Vista -> Lista de funciones") la cual es útil cuando se abre un programa que contiene definiciones de Funciones o Procedimientos. Sin embargo como NotePad++ de forma nativa no tiene soporte para VFP es necesario agregar la configuración para dicha característica
  1. Ingrese al directorio %APPDATA%\notepad++\
  2. Edite el archivo functionList.xml con NotePad++
  3. En la sección <associationMap> adicione la siguiente linea al final:
    <association userDefinedLangName="Visual FoxPro" id="vfp_syntax"/>
  4. En la sección <parsers> adicione al final:
  5.    <parser id="vfp_syntax" displayName="VFP Classes & Functions" commentExpr="(t*!*)">
        <classRange
         mainExpr="^[t ]*((define class)[s]+)[w:]+[s]+as[s]+([w:]+)"
         closeSymbole = "^[t ]*enddefine"
         displayMode="node">
         <className>
          <nameExpr expr="[w:]+[s]+as[s]+([w:]+)"/>
         </className>
         <function
          mainExpr="^[t ]*((procedure|proc|function|func)[s]+)[w:]+[s]*[ (,)w]*">
          <functionName>
           <funcNameExpr expr="((procedure|proc|function|func)[s]+)[w:]+[s]*[ (,)w]*"/>
           <funcNameExpr expr="[s]+[w:]+[s]*[ (,)w]*"/>
           <funcNameExpr expr="[w:]+[s]*[ (,)w]*"/>
          </functionName>
         </function>
        </classRange>
    
        <function
         mainExpr="^[t ]*((procedure|proc|function|func)[s]+)[w:]+[s]*[ (,)w]*"
         displayMode="$functionName">
         <functionName>
          <funcNameExpr expr="((procedure|proc|function|func)[s]+)[w:]+[s]*[ (,)w]*"/>
          <funcNameExpr expr="[s]+[w:]+[s]*[ (,)w]*"/>
          <funcNameExpr expr="[w:]+[s]*[ (,)w]*"/>
         </functionName>
        </function>
       </parser>
    
Guarde el archivo.

NOTA: Si lo desea puede remplazar el archivo local functionList.xml por el que descargo

NotePad++ como editor predeterminado de programas desde Visual FoxPro

Usted puede predeterminar como editor de programas (*.prg) a NotePad desde la interfaz de FoxPro, para eso debemos crear el registro de windows la siguiente entrada
[HKEY_CURRENT_USER\Software\Microsoft\VisualFoxPro\9.0\Options]
"TEDIT"="/N C:\Program Files (x86)\Notepad++\notepad++.exe"
NOTA: Si lo desea puede combinar el archivo defaultnotpadeditvfpprg.reg a su registro de windows presionando el botón derecho del ratón sobre el y seleccionando la opción "Combinar". recuerde que debe editar el archivo y cambiar la ruta del programa dependiendo de donde instalo NotePad.

SCREENSHOT


FUENTES
Jose Guillermo Ortiz Hernandez

8 de diciembre de 2013

Los tesoros de Tamar


Tamar E. Granor Quienes conocen a Tamar E. Granor, seguramente la conocen por sus amplios conocimientos y experiencia como desarrolladora, conferenciante y autora de libros y artículos sobre Visual FoxPro. Ella tiene en su sitio web un gran tesoro para cualquier desarrollador VFP: Cientos de artículos y documentos técnicos de sesiones de conferencias y charlas, con ejemplos incluídos, para descargar libremente!!!

Para quienes no la conocen, Tamar E. Granor es propietaria de Tomorrow's Solutions, LLC, una consultora y desarrolladora de numerosas aplicaciones para grandes y pequeñas empresas, y también para organizaciones sin ánimo de lucro, ubicada en Pensilvania, Estados Unidos de América.

Ella trabaja desde 1988 con FoxBase, FoxPro y principalmente con Visual FoxPro. Tamar es autora y co-autora de muchos libros (entre los mas destacados: Hacker’s Guide to Visual FoxProMicrosoft Office Automation with Visual FoxPro y Taming Visual FoxPro’s SQL) y cientos de artículos acerca de Visual FoxPro. También es habitual oradora en numerosas conferencias y grupos de usuarios. FueMicrosoft Visual FoxPro Most Valuable Professional (Profesional Mas Valioso de Microsoft Visual FoxPro) desde el año 1993 hasta el año 2010. En 2007 recibió el Visual FoxPro Community Lifetime Achievement Award (Premio a la Trayectoria de Comunidad Visual FoxPro). Tamar es también socia de Geek Gatherings patrocinadora de las conferencias anuales Southwest Fox y Southwest Xbase++.

Los Tesoros de Tamar se encuentran en el sitio Web de su empresa, en el ítem Publications.

Los enlaces directos para descargar libremente sus publicaciones son:
Todas las publicaciones están en Inglés, pero si aun no dominan este idioma, es una buena excusa para aprender, al menos los términos técnicos, y aprovechar toda la información que fue escribiendo Tamar en su larga carrera. Aparte también estan para descargar los ejemplos en código VFP de las distintas sesiones publicadas.

Gracias Tamar por tu gran generosidad con la comunidad de Visual FoxPro.

A aprovechar este tesoro para nuestro Zorro.!!!

6 de diciembre de 2013

Control separador para Visual FoxPro

Artículo original: Splitter Class for Visual FoxPro
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,cbfe9ce7-8b19-4374-8c52-132a853ef7b3.aspx
Autor: Craig Boyd
Traducido por: Ana María Bisbé York


Muchos lenguajes tienen algún tipo de control separador (splitter), ¿porqué Visual FoxPro no? Para ser justos, he visto algunas clases dando vueltas de tiempo en tiempo; pero pensé que podría intentar echar una mano en esto. Estaba convencido en que no sería muy difícil y Visual FoxPro no me ha defraudado. Más abajo aparece el enlace para la descarga de la biblioteca de clases en la que he colocado mi separador (basada en shape) y un formulario de ejemplo que muestra cómo se utiliza la clase (he tomado una imagen de la pantalla para que pueda ver el aspecto que tiene). Ahora, si desea intentar utilizar esta clase fuera puede que tenga algunos problemas para descargarla. He creado además un ejemplo de ejecución cortar  y pegar que podrá encontrar justo a continuación de la imagen de la pantalla. Este control separador está diseñado para trabajar con Visual FoxPro 9.0. Si está utilizando versiones previas entonces, necesitará modificar / eliminar algunas cosas.

Descarga de Splitter.vcx y formulario de ejemplo (8 KB aprox.): http://www.sweetpotatosoftware.com/files/splitter.zip



*!* Corte y pegue este código a un archivo prg y ejecútelo para ver
*!* y tratar de trabajar con un ejemplo de la clase splitter
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.SHOW
RETURN

************************************
DEFINE CLASS form1 AS FORM
************************************
  DOCREATE = .T.
  CAPTION = "Ejemplo de Separador"
  NAME = "Form1"
  MDIFORM = .T.
  AUTOCENTER = .T.

  ADD OBJECT text1 AS TEXTBOX WITH ;
    Anchor = 11, ;
    HEIGHT = 29, ;
    LEFT = 0, ;
    TOP = 0, ;
    WIDTH = 375, ;
    NAME = "Text1"
  ADD OBJECT edit1 AS EDITBOX WITH ;
    Anchor = 7, ;
    HEIGHT = 217, ;
    LEFT = 0, ;
    TOP = 33, ;
    WIDTH = 184, ;
    NAME = "Edit1"
  ADD OBJECT edit2 AS EDITBOX WITH ;
    Anchor = 15, ;
    HEIGHT = 217, ;
    LEFT = 188, ;
    TOP = 33, ;
    WIDTH = 187, ;
    NAME = "Edit2"
  ADD OBJECT splitter1 AS splitter WITH ;
    TOP = 32, ;
    LEFT = 183, ;
    HEIGHT = 219, ;
    WIDTH = 6, ;
    Anchor = 7, ;
    NAME = "Splitter1"
  ADD OBJECT splitter2 AS splitter WITH ;
    TOP = 28, ;
    LEFT = 0, ;
    HEIGHT = 6, ;
    WIDTH = 376, ;
    Anchor = 10, ;
    vertical = .F., ;
    minimumsize = 29, ;
    NAME = "Splitter2"

  PROCEDURE INIT
    THIS.text1.VALUE = "Visual FoxPro Rocks!"
    THIS.Edit1.VALUE = "Visual FoxPro es una herramienta de desarrollo extremadamente " + ;
      "versátil. No sólo le permite al desarrollador crear buenas aplicaciones centradas " + ;
      "en datos, permite además, extender el lenguaje actual con nuevas clases, bibliotecas " + ;
      "de código, y ganchos. Si es un desarrollador Visual FoxPro tan ávido como yo " + ;
      "esto es bueno para usted. Y si no, entonces le invito a que tome Visual FoxPro " + ;
      "y lo intente. No se arrepentirá"
    THIS.Edit2.VALUE = "Este es un ejemplo de una clase de control separador para  " + ;
      "utilizar en formularios Visual FoxPro 9.0. " + ;
      "Esto es Visual FoxPro puro, no hay ActiveX adicionales o dependencias a DLL " + ;
      "que le preocupen durante la distribución de su aplicación.  Para verlo en  " + ;
      "acción, mueva los separadores horizontal y vertical de un lado a otro dentro  " + ;
      "de este formulario. Además, al redimensionar el formulario puede ver que va  " + ;
      "a funcionar la nueva propiedad Anchors de Visual FoxPro 9.0."
  ENDPROC
ENDDEFINE

************************************
DEFINE CLASS splitter AS SHAPE
************************************
  HEIGHT = 182
  WIDTH = 8
  MOUSEPOINTER = 9
  SPECIALEFFECT = 0
  STYLE = 0
  NAME = "splitter"
  mousedownat = 0  && Hace seguimiento de los movimientos del ratón
                   && y permite que la clase ignore los movimientos
                   && causados al redimensionar el formulario
  vertical = .T.   && Hacer = .F. para splitter horizontal
  minimumsize = 40 && Esto es cuán pequeño (en pixels) pueden
                   && ser los paneles cuando se mueve el splitter

  PROCEDURE MOUSELEAVE
    LPARAMETERS nButton, nShift, nXCoord, nYCoord
    THIS.mousedownat = 0
  ENDPROC

  PROCEDURE MOVE
    LPARAMETERS nLeft, nTop, nWidth, nHeight
    *!* Si desea mover el splitter en tiempo de ejecución y hacer que mueva los otros controles
    *!* entonces haga que mousedownat != 0 y llame al método move del spiltter
    *!* recuerde restablecer mousedownat = 0 cuando ha terminado de mover el splitter
    LOCAL loControl, llLockScreenWas, lnMovement, llIsSplitter, lcUniqueTag, lnMarginOfError, lnAnchorWas
    IF THIS.MouseDownAt == 0
      DODEFAULT(m.nLeft, m.nTop, m.nWidth, m.nHeight)
      RETURN
    ENDIF
    m.loControl = NULL
    *!* La siguiente etiqueta puede ser colocada en controles que no desea MOVER
    m.lcUniqueTag = "DoN't_MoVe_SpLiT" && Es algo que garantiza muy bien de que sea único
    THIS.TAG = m.lcUniqueTag
    m.llLockScreenWas = THISFORM.LOCKSCREEN && En este caso la pantalla está bloqueada
    THISFORM.LOCKSCREEN = .T.
    m.lnMovementLeft = m.nLeft - THIS.LEFT
    m.lnMovementTop = m.nTop - THIS.TOP
    FOR EACH m.loControl IN THIS.PARENT.CONTROLS
      IF m.loControl.TAG = lcUniqueTag && Es el control splitter, entonces regresamos al inicio del lazo
        LOOP
      ENDIF
      IF PEMSTATUS(m.loControl,"Anchor",5)
        m.lnAnchorWas = m.loControl.Anchor
        m.loControl.Anchor = 0
        m.llIsSplitter = m.loControl.CLASS = "Splitter"
        IF THIS.vertical && Vertical Splitter
          lnMarginOfError = INT(THIS.WIDTH/2) && En este caso el desarrollador lleva el splitter demasiado cerca
          IF m.loControl.LEFT <= THIS.LEFT && El control está a la izquierda del splitter
            IF (m.loControl.LEFT + m.loControl.WIDTH) <= (THIS.LEFT + lnMarginOfError) AND !m.llIsSplitter
              m.loControl.WIDTH = MAX(m.loControl.WIDTH + m.lnMovementLeft, 0)
            ENDIF
          ELSE && El control está a la derecha del splitter
            IF !m.llIsSplitter
              m.loControl.WIDTH = MAX(m.loControl.WIDTH - m.lnMovementLeft, 0)
            ENDIF
            m.loControl.LEFT = m.loControl.LEFT + m.lnMovementLeft
          ENDIF
        ELSE && Horizontal Splitter
          lnMarginOfError = INT(THIS.TOP/2) && En este caso el desarrollador lleva el splitter demasiado cerca
          IF m.loControl.TOP <= THIS.TOP && El control está encima del splitter
            IF (m.loControl.TOP + m.loControl.HEIGHT) <= (THIS.TOP + lnMarginOfError) AND !m.llIsSplitter
              m.loControl.HEIGHT = MAX(m.loControl.HEIGHT + m.lnMovementTop, 0)
            ENDIF
          ELSE && El control está debajo del splitter
            IF !m.llIsSplitter
              m.loControl.HEIGHT = MAX(m.loControl.HEIGHT - m.lnMovementTop, 0)
            ENDIF
            m.loControl.TOP = m.loControl.TOP + m.lnMovementTop
          ENDIF
        ENDIF
        m.loControl.Anchor = m.lnAnchorWas
      ENDIF
    NEXT
    m.lnAnchorWas = THIS.Anchor
    THIS.Anchor = 0
    DODEFAULT(m.nLeft, m.nTop, m.nWidth, m.nHeight) && Finalmente mueve el splitter
    THIS.Anchor = m.lnAnchorWas
    THISFORM.LOCKSCREEN = m.llLockScreenWas
    THIS.TAG = ""
  ENDPROC

  PROCEDURE MOUSEMOVE
    LPARAMETERS nButton, nShift, nXCoord, nYCoord
    LOCAL lnMovement
    IF m.nButton = 1 AND !(THIS.mousedownat == 0)
      IF THIS.vertical
        IF m.nXCoord != THIS.mousedownat
          m.lnMovement = m.nXCoord - THIS.mousedownat
          IF BETWEEN(THIS.LEFT + m.lnMovement, THIS.minimumsize, THIS.PARENT.WIDTH - THIS.WIDTH - THIS.minimumsize)
            THIS.MOVE(THIS.LEFT + m.lnMovement, THIS.TOP, THIS.WIDTH, THIS.HEIGHT)
            THIS.mousedownat = m.nXCoord
          ENDIF
        ENDIF
      ELSE && Horizontal
        IF m.nYCoord != THIS.mousedownat
          m.lnMovement = m.nYCoord - THIS.mousedownat
          IF BETWEEN(THIS.TOP + m.lnMovement, THIS.minimumsize, THIS.PARENT.HEIGHT - THIS.HEIGHT - THIS.minimumsize)
            THIS.MOVE(THIS.LEFT, THIS.TOP + m.lnMovement, THIS.WIDTH, THIS.HEIGHT)
            THIS.mousedownat = m.nYCoord
          ENDIF
        ENDIF
      ENDIF
    ENDIF
  ENDPROC

  PROCEDURE MOUSEDOWN
    LPARAMETERS nButton, nShift, nXCoord, nYCoord
    IF THIS.vertical
      THIS.mousedownat = nXCoord
    ELSE
      THIS.mousedownat = nYCoord
    ENDIF
  ENDPROC

  PROCEDURE INIT
    IF !THIS.vertical
      THIS.MOUSEPOINTER = 7 && NS
    ENDIF
  ENDPROC
  PROCEDURE MOUSEUP
    LPARAMETERS nButton, nShift, nXCoord, nYCoord
    THIS.mousedownat = 0
  ENDPROC

ENDDEFINE

24 de noviembre de 2013

Enumerar las voces instaladas en la PC

Con el siguiente código se pueden enumerar y escuchar las distintas voces instaladas en la PC a traves de la API de Microsoft Speech (SAPI).
LOCAL lnVoces, lcVoz, ln, lc
LOCAL loVoz AS "SAPI.SpVoice"
m.loVoz = CREATEOBJECT("SAPI.SpVoice")
m.lnVoces = m.loVoz.GetVoices().COUNT
FOR m.ln = 1 TO m.lnVoces
  m.lcVoz = m.loVoz.GetVoices().ITEM(ln-1).GetDescription
  m.loVoz.Voice = m.loVoz.GetVoices().ITEM(ln-1)
  m.lc = "Voz número " + TRANSFORM(m.ln) + " de " + TRANSFORM(m.lnVoces) + ": " + m.lcVoz
  ? m.lc
  m.loVoz.Speak(m.lc)
ENDFOR