weblog de David P. Toscano sobre tecnología y programación
30/11/2005
Obtener el color de un pixel con Visual Basic .NET
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?
31/03/2005
Publicar un proyecto web en Visual Studio .Net
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í:
<compilation defaultLanguage="vb" debug="false" />
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.
21/12/2004
Función Split en PL/SQL para cadenas de texto
Por motivos de trabajo he tenido que volver a trabajar con mi amigo PL/SQL, con quién 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 carácter 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.
15/11/2004
Componente DbAltGrid para Delphi
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.
25/10/2004
30 años con Pascal
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.
17/05/2004
Stratos: comunidad de desarrollo de juegos en español
Todos los programadores nos hemos sentido atraidos en alguna ocasión por el desarrollo de videojuegos. En muchos casos, es una vocación frustrada, ya que es difícil abrirse paso en ese hermético mundo.
Antiguamente, en los tiempos del Spectrum y compañía, no era tan extraño que un programador en su casa creara un juego que llegara a triunfar comercialmente. Hoy día tal hazaña es poco menos que imposible.
No obstante, la aventura de programar un videjuego, aunque sólo sea por hobby y sin grandes pretensiones, es una actividad enriquecedora a nivel de conocimientos y experiencia, además de divertida.
Un buen lugar para empezar (o profundizar) es
Stratos, una comunidad hispana que pretende ser un punto de encuentro para desarrolladores de juegos y multimedia (profesionales y aficionados).
Allí encontraremos cantidad de recursos interesantes, desde
tutoriales hasta
galerías gráficas, pasando por
proyectos colectivos en los que colaborar.
Sin duda una de las secciones más atractivas del sitio web es la de
ofertas de trabajo. En ella podremos acceder al mundo laboral del videojuego. Algunas ofertas son como freelance para empresas o autónomos que desarrollan jueguecillos multimedia, pero también podemos encontrar ofertas para trabajar en gigantes del sector.
Sin ir más lejos, ahora hay un par de ofertas de
Electronic Arts España, una para trabajar como gametester (petador de juegos, hablando claro) y otra para trabajar de programador en los meses de verano, con posibilidad de incorporarse a la plantilla de Madrid indefinidamente. No está de más echarle un vistazo, quién sabe si encontraremos el trabajo soñado...
22/04/2004
Concurso de programación web con ASP.NET
Siguiendo con el tema de los concursos de programación, he descubierto por casualidad que
Microsoft organiza un
concurso basado en la creación de un sitio web desarrollado con tecnología ASP.NET.
El certamen tiene lugar del 1 de abril al 15 de junio de 2004, período durante el cuál se ofrecerá alojamiento gratuito a los sitios web participantes. Estos deben encajar en una de las seis categorías planteadas (Comercio electrónico, Portal, Comunidad, Informes, Control de tiempos y Categoría libre).
Los requisitos mínimos y otras especificaciones se detallan en las
bases del concurso, que incluye premios como consolas y juegos Xbox, mandos para ver DVDs en la consola, películas en DVD, cajas de Visual Studio .NET, alojamiento gratuito ASP.NET durante un año y suscripciones a revistas patrocinadoras durante un año.
Si alguien se anima que lo comente. Además, sólo por participar te regalan dos entradas para el cine.
13/04/2004
Concurso de programación en Delphi
Desde
DelphiHeaven se convoca la II edición del concurso DH de programación en Delphi.
Se trata de desarrollar programitas sencillos sin componentes externos, de los cuales se valorará su originalidad, practicidad, sencillez de uso y otros factores como la velocidad y la ausencia de bugs.
La primera edición contó con 16 participantes con programas de mucha calidad y se espera superar esa cantidad en esta ocasión.
La fecha límite para presentar los programas es el 30 de junio de este 2004. No os olvidéis de consultar las
bases del concurso en el sitio web de
DelphiHeaven.
Bases del concursoWeb oficial del concursoSitio web de DelphiHeavenPor cierto, el premio para los tres mejores es el libro
Programación con Delphi 7 y Kylix 3, de Francisco Charte, el patrocinador del concurso.