He tenido que hacer algo de búsqueda por internet para conseguir crear una función que devuelva el color de un pixel cualquiera de la pantalla en VB.NET y aquí comparto mis hallazgos.

Lo cierto es que con VB.NET se puede hacer cualquir cosa que se nos ocurra, sobretodo utilizando funciones de la API de Windows.

En el caso que nos ocupa, debemos declarar las cabeceras de tres funciones de las bibliotecas (librerías) gdi32.dll y user32.dll de la siguiente manera:

Private Declare Function GetPixel Lib 'gdi32.dll' (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer) As Integer
Private Declare Function GetWindowDC Lib 'user32.dll' (ByVal hwnd As Integer) As Integer
Private Declare Function GetDesktopWindow Lib 'user32.dll' () As Integer

Posteriormente debemos desarrollar la función PixelColor, a la que pasaremos dos variables con las coordenadas de pantalla X e Y del punto cuyo color queramos obtener (alternativamente se le podría pasar una sola variable de tipo POINT). La función devuelve un valor de tipo COLOR que podemos utilizar donde queramos:

Public Shared Function PixelColor(ByVal x As Integer, ByVal y As Integer) As Color
Dim winDc = GetWindowDC(API.GetDesktopWindow)
Dim color = GetPixel(winDc, x, y).ToString
PixelColor = System.Drawing.ColorTranslator.FromOle(color)
End Function

Como se puede apreciar, podemos obtener el color de cualquier pixel de la pantalla, no solamente de dentro de nuestro formulario o aplicación, con lo que esta función puede resultar muy útil en varios contextos. ¿Se os ocurren aplicaciones?

Si trabajamos con ASP .Net probablemente desarrollemos en una máquina que no sea la que finalmente aloje el sitio web.

Pues bien, a la hora de pasar el proyecto de nuestro equipo de desarrollo al servidor, es posible que nos planteemos qué archivos debemos coger y de cuáles podemos prescindir.

El siguiente proceso nos ayuda a separar lo indispensable de la paja y está estructurado en 7 pasos:

1. Lo primero es crear una carpeta en el wwwroot de nuestro equipo de desarrollo que alojará los archivos necesarios para hacer el ‘deployment’ o la publicación de nuestro sitio. Será necesario que mediante el IIS configuremos esa carpeta como aplicación.

2. En el IDE de Visual Studio, en el menú superior al lado del botón Start hay una lista desplegable que muestra el hint Solution Configurations. Durante el desarrollo, el valor ‘Debug’ es el que está seleccionado, pero ahora nos interesa cambiarlo a
‘Release’.

3. Editamos el archivo Web.config y en el tag compilation cambiamos el valor del atributo debug de ‘True’ a ‘False’. Quedará algo así:

&lt,compilation defaultLanguage=’vb’ debug=’false’ /&gt,

4. Compilamos a través del menú Build – Build Solution o pulsando Ctrol+Shift+B.

5. Tras construir la aplicación, debemos copiarla a la carpeta que hemos creado en el wwwroot. Lo hacemos a través del menú Project – Copy Project y en Destination project folder indicamos la ruta de la nueva carpeta. En las opciones de copia, seleccionamos ‘Only files needed to run this application’ con lo que descartaremos lo que no sea imprescindible.

6. Una vez finalizado el proceso, tenemos que copiar manualmente de la carpeta origen todas aquellas carpetas que no se crean automáticamente, como por ejemplo si hemos incluido una para almacenar las imágenes del sitio web.

7. Pasamos todos los archivos de la nueva carpeta al servidor web y sólo nos restará un último paso: editar de nuevo el Web.Config para modificar el valor de la ConnectionString, en la que debemos especificar el nombre de la nueva máquina en sustitución de la de desarrollo.

Pues eso es todo, de este modo optimizamos nuestra aplicación web y sólo colgamos en el servidor lo que es estrictamente necesario.

Por motivos de trabajo he tenido que volver a trabajar con mi amigo PL/SQL, con quien pasé buenos momentos en la uni… y algunos no tan buenos.

En muchos lenguajes de programación es habitual encontrar una función SPLIT (o similar) que sirve para obtener en un array o una tabla cada uno de los elementos de una cadena de texto separados por un caracter delimitador.

Sin embargo, lograr esto en SQL no es nada fácil, por mucho que sea PL. El caso es que me he visto en la obligación de realizar esta operación con un campo de una base de datos ORACLE y la búsqueda de información ha sido algo durilla, así que he pensado en explicar aquí la manera de hacerlo por si a alguien le es de utilidad.

Después de encontrar varias soluciones chapucerillas, la mayoría de las cuales hacían uso de una u otra manera de la función Substr (incluida en PLQSL), en varios foros se habla de una función “user-made” que es muy sencilla de entender y de personalizar. Es esta:

CREATE OR REPLACE FUNCTION split
(
p_list varchar2,
p_del varchar2 := ','
) RETURN split_tbl pipelined
IS
l_idx pls_integer,
l_list varchar2(32767) := p_list,
AA
l_value  varchar2(32767),
BEGIN
loop                
l_idx := instr(l_list,p_del),               
IF l_idx > 0 THEN                   
pipe ROW(substr(l_list,1,l_idx-1)),                      
l_list := substr(l_list,l_idx+LENGTH(p_del)),              
ELSE
pipe ROW(l_list),
exit,
END IF,
END loop,
RETURN,
END split,

La función SPLIT recibe dos parámetros: p_list con la cadena de texto y p_del con el carácter delimitador que servirá para separar un elemento de otro. Mediante el uso de la función Substr y tuberías consigue separar cada elemento en una fila o registro de una tabla.

Por ello, el tipo de dato que devuelve la función se llama split_tbl y hay que definirlo antes como una tabla de varchars de la máxima longitud posible:

CREATE OR REPLACE TYPE split_tbl AS TABLE OF varchar2(32767),

Una vez hecho esto, el código funcionará perfectamente. La tabla resultante de la función dispondrá de un único campo llamado COLUMN_VALUE (por si hace falta usarlo en alguna otra parte) con los valores buscados en la cadena.

Con la función Split creada, podemos hacer consultas como esta:

SELECT * FROM TABLE(split(´one,two,three´)),

cuyo resultado será una tabla de un sólo campo con tres registros:

one
two
three

Por supuesto se puede moficar para adaptarse a las necesidades de cada uno. En mi caso, la convertí en un procedimiento que en vez de devolver la tabla, inserta los valores uno a uno en una tabla temporal, para así disponer de ella ‘físicamente’. Las posibilidades son infinitas.

Todos los que programamos en Delphi estamos más que acostumbrados a usar componentes Grid o DBGrid. Son muy útiles para presentar información de una base de datos en formato tabular.

Lo que pasa es que si queremos dotar al grid de algo más de atractivo visual o de alguna funcionalidad extra, los componentes que incluye Delphi no aportan mucho. Siempre se puede tocar el Canvas para añadir mejoras visuales, pero tampoco se pueden hacer maravillas.

Para lograr algo más impactante, seguramente deberemos recurrir a componentes Grid externos que presenten mejoras significativas. El problema es elegir el adecuado de entre los cientos que se pueden encontrar, sin olvidarnos de que muchos de ellos (habitualmente los mejores) son de pago, no muy caros, pero de pago.

En una de estas búsquedas de componentes grid, encontré algunos que no estaban mal y me gustaría mencionar de forma especial el DbAltGrid de Quasidata.

Lo mejor de este componente es, sin duda, que se puede trabajar con múltiples líneas por celda en cada registro, en vez del clásico línea por registro. Es decir, una celda puede contener la información de varios campos distribuida en líneas (bandas) diferentes. Enlazo una imagen, para ver gráficamente de qué estoy hablando.

Por lo demás, se pueden establecer jerarquías entre los campos (tipo árbol), editar los colores de las celdas y las fuentes de manera sencilla, añadir cualquier gráfico a través de las propiedades, incluso en las cabeceras, mostrar pies de columna, poner hints (banderitas amarillas informativas) a cada celda, ordenar por columna con un simple click, alternar los colores de los registros de modo automático y muchas más cosas…

La documentación incluida en el paquete junto con el foro existente en la web son bastante útiles y permiten aprender a utilizar el grid rápidamente. ¿El precio? Bueno, es verdad que el componente sin restricciones cuesta unos 120 euros, PERO se puede descargar gratuitamente y la versión de evaluación tiene todas las funcionalidades. La única diferencia con la versión completa es la ausencia de las líneas separadoras de celda en los títulos. Sólo esa tontería que, la verdad, depende del diseño que le demos, ni se nota.

30 años con Pascal

25 de octubre de 2004 Programación

El pasado viernes 22 de octubre tuvo lugar el Pascal Symposium para celebrar el 30 aniversario del lenguaje de programación Pascal.

Sin duda, Pascal ha tenido una gran influencia en el mundo de la programación y ha sido la base de muchos de los que ahora nos dedicamos a esto. Mi primera toma de contacto con la programación fue con Basic, pero se puede decir que aprendí a programar en serio con Pascal. Aún recuerdo aquellas ‘librerías’ gráficas que hacían virguerías cuando aún trabajábamos en DOS.

Me ha sorprendido gratamente el comprobar que en muchas universidades se sigue utilizando Pascal para enseñar a programar, aunque en otras ya se usa directamente C o simplemente pseudocódigo.

En cualquier caso, no se puede decir que el uso de Pascal se limite únicamente a la docencia. Si bien es cierto que la cosa ha cambiado mucho, Borland se encargó de perpetrar el uso de su lenguaje estrella con la evolución a Object Pascal, que sirve de base a todas las versiones de Delphi.

Y es que Delphi es el gran sucesor de Turbo Pascal. Por supuesto, difiere mucho de aquello con lo que aprendimos, pues se trata de una herramienta RAD de programación visual que además cumple con todos los requisitos de la programación orientada a objetos. No obstante el lenguaje empleado sigue siendo nuestro entrañable Pascal.

Quizá Delphi no disfruta de la popularidad de otros como Visual Basic. No obstante, no cabe duda de que en los últimos años ha sido una referencia y la mayoría coincide en que, por muchas razones, es superior a la herramienta de Microsoft y a otras similares como PowerBuilder o CBuilder. Incluso existe una versión para Linux, llamada Kylix que, aunque no ha calado demasiado, viene a demostrar que Borland no va a dejar morir a su mejor creación.

Ahora con .NET las cosas han cambiado bastante. Microsoft ha dado un gran golpe de efecto y la nueva filosofía se impone. Esto, en principio, ha dado gran ventaja a la corporación de Bill Gates, pero Delphi no se ha quedado atrás.

Para programar en .NET se pueden usar diferentes lenguajes, como Visual Basic o el potentísimo C# (cuyo proceso de desarrollo fue liderado por el creador de Delphi). En la actualidad, Delphi 8 ya puede ser utilizado para compilar en .NET y la próxima solución de Borland, Delphi 2005, incluirá los lenguajes Object Pascal y C# para generar aplicaciones en .NET y WIN32. La competencia sigue ahí.

Creo que debo cambiar mi Delphi 6.