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…
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
- ilContenedores
que indica que clases base no queremos procesar (labels, timers, shapes, etc), debe ser una lista al estilo: “shape”,”timer” incluyendo las comillas.
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.
controles, Desarrollo, fox, Ideas, indicar, librerias, solo lectura, utiles vfp
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:
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 ![]()
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

Para ver las siguientes partes:
http://www.google.com/dilbert2.html
Saludos.
dilbert, funny, google, Ocio www google
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 ![]()

