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



Archivo MensualEnero 2007



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 & Internet & Ideas 24 Ene 2007 01:27 pm

Procesando RSS desde VFP

, , , , , , , ,

Recientemente para un proyecto en el que estoy trabajando, (un lector de orígenes RSS, para blogs), me tope con el problema de como cargar un RSS en XML a un cursor en vfp, pues por más que le movía al XMLToCursor y al XMLAdapter no lograba ver todas las entradas, así que probando probando y leyendo un poco sobre XML dí con la forma de hacerlo :)

Básicamente consiste en seleccionar la referencia a IXMLDOMElement que nos brinda el XMLAdapter, y hacer uso del metodo SelectNodes que este nos brinda.

Un breve ejemplo de lo que hablo:

Local loXml As Xmladapter, loItems As Collection
loXml = Createobject("XMLAdapter")
luNonXML = .F.
lcFileName = Getfile("xml")
Try
	loXml.LoadXML(lcFileName,.T.)
Catch To loError
	Messagebox("Error al procesar el XML, por favor revise que la URL del FEED del sitio sea correcta",48,"Error")
	luNonXML = .T.
	Set Step On
Endtry
If luNonXML
	Return .F.
Endif
loDom = loXml.IXMLDOMElement
loItems= loDom.SelectNodes("//item")
For lnCiclo = 0 To loItems.Length - 1
	Append Blank In qElementos
	lcOtros = []
	lcTitulo = []
	For lnItem = 0 To loItems.Item(lnCiclo).ChildNodes.Length -1
		loElem= loItems.Item(lnCiclo).ChildNodes.Item(lnItem)
		lcNodo =Upper(Alltrim(loElem.NodeName))
		Do Case
			Case lcNodo = [TITLE]
				lcTitulo = loElem.Text
				*			Case lcNodo =[CONTENT]
				*				Wait Window "Content:" + loElem.Text
				*			Case lcNodo = [DESCRIPTION] And Empty(Alltrim(qElementos.texto))
				*				Wait Window "Description:" + loElem.Text
				*			Case lcNodo = [LINK]
				*				Wait Window "URL:" + loElem.Text
				*			Case lcNodo = [CATEGORY]
				*				Wait Window "Category:" + loElem.Text
		Endcase
		lcOtros = lcOtros + loElem.NodeName + [:] + loElem.Text + Chr(13)+Chr(10)
	Endfor
	Messagebox(lcOtros,0,lcTitulo)
Endfor

Antes deben de guardar en su pc, un orígen de algún blog, como puede ser el de este blog:
http://fox.desdeguate.com/feed

(clic derecho, guardar como… y le ponen extensión xml ;) )

Luego lo cargan con este simple programa y podran ir recorriendo cada uno de los atributos que el Feed nos de.

Para más información sobre el standard RSS: http://www.rss-specifications.com

Ojalá y mi bendito lector de RSS-VFP este a punto para ser lanzado ;)

Creo que me acabo de dar cuenta que en realidad esto sirve para ATOM no para RSS 1.0 :)
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 :) .

, , , , ,

Ocio 17 Ene 2007 01:00 pm

Un perro bastante inteligente…

, , ,

Un perro bastante inteligente, acá en Guatemala popularmente les llamamos “chuchos” en tu país como les dicen ?

Vía: http://arbroath.blogspot.com/2007/01/dog-making-his-escape.html

Saludos.

, , ,

Desarrollo & Ideas 10 Ene 2007 04:32 am

Estableciendo una Forma a solo lectura: iReadOnly

, , , , , , ,

En algunas ocasiones, necesitamos que una forma bajo ciertas circunstancias muestre su contenido, pero de solo lectura para la mayoría de los controles, normalmente bajo los accesos de usuario, estado del registro, etc.

Recientemente me he visto en esa necesidad, así que nada más práctico que crear una clase que me permita hacer ese trabajo, aunque con una pequeña observación, yo no acostumbro usar la propiedad ReadOnly de un control para deshabilitar el acceso, prefiero utilizar Enabled = .f., y la clase hace su trabajo así, deshabilitando controles, y por que se preguntarán, pues debido a que algunas veces necesito que carguen la forma, y para ciertos registros puedan editar la información, pero para otros, no puedan ni siquiera acceder al contenido de los pageframes, o navegar por los grids.

La clase cuenta con 2 propiedades importantes:

  • icExcluir
  • que indica que clases base no queremos procesar (labels, timers, shapes, etc), debe ser una lista al estilo: “shape”,”timer” incluyendo las comillas.

  • ilContenedores
  • nos permite indicar si la clase deshabilitará los controles contenedores también, tal es el caso de los pageframe, pages,grids, container. para que el usuario no los pueda usar.

También cuenta con una propiedad ilReadOnly que nos indica si la forma se encuentra en solo lectura (.T.) o acceso normal (.F.), que puede utilizar en cualquier momento para saber el estado del acceso.

El método que se debe invocar para alternar entre acceso normal y solo lectura es SetReadonly() podiendole indicar el estado al que queremos establecer, mandandolo a llamar con el parametro .T., establece a solo lectura la forma, con parametro .f. o vacío, se establece en acceso normal (subsecuentes llamadas del mismo método sin parametros alternará entre solo lectura y acceso normal).

La clase incluye un formulario de ejemplo que permite ver en acción la clase, si el checkbox con el texto “DesHabilitar Objetos contenedores” se establece en .T., al dar clic en el botón “Solo Lectura” no podrá hacer uso del grid, ni del pageframe, por el contrario, si esta en .F., entonces sí podra tener acceso.

La clase cuenta con un método que debe ser reescrito según cada forma “Proceso_Before” en el que puede tomar las consideraciones del caso, para decidir si determinado control se establecen a solo lectura, el método recibe como parametro el control que se esta evaluando, por lo que puede hacer una comparación del tipo:

If oControl = Thisform.MiGrid
	Return .F. &&impide que se deshabilite el control.
Endif

O también del tipo

If Inlist(oControl, Thisform.cmdSave, Thisform.cmdCancel)
	Return .F. &&impide que se deshabilite el control.
Endif

Si el método retorna .F., el control no se deshabilita.

Además si necesita que x Control siempre se mantenga deshabilitado, puede programar el refresh del control para que siempre lo haga, o establecer la propiedad ReadOnly a .T., también, puede establecer siempre la propiedad Enabled = .f. desde Procesa_Before cuando oControl = thisform.controlsiempredeshabilitado.

Para ver el ejemplo y descargar la clase clic acá
http://fox.desdeguate.com/descargas/vfp/iReadOnly.zip

Saludos y hasta la próxima.

, , , , , , ,

Internet & Ocio 09 Ene 2007 05:33 am

Google.com.es ¿0wn3d?

Hace poco necesitaba buscar cierta información sobre páginas españolas, así que decidí recurrir al buen San Google, como yo estoy en Guatemala al ingresar a www.google.com me redirije a www.google.com.gt, así que por lógica puse www.google.com.es y sorpresa!!! me redirige a un “motor” de búsqueda diferente, me redirige a http://www.1buscar.es/, es que acaso el gran Google, ¿no ha podido reclamar el dominio .com.es?.

Así luce el sitio www.google.com.es luego de redireccionarnos a 1Buscar.es:

Snapshot 1Buscar.es

Además esta gente esta aprovechandose del dominio para que la gente realize busquedas con ellos, si observan al final de la página pone powered by Ask.com. como es posible que www.google.com.es use Ask como motor de búsqueda!!!

Ver las siguientes notiicias:
http://google.dirson.com/post/3040-recupera-dominio-com-es/
http://www2.noticiasdot.com/publicaciones/2004/0204/2302/noticias230204/noticias230204-4.htm

http://www.accesobit.com/2006/12/17/google-rescupera-su-dominio-comes/

En fin, cosas de internet, alguien se aprovecho del despiste de google.es :P
Saludos y hasta la próxima

Ocio 08 Ene 2007 02:42 pm

Google y Dilbert

, , ,

Vagando por internet, me encontre con esta graciosa página en google :) que por cierto desconocía hasta el momento.

Realmente buena :)

Dilbert Parte 1

Para ver las siguientes partes:

http://www.google.com/dilbert2.html

Saludos.

, , ,

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 :)

, , , , ,