Blog sobre programación en VFP, Actualizado por Jorge Mota en Guatemala ;)



Archivo de CategoríasAPI



Desarrollo & API & Ideas & Trucos 08 Ago 2007 01:43 pm

Obteniendo el nombre corto de una ruta o archivo

, , , , , , , ,

Hace poco me tope con la necesidad de saber la ruta corta de un archivo (o ruta DOS), al decir ruta corta me refiero a la ruta que manejaba el DOS antiguo, que a diferencia de windows cada archivo solo puede tener 8 caracteres en el nombre del archivo y 3 en la extensión. es decir

C:\Mis Archivos\Juan Pérez y Pérez.xls una aplicación DOS lo encontraría así: C:\Misarc~1\JUANPR~1.XLS.

Esta Función permite obtener ese nombre corto:

Function GetDosFileName(lcfile As String) As String
**http://fox.desdeguate.com/?p=77
**Autor: Jorge Mota
**Devuelve la ruta corta (DOS) de una ruta o un archivo.
Declare Long GetShortPathName In "kernel32" String lpszLongPath,;
String lpszShortPath, Long lBuffer
lcFileName=Replicate(Chr(0),254)
lnTotal=GetShortPathName(lcfile, @lcFileName, Len(lcFileName))
Return Substr(lcFileName,1,lnTotal)
Endfunc

Ejemplos de uso:
Archivo:
?lcfile = GetDosFileName([C:\Juan Pérez y Pérez.xls])
Directorio:
lcDir = GetDosFileName([C:\Archivos de Programa\])

Retornará una cadena vacía si el directorio o archivo no existe.

Hasta la próxima.

, , , , , , , ,

Desarrollo & API & Ideas 22 Feb 2007 05:04 pm

Creando aplicaciones de modo consola desde VFP

, , , , , , ,

Bueno, esto es un código viejo que tengo desde hace rato por publicar, pero no por eso no util :)

Recuerdo que en unos de mis primeros contactos con el mundo linux, ví una aplicación para grabar cd’s, que al entrar a modo debug, mostraba una ventana al estilo D.O.S en el que íba indicando que método llamaba y que parámetros estaba usando, también el valor que retornaba, y me gusto mucho la idea, pero nunca realmente lo implemente, hasta hace poco que necesitaba en un proceso que se invoca desde otra estación para ejecutarse en el servidor, saber en que método se quedaba exactamente, ya que el proceso era asíncronico, pues bien, allí fue donde se me ocurrio tener desde vfp la manera de poder crear una de estas ventanitas:

Aplicación de modo consola

Pero en este ejemplo aún no les mostrare como usar la emulación de la consola de comandos, nada más les brindo una aplicación que les permitira agregar comandos en un dbf y ejecutarlos desde la ventana en cuestión:

Ejemplo de emulación de consola de comandos desde vfp

al ejecutar “vfp_console.prg” veran la pantalla negra en cuestión (también es configurable el color de fondo y color de la letra, como aprenderemos en la próxima publicación), puede escribir “ayuda” y presionar enter, lo que le mostrará una lista de comandos disponibles, también podrá escribir Ayuda Comando (donde Comando es el comando del que quiere obtener ayuda) para mostrar información acerca del mismo, por ejemplo Ayuda hora

El proyecto incluye un dbf llamado “Comandos” donde puede establecer que x Comando VFP no sea permitido ejecutar (Wait window, quit, cancel, debug, etc) solo debe establecer el valor del campo “Permitido” a .f. en el registro.

Para descargar el proyecto: http://fox.desdeguate.com/descargas/vfp/vfp_console.zip clic acá

Saludos y hasta la próxima cuando revisaremos y veremos más a detalle estas funciones API.

, , , , , , ,

Desarrollo & API 29 Ene 2007 06:53 am

Descargar un archivo de internet y sin mostrar nada

, , , ,

Hace algún tiempo publique una API para descargar un archivo de internet, aunque tiene el inconveniente que muestra un dialogo al usuario para seleccionar el nombre del archivo, lo cual no siempre vamos a necesitar. Así que ahora traigo la solución, que nos permite indicar la ruta en la que queremos almacenar el archivo:

Local lcUrl, lcFileName
lcUrl = [http://fox.desdeguate.com/favicon.ico]
lcFileName = [C:miIcono.ico]
Declare Long URLDownloadToFile In "urlmon" Long hCall, String cUrl, String cFileName, Long dwReserved, Long lpfnCB
URLDownloadToFile(0,lcUrl,lcFilename,0,0)

Únicamente debemos pasar en el segundo y tercer parametro respectivamente, el URL y el nombre (incluyendo la ruta completa) con el que queremos almacenar el archivo.

Saludos y hasta la próxima :)

, , , ,

Desarrollo & API & Trucos 17 Ene 2007 02:12 pm

Administrando las declaraciones de las funciones API (iDeclare)

, , , , ,

Esta vez les presento una función que nos permite administrar nuestro código de declaración de las API, permitiendonos centrarlo en una sola tabla, y a su vez, permitirnos declarar la función una sola vez.

El ejemplo se compone de 2 funciones iDeclare y iCheckDll, que básicamente hacen lo siguiente:

  • iDeclare: Recibe como parámetro el nombre de la función que queremos declarar y revisa en la tabla iDeclare.dbf sí existe su definición, si la encuentra, invoca a iCheckDll para averiguar si ya ha sido declarada, en caso de ser afirmativo retorna .T., en caso de ser negativo, ejecutara el código para declarar nuestra función dll.
  • iCheckDLL: Esta función hace uso de aDLLS y aScan (introducidas en VFP 7) para obtener una matriz de las dll declaradas y buscar en la misma la declaración de la función que nos interesa.

Un breve ejemplo usando iDeclare sería:

=iDeclare([GetActiveWindow])
lnHandle = GetActiveWindow()

Sí no queremos usar iDeclare y poder declarar nosotros la función según necesitemos podemos hacerlo así:

If !iCheckDLL([GetActiveWindow])
	Declare Long GetActiveWindow In user32
Endif
lnHandle = GetActiveWindow()

Para descargar la función: http://fox.desdeguate.com/descargas/vfp/iDeclare.zip

Saludos y hasta la próxima :) .

, , , , ,

Desarrollo & API 04 Ene 2007 01:22 pm

Simular una Falla en el sistema

, , , , ,

Para esas ocasiones en las que por una u otra razón queremos terminar la aplicación abruptamente (detectamos una licencia pirata, falta de pago, etc.), nada mejor que un fallo general en la aplicación, y para no llamar mucho la atención, usamos un error de Windows.

Declare FatalAppExit IN kernel32 long uAction , string lpMessageText
FatalAppExit(0, "Lo siento, ha efectuado una operacion no valida...")

y listo, veran un bonito cuadro de Windows :), curiosamente quizá hasta desaparezca el menú, al verla en el administrador de tareas mostrara el estado: “No Responde”

Saludos y hasta la próxima :)

, , , , ,

Desarrollo & API 01 Dic 2006 02:28 am

Reiniciar la máquina al realizar un cambio

Algunas veces, luego de que modificamos una configuración en Windows, nos aparece el típico mensaje de “para que la configuración surta efecto debe reiniciar su máquina, desea reiniciar ahora”, aunque también nos aparece al instalar algun programa, para lograr el mismo efecto en nuestras aplicaciones la función API que tenemos que usar es SetupPromptReboot del dll setupApi.dll de windows, acá una función que si la llamamos sin parametros mostrará el dialogo en cuestión, si le pasamos .t. reiniciara sin preguntar:

Function Reiniciar(luNoPreguntar)
	Declare SetupPromptReboot In setupapi.Dll  Long FileQueue, Long Owner, Long ScanOnly
	If !luPreguntar
		SetupPromptReboot (0, _Screen.HWnd, 0)
	Else
		SetupPromptReboot(0, _Screen.HWnd, 1)
	Endif
Endfunc 

Hasta la próxima.

Desarrollo & API 30 Nov 2006 02:00 am

Crear Formularios Redondos con VFP

Para cuando quieran crear formularios un poco diferentes a los típicos cuadrados :)

Public oFrm
oFrm = Createobject('Form_Redondo')
oFrm.Show()
Return

Define Class Form_Redondo As Form
	Procedure Load
		Local hRgn
		Declare Integer SetWindowRgn In user32 ;
			integer HWnd, Integer hRgn , Integer bRedraw
		Declare Long CreateEllipticRgn In "gdi32" Long X1, Long Y1, Long X2, Long Y2
		hRgn = CreateEllipticRgn(22,20,This.Width,This.Height)
		SetWindowRgn(This.HWnd, hRgn, 1)
	EndProc
EndDefine

Desarrollo & API 29 Nov 2006 07:06 pm

Cerrar Sesión de windows desde VFP

, , , , , , ,

Bueno, pues volvemos a la carga, esta vez para mostrar un API de windows no documentada :)

Declare Long FreeLibrary In "kernel32" Long hLibModule
Declare Long LoadLibrary In  "kernel32"  String lpLibFileName
Declare Long GetProcAddress In "kernel32" Long hModule, Long lpProcName
Declare Long CallWindowProc In "user32" Long lpPrevWndFunc, Long handle, String Msg , Long wParam, String Lparam
On Error ?''
Local lb As Long
Local pa As Long
lb = LoadLibrary("Shell32")
pa = GetProcAddress(lb, 60)
?CallWindowProc(pa+2, _Screen.HWnd, "Cerrar Sesion", 1, "0")
FreeLibrary(lb)
On Error 

Si no quieren pedir la confirmación, en Portalfox.com existe un artículo al respecto, y en uno de los comentarios esta la rutina :)

Hasta la próxima

, , , , , , ,

API 24 Nov 2006 06:10 am

Descargar un Archivo desde Internet

El código necesario para descagar un archivo desde internet, es usando el API de windows:

Declare DoFileDownload IN shdocvw.dll STRING lpszFile
DoFileDownload(STRCONV("http://fox.desdeguate.com/favicon.ico",12))

Esto mostrará el cuadro de dialogo Guardar como… de Internet Explorer.

Descarga de Archivos con Internet Explorer

Saludos.

API 01 Ago 2005 12:37 am

Obteniendo información de un video

Hace un tiempo en el news publico de foxpro de Microsoft alguien pregunto como traducir una código que usaba API de Visual Basic a VFP, Aca Pueden ver el código que nos da mucha información sobre el video, tal como Tamaño, altura, longitud, etc., a ver si le es de utilidad a alguno.

Seguir leyendo »