29 de mayo de 2003

Conocer el Codigo RGB y Hexagecimal de un color de algún punto de la pantalla

Este Ejemplo muestra la forma como podemos obtener el codigo Rgb de ese color que nos gusta de X Aplicacion.

Solo basta con ejecutar este código, situar el mouse sobre el color que nos interese para ver el codigo en RGB (nRojo,nVerde, nAzul) que deberemos usar, o también el Hexagecimal para usarlo en codigo HTML.

Public oForm
oForm=Newobject("Toma_Color")
oForm.Show(1)
Return

Define Class Toma_Color As Form
 Height = 30
 Width = 350
 ShowWindow = 2
 DoCreate = .T.
 AutoCenter = .T.
 BorderStyle = 2
 Caption = "Toma-Color "
 ControlBox = .T.
 Closable = .T.
 HalfHeightCaption = .T.
 MaxButton = .F.
 MinButton = .F.
 ClipControls = .F.
 TitleBar = 1
 AlwaysOnTop = .T.
 Name = "Frm_Toma_Color"

 Add Object ColorHex As TextBox With ;
  Height = 25, ;
  Left = 33, ;
  Top = 2, ;
  Width = 108, ;
  Name = "ColorHex"
 Add Object timer1 As Timer With ;
  Top = 3, ;
  Left = 3, ;
  Height = 23, ;
  Width = 23, ;
  Interval = 500, ;
  Name = "Timer1"
 Add Object shape1 As Shape With ;
  Top = 2, ;
  Left = 3, ;
  Height = 24, ;
  Width = 24, ;
  Name = "Shape1"
 Add Object lrojo As Label With ;
  AutoSize = .T., ;
  FontBold = .T., ;
  BackStyle = 0, ;
  Caption = "R", ;
  Height = 17, ;
  Left = 158, ;
  Top = 6, ;
  Width = 10, ;
  Name = "lRojo"
 Add Object lverde As Label With ;
  AutoSize = .T., ;
  FontBold = .T., ;
  BackStyle = 0, ;
  Caption = "G", ;
  Height = 17, ;
  Left = 226, ;
  Top = 6, ;
  Width = 10, ;
  Name = "lVerde"
 Add Object lazul As Label With ;
  AutoSize = .T., ;
  FontBold = .T., ;
  BackStyle = 0, ;
  Caption = "B", ;
  Height = 17, ;
  Left = 294, ;
  Top = 6, ;
  Width = 10, ;
  Name = "lAzul"
 Add Object larojo As Label With ;
  AutoSize = .T., ;
  BackStyle = 0, ;
  Caption = "#", ;
  Height = 17, ;
  Left = 149, ;
  Top = 6, ;
  Width = 9, ;
  ForeColor = Rgb(255,0,0), ;
  Name = "larojo"
 Add Object laverde As Label With ;
  AutoSize = .T., ;
  BackStyle = 0, ;
  Caption = "#", ;
  Height = 17, ;
  Left = 216, ;
  Top = 6, ;
  Width = 9, ;
  ForeColor = Rgb(0,255,0), ;
  Name = "laVerde"
 Add Object laazul As Label With ;
  AutoSize = .T., ;
  BackStyle = 0, ;
  Caption = "#", ;
  Height = 17, ;
  Left = 284, ;
  Top = 6, ;
  Width = 9, ;
  ForeColor = Rgb(0,0,255), ;
  Name = "laAzul"
 Add Object color_r As TextBox With ;
  Format = "LK", ;
  Height = 23, ;
  InputMask = "999", ;
  Left = 168, ;
  Top = 3, ;
  Width = 41, ;
  Name = "Color_R"
 Add Object color_g As TextBox With ;
  Format = "LK", ;
  Height = 23, ;
  InputMask = "999", ;
  Left = 238, ;
  Top = 3, ;
  Width = 41, ;
  Name = "Color_G"
 Add Object color_b As TextBox With ;
  Format = "LK", ;
  Height = 23, ;
  InputMask = "999", ;
  Left = 305, ;
  Top = 3, ;
  Width = 41, ;
  Name = "Color_B"

 Procedure buf2word
  Lparameters cBuffer
  Return Asc(Substr(cBuffer, 1,1)) +;
   BitLShift(Asc(Substr(cBuffer, 2,1)),  8)+;
   BitLShift(Asc(Substr(cBuffer, 3,1)), 16)+;
   BitLShift(Asc(Substr(cBuffer, 4,1)), 24)
 Endproc

 Procedure convertir_color
 * Funcion Tomada de http://www.portalfox.com/article.php?sid=534
 * Enviada Por Luis Maria Guayan
 * Adaptada Para Obtener el Color en Hexagecimal
 * o la cantidad de Rojo, verde o Azul
  Lparameters nColor, nNumero
  Local cResult, nCiclo
  cResult= "#"
  For nCiclo= 1 To 3
   cResult= cResult+ Right(Transform(nColor%256,alltrim(" @0")),2)
   If nCiclo = nNumero
    Return (nColor %256)
   Endif
   nColor = Int(nColor/256)
  Endfor
  Return cResult
 Endproc

 Procedure Load
  Declare Long GetWindowDC In "user32" Long nHandle
  Declare Long GetPixel In "gdi32" Long hdc, Long nX, Long nY
  Declare Long GetCursorPos In "user32" String @cPuntero
  Declare Long GetDesktopWindow In "user32"
  Local cPos As String
  cPos= Space(20)
  GetCursorPos(@cPos)
  With This
   .AddProperty('hdc',GetWindowDC(GetDesktopWindow()))
   .AddProperty('nX',0)
   .AddProperty('nY',0)
   .nX=This.buf2word(Substr(cPos,1,4))
   .nY=This.buf2word(Substr(cPos,5,4))
  Endwith
 Endproc

 Procedure timer1.Timer
  Local cPos, nColor
  cPos =Space(20)
  GetCursorPos(@cPos)
  With Thisform
   .nX=.buf2word(Substr(cPos,1,4))
   .nY=.buf2word(Substr(cPos,5,4))
   nColor= GetPixel(.hdc,.nX,.nY)
   .shape1.BackColor = nColor
   .ColorHex.Value   = .convertir_color(nColor,0)
   .color_r.Value    = .convertir_color(nColor,1)
   .color_g.Value    = .convertir_color(nColor,2)
   .color_b.Value    = .convertir_color(nColor,3)
  Endwith
 Endproc
Enddefine

Saludos.

Jorge Mota, Guatemala

22 de mayo de 2003

Abrir cuadro de dialogo conectar a unidad de red

Esta función permite abrir el cuadro de diálogo conectar a unidad de red o impresora

#DEFINE RESOURCETYPE_DISK 1
#DEFINE RESOURCETYPE_PRINT 2

Declare Integer WNetConnectionDialog In Win32Api;
Integer Handle, Integer ResourceType

Declare Integer FindWindow In Win32Api;
Integer Handle, String cTitle

*-- Para conectar a una unidad de red
WNetConnectionDialog(FindWindow(0,_Screen.Caption), RESOURCETYPE_DISK)

*-- Para conectar a una impresora
WNetConnectionDialog(FindWindow(0,_Screen.Caption), RESOURCETYPE_PRINT)

Jairo Espinal

15 de mayo de 2003

Saber por API, si podemos abrir un archivo de forma exclusiva

Esta Api, nos permite saber si un archivo lo podemos abrir de manera Exclusiva

Si Devuelve .T., esta bloqueado por otra aplicación, útil para saber si esta en uso.
? EstaBloqueado("c:otr_atisaappreg01.dbf")
Function EstaBloqueado(cArchivo)
 Declare Long _lopen In "kernel32" as lOpen String lpPathName, Long iReadWrite
 Declare Long _lclose In "kernel32" as lClose Long hFile
 Local hFile As Long
 hFile = -1
 hFile = lOpen(cArchivo, 0x10)
 Result = hFile = -1
 lClose (hFile)
 Return Result
Endfunc
Jorge Mota

1 de mayo de 2003

Consumiendo Servicios Web con Microsoft Visual FoxPro

José G. Samper C.
VFP 7.0 y VFP 8.0

Con el surgimiento de SOAP y los Servicios Web se abre un mundo de posibilidades para la interconexión de plataformas y aplicaciones. Decimos que nos abre un mundo de posibilidades por que los Servicios Web nos permite el acceso a diversas funciones vía Web y de esta manera le damos funcionabilidad adicional y un valor agregado a nuestras aplicaciones.

Obteniendo información de WSDL

Como SOAP define un estándar WSDL, todo Servicio Web tiene una página XML con la descripción de los objetos, la sintaxis y métodos disponibles. Estas páginas nos sirven como referencia para la elaboración de la sintaxis de llamada y nos permite verificar si hubo cambios en el Servicio Web. No es necesario entender el documento para consumir un Servicio Web.

Ejemplo:

Para este artículo usaremos el Servicio Web de http://www.universalthread.com, cuando consultamos el WSDL de este Servicio obtenemos:


Invocando el Servicio Web desde nuestra aplicación Cliente

Para este artículo elaboraremos una pequeña aplicación que nos permita ver la Lista de Artículos disponibles y la Lista de Archivos disponibles para Downloads en Universal Thread. Dos de los 31 métodos disponibles de este Servicio Web.

1. Creamos nuestro proyecto


2. Creamos un formulario que contenga un Pageframe con dos Page, un Grid y un Commandbutton en cada Page.


3. En el INIT de nuestra forma escribimos nuestro código de invocación del Servicio Web.
Public lo_serv As Object
Local lc_user As String,lc_pasword As String
lo_serv=Createobject("mssoap.soapclient30") && Creamos Objeto Soap
lo_serv.mssoapinit("http://www.universalthread.com/WebService/universalthread.wsdl") 
**Solicitud del usuario y password requerido por el servicio Web
lc_user=''
lc_user = Inputbox("Usuario","Usuario de universalthread ")
lc_pasword=''
lc_pasword = Inputbox("Password","Password para "+lc_user)
If Empty(lc_user) Or Empty(lc_pasword)
 =Messagebox('Debe introducir Usuario y Password para acceder al sistema',16)
 Return .F.
Endif
** Autentificamos en www.universalthread.com
If !lo_serv.Login(lc_user,lc_pasword)
 =Messagebox('No se pudo autentificar su usuario en universalthread.com.',16)
 Return .F.
Endif
Thisform.pageframe1.page1.grid1.Visible=.F.
Thisform.pageframe1.page1.grid2.Visible=.F.

Observe que:

a. Creamos un objeto SOAP e inicializamos nuestro Servicio Web
b. Solicitamos el usuario y password requerido y luego autentificamos nuestro usuario en Universal Thread.

4. En el método Click de Commandbutton del Page1, escribimos nuestro código de llamada al método del Servicio Web que nos envía la Lista de Artículos disponibles en formato XML.
Local lc_xml As String
lc_xml=''
**Invocamos el método del web service que no devuelve la 
**lista de artículos de los ultimos 45 ías
lc_xml=lo_serv.GetArticle(Date()-45,Date(),5)
**Mostramos el XLM devuelto
=Messagebox(lc_xml,64)
If !Empty(lc_xml)
    ** Convertimos el XML devuelto en un cursor temporal
 Xmltocursor(lc_xml,'Carticulo')
 ** Seleccionamos nuestro cursor y lo mostramos en el Grid
 Select Carticulo
 Goto Top In Carticulo
 If !Eof('Carticulo')
  Thisform.pageframe1.page1.grid1.RecordSource='Carticulo'
  Thisform.pageframe1.page1.grid1.Visible= .T.
  Thisform.pageframe1.page1.grid1.Refresh()
 Endif
Endif

Observe que:
a. Invocamos al Servicio Web, solicitando la Lista de los Artículos.
b. Mostramos el XML devuelto por el Servicio Web, usted puede eliminar este código, dicho código fue colocado como demostración del XML devuelto.
c. Convertimos el XML en un Cursor temporal y lo mostramos en el Grid.

5. En el método Click de Commandbutton del Page2, escribimos nuestro código de llamada al método del Servicio Web que nos envía la Lista de Archivos disponibles para Downloads en formato XML.
Local lc_xml As String
lc_xml=''
**Invocamos el método del web service que no devuelve la 
**Lista de Archivos disponibles para Downloads de los últimos 20 días
lc_xml=lo_serv.GetDownload(DATE()-20,DATE(),5)      
**Mostramos el XLM devuelto
=Messagebox(lc_xml,64)
If !Empty(lc_xml)
    ** Convertimos el XML devuelto en un cursor temporal
 Xmltocursor(lc_xml,'CDownload')
 ** Seleccionamos nuestro cursor y lo mostramos en el Grid
 Select CDownload
 Goto Top In CDownload
 If !Eof('CDownload')
  Thisform.pageframe1.page2.grid1.RecordSource='CDownload'
  Thisform.pageframe1.page2.grid1.Visible= .T.
  Thisform.pageframe1.page2.grid1.Refresh()
 Endif
Endif

Observe que:
a. Invocamos al Servicio Web, solicitando la Lista de los Artículos.
b. Mostramos el XML devuelto por el Servicio Web, usted puede eliminar este código, dicho código fue colocado como demostración del XML devuelto.
c. Convertimos el XML en un Cursor temporal y lo mostramos en el Grid.

Ejecutando nuestra Aplicación

Al ejecutar nuestro formulario y autentificar con Universal Thread, ya podemos acceder a los métodos de programados en nuestro formulario. Al pulsar clic en cualquiera de los dos commandbutton obtendremos:

a. XML de la información solicitada al Servicio Web.


b. Con la función Xmltocursor() obtenemos un cursor con los datos del XML enviado por el Servicio Web.


Conclusiones:

Los servicios Web son una excelente opción para la integración de aplicaciones y agregarle funcionabilidad adicional a nuestras aplicaciones.


José G. Samper C., Caracas, Venezuela, es Analista Programador,Microsoft Most Valuable Profesional en Visual Fox Pro. Dedicado al desarrollo de sistemas desde el año 1991; siempre en Fox o en Visual Fox Pro. Actualmente especializándose en C# y Jefe de Proyectos Especiales en Softech Consultores, C.A.