7 de noviembre de 2016

Obtener la dirección MAC (Mac Address)

Como obtener la dirección MAC (dirección de la tarjeta Ethernet) ...

Uso:

direccion = MacAddress()
FUNCTION MacAddress
Local pGUID,rGUID,lnSize
Declare integer CoCreateGuid in 'OLE32.dll' ;
  string @pguid
Declare integer StringFromGUID2 in 'OLE32.dll' ;
  string rguid, string @lpsz, integer cchMax
pGUID=replicate(chr(0),16)
rGUID=replicate(chr(0),80)

If "5." $ OS() && 2000/XP
  Declare integer UuidCreateSequential in 'RPCRT4.dll'  string @ Uuid
  Return substr( iif( UuidCreateSequential(@pGUID) = 0 ;
    and StringFromGUID2(pGUID,@rGUID,40) # 0, ;
    StrConv(left(rGUID,76),6), "" ), 26,12)
Else
  Return substr( iif( CoCreateGuid(@pGUID) = 0 ;
    and StringFromGUID2(pGUID,@rGUID,40) # 0, ;
    StrConv(left(rGUID,76),6), "" ), 26,12)
Endif
Cetin Basoz

21 de octubre de 2016

Desglosar cadenas separadas por comas en matrices de Visual FoxPro

Artículo original: Parsing comma-delimited strings into a Visual Foxpro array
http://www.ml-consult.co.uk/foxst-15.htm  
Autor: Mike Lewis
Traducido por: Ana María Bisbé York


Un modo sencillo de desglosar datos en una cadena separada por comas.

En Visual FoxPro (y otros lenguajes de programación) las cadenas delimitadas por comas son una vía sencilla para guardar pequeñas colecciones de datos. Es habitual el uso de estas cadenas para pasar parámetros a procedimientos o funciones, o para guardar valores en propiedades de usuarios o clases. Puede además, importar datos de algunas aplicaciones en forma de un archivo de texto delimitado por comas.

He aquí una vía sencilla para desglosar una cadena separada por comas en VFP 6.0. Utilizando esta sencilla línea de código, puede extraer rápidamente cada elemento separado por la coma y colocarlo en un elemento independiente de la matriz.

nRows = ALINES(laData, STRTRAN(cTest,",",CHR(13)))

En este caso, la cadena delimitada por comas se llama cTest y la matriz se llama laData. Si no existe la matriz, la crea. Luego de ejecutar el código, la variable nRows contendrá la cantidad de elementos en la matriz.

El código realiza dos sencillas operaciones. Primero, la función STRTRAN() convierte cada una de las comas en un carácter de fin de cadena (ASCII 13). La función ALINES() coloca cada "línea" que se ha formado en un elemento de la matriz. ALINES(), que se introdujo en VFP 6.0, está diseñada para extraer párrafos de cadenas de texto muy largas; pero funciona también en el contexto mostrado aquí.

En VFP 7.0 y superior, el código es incluso más sencillo. VFP 7.0 introdujo un parámetro adicional a ALINES(), el que le permite especificar un carácter fin de línea personalizado. Entonces, en lugar de tener que utilizar STRTRAN() para convertir las comas en ASCII 13, puede sencillamente estipular que la coma marca el fin de línea. El código entonces, es el siguiente:

nRows = ALINES(laData, cTest, .F., ",")

El tercer parámetro de ALINES() es un indicador que dice si la "línea" debe ser recortada cuando es copiada en la matriz.

Si desea convertir un archivo de texto entero en una matriz simplemente conviértalo en una cadena de caracteres antes con el código que se muestra a continuación. En VFP 6.0 y superior, la forma más fácil de convertir un archivo en una cadena es con la función FILETOSTR(). Entonces, teniendo un archivo de texto delimitado por comas llamado CLIENTS.TXT, he aquí cómo lo puede desglosar en una matriz llamada aClients:

cClients = FILETOSTR("clients.txt")
nRows = ALINES(aClients,STRTRAN(cClients,",",CHR(13)))

Vea que esta técnica no trabaja si las variables como tal contienen comas. Cuando se almacenan, por ejemplo, nombres y direcciones como variables separadas por comas, por ejemplo, lo habitual es encerrarlas entre comillas, para indicar que al desglosar trate todo este texto entre comillas como un único elemento. Desafortunadamente el código mostrado en este artículo no puede controlar esta situación.

Mike Lewis Consultants Ltd. Julio 2000. Revisado Noviembre 2001.

17 de octubre de 2016

Pedir un nombre de carpeta o archivo a los usuarios

Artículo original: Prompt your users for a file or directory name
http://www.ml-consult.co.uk/foxst-24.htm
Autor:Mike Lewis
Traducido por: Ana María Bisbé York


Esta sencilla clase facilita aún más esta tarea.

Las aplicaciones Visual Foxpro a veces necesitan preguntar al usuario un nombre de archivo o directorio. Habitualmente lo mejor es hacer una combinación de cuadros de texto y botones de comandos. Si el usuario ya conoce el nombre requerido, puede escribirlo en el cuadro de texto. Si no lo conoce. Puede hacer clic en el botón para invocar el diálogo Seleccionar Directorio o Abrir archivo, desde el que puede navegar a la carpeta o archivo en cuestión.

No es difícil crear este tipo de mecanismos. Pero es incluso más fácil si utiliza la clase cmpSelDir de Bárbara Peisch, la que realiza todo el trabajo por usted.

La clase cmpSelDir es una clase compuesta, que contiene un cuadro de texto y un botón de comandos como he descrito antes. Para utilizarla, arrástrela a un formulario. De forma predeterminada, el botón abrirá el diálogo Seleccionar Carpeta. Para abrir en su lugar el diálogo Abrir fichero, cambie la propiedad WhichGet a la palabra File (Vea que es sensible a mayúsculas y minúsculas). Con ambos tipos de diálogo, el nombre de archivo o el directorio que el usuario selecciona será agregado en el cuadro de texto, sobre-escribiendo cualquier texto que estuviese escrito antes. Si el usuario cancela el diálogo, se preserva lo que existía en el cuadro de texto.

La clase ofrece varias propiedades que permiten personalizar el diálogo de formas diferentes. Por ejemplo: se puede asignar a PromptText un texto con una pregunta que puede aparecer en el diálogo, en OpenButtonCaption el texto que va a aparecer en el botón OK en el diálogo Abrir fichero. Aún más interesante, la propiedad FileExtensions puede ser utilizada para llenar el control Tipos de archivos en el diálogo Abrir Archivo. Puede establecer esta lista de extensiones de archivos, con caracteres comodines opcionales, acompañados opcionalmente por descripciones cortas (Ejemplo: "Tablas:DBF; Archivos de texto :TXT, CSV").

Todas estas propiedades tienen parámetros de configuración, por tanto puede ignorar aquellos en los que no está interesado. Para mayor información vea el método ZReadMe.

Y esto es todo lo que hay sobre esta clase. La clase cmpSelDir es una clase elegante, fácil de utilizar, y un ejemplo excelente de una herramienta que realiza un trabajo y lo hace bien.

Sobre la desarrolladora

Barbara Peisch dirige Peisch Custom Software Inc., una consultoría VFP en Carlsbad, CA (USA). Fue editor técnico del libro: "WebRAD: Building Database Websites with Visual FoxPro and Web Connection", y es co-autora de la columna de la revista CoDe "Customers vs Code: Keeping Your Cool with the Essential Component". Barbara es la autora original de la columna KitBox de la revista FoxTalk, y es Microsoft MVP, así como miembro activo del Microsoft Application Developers Forum en Compuserve. Se le puede contactar en barbara@peisch.com o visitando www.peisch.com.

Cómo descargar cmpSelDir

Haga clic en el enlace más abajo para descargar CMPSELDIRFILE.ZIP. Este archivo ZIP contiene una biblioteca de clases, que a su vez contiene la clase cmpSelDir. Contiene además, otra clase llamada cmdFileFind, que es la clase padre de los botones de comandos empleados en la clase compuesta. El tamaño de la descarga es 5 KB.

Descargar ahora http://www.ml-consult.demon.co.uk/cmpseldirfile.zip

Mike Lewis Consultants Ltd. Abril 2002

14 de octubre de 2016

¿Es el Usuario un Administrador?

Rutina para determinar si el Usuario actual de Windows es Administrador.

#DEFINE NO_ERROR 0
 
DECLARE INTEGER IsUserAnAdmin IN shell32
 
DECLARE INTEGER WNetGetUser IN mpr;
    INTEGER lpName, STRING @lpUserName, INTEGER @lpnLength
 
LOCAL lcUser, lnBufsize
lnBufsize = 250
lcUser = Repli(Chr(0), lnBufsize)
 
IF WNetGetUser(0, @lcUser, @lnBufsize) = NO_ERROR
    ? "Nombre de Usuario:", SUBSTR(lcUser, 1, AT(Chr(0),lcUser)-1)
    ? "Es Administrador:", Iif(IsUserAnAdmin()=0, "No", "Si")
ENDIF

Saludos.

Jesus Caro V