JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Como incluir cambios de línea en los Tooltips

Hoy como es huelga general en España, un truco rapidito para que no nos tachen de esquiroles :-P Los Tooltips son esas etiquetas flotantes que aparecen cuando dejas el cursor del ratón unos instantes parado encima de algún control de tu aplicación, y que normalmente te dan información contextual interesante sobre el mismo: Son muy útiles en las aplicaciones Windows Forms, pero ¿Cómo podemos hacer para que un Tooltip se muestre como el de la figura anterior, es decir, en varias líneas? Lo primero que cabría pensar es que podríamos poner un “\n” como se hace en las constantes de cadena de C#, así: NotifyIcon1.Text = “DOTNET4\nInternet access”; Pero no funciona y veríamos realmente ese “\n” en el texto. La solución es concatenarle en cada cambio de línea la constante: Environment.NewLine con lo que quedaría algo así: NotifyIcon1.Text = “DOTNET4” + Environment.NewLine + “Internet access”; ¡Listo! Con esto conseguirás Tooltips como los de la figura superior, mucho más cómodo... [Más]

La mejor forma de aprender a programar

No nos andemos con rodeos: la mejor forma de aprender a programar es programando. Es más, yo diría que es la única forma de aprender de verdad a hacerlo. Esto puede parecer una perogrullada, algo obvio. Sin embargo no lo es tanto si examinamos detenidamente de qué manera aprende programación un porcentaje muy elevado de personas. Muchos aspirantes a aprender un lenguaje de programación, tecnología o entorno nuevos lo que hacen es recibir clase en un aula. Que quede claro que estoy hablando todo el tiempo de gente con poca o nula experiencia real en la tecnología concreta que está intentando aprender. Ir a un centro a formarnos -o que los docentes vengan a nuestra empresa- tiene la principal ventaja de ser muy cómodo para el que se forma. En un tiempo reducido se reciben de manera condensada muchos conocimientos. Esto puede estar bien y ser lo más adecuado si ya tenemos mucha experiencia y queremos aprender rápidamente los fundamentos de una tecnología “para saber por dónde pisamos... [Más]

OrderedDictionary vs Dictionary

Hoy, en el curso de preparación del examen 70-536, ha surgido la siguiente duda: “¿OrderedDictionary sólo se diferencia respecto a Dictionary, en qué se puede tener acceso además de por clave también por índice, o existe alguna otra diferencia mayor?” La verdad es que OrderedDictionary es un mal nombre para los programadores de habla hispana, porque hay la tendencia a pensar que ordena los elementos, cuando en realidad se refiere a que los guarda por el orden en que se han introducido con el método Add.  Un diccionario que ordene sus elementos es un SortedDictionary de tipo genérico. Así, si escribimos un código similar a este:using System; using System.Collections; using System.Collections.Specialized; public class Prueba { public static void Main() { OrderedDictionary od = new OrderedDictionary(); od.Add("05", "Cinco"); od.Add("02", "Dos"); od.Add("03", "Tres"); od.Add("04", "Cuatro"); od.Add("01", "Uno"); Console.WriteLine("Iterar como... [Más]

Videojuegos 3D renderizados en la nube

Hace alrededor de año y medio escribía en este mismo blog acerca de “una idea loca” sobre la que había leído. Se trataba de la posibilidad de crear super-computadores gráficos albergados en la nube de forma que sirvieran gráficos 3D renderizados en tiempo real (y ahí está lo impresionante) a dispositivos que no tienen la capacidad suficiente. Un ejemplo: teléfonos móviles o aparatos semi-tontos enchufados a una televisión normal. La idea es que el terminal simplemente envía a los servidores las pulsaciones de teclado o pantalla, los servidores gráficos renderizan en tiempo real los gráficos resultantes de esas interacciones, y el terminal se limita a visualizar dichas imágenes. El resto del tiempo se repite este bucle. A mi personalmente me parece increíble conseguir esto con la tecnología actual, y sobre todo con las redes actuales (y por lo que parece peor aún con las futuras), ya que estamos hablando de imágenes de alta calidad y movimientos a 30 o 50 frames por segundo. En el post... [Más]

Usando foreach con un diccionario genérico

Lo habitual cuando tenemos una colección o un enumerable de cualquier tipo es recorrer sus elementos usando un bucle de tipo foreach. Sin embargo, cuando usamos una colección genérica de tipo System.Collections.Generic.IDictionary, como por ejemplo Dictionary<TKey,TValue> o SortedList<TKey,TValue>, (que son super-útiles en muchos casos) nos encontraremos con dificultades. Si intentamos hacer algo como esto:Dictionary dict = new Dictionary(); dict.Add("Uno", 1); dict.Add("Dos", 2); dict.Add("Tres", 3); foreach(int numero in dict) { Console.WriteLine(numero); } Descubriremos que obtenemos un error como este otro: Cannot convert type 'System.Collections.Generic.KeyValuePair<string,int>' to 'int' En el ejemplo anterior definimos un diccionario genérico que va a llevar laves de tipo texto y que usaremos para almacenar números enteros. El problema es que esta no es la forma correcta de iterar por colecciones genéricas que tengan pares de clave/valor. L... [Más]

Archivos temporales de compilación de ASP.NET

Esta pregunta ha surgido hoy en uno de mis cursos de desarrollo Web y me ha parecido interesante para comentarla aquí. Como es sabido ASP.NET Web Forms hace uso de una serie de archivos de código auto-generados para “mezclar” su código con las clases “code-beside” que contienen los eventos y el código que escribimos para los formularios Web, por medio del uso de clases parciales y herencia. Nota: Por ejemplo, en la página Default.aspx, su archivo “code-beside” sería Default.aspx.cs o Default.aspx.vb en función de si programamos en C# o VB Este código se genera dinámicamente al compilar el sitio Web y, en teoría, se almacena para hacer caché en la carpeta: C:\Windows\Microsoft.NET\Framework\vx.y.zzzz\Temporary ASP.NET Files siendo x.y.zzzz la versión de la plataforma que tengamos instalada, que en caso de .NET 4.0 es “v4.0.30319” y en las demás versiones anteriores (2.0, 3.0 y 3.5) es “v2.0.50727” (ya he dicho muchas veces que las versiones 2.0, 3.0 y 3.5 son lo mismo a efectos... [Más]

Resolver el error “No se puede encontrar el tipo” al cargar un formulario con un control propio

Yo no programo demasiado para Windows Forms, ya sabéis que lo mío es más la Web. Pero últimamente estoy trabajando a los ratos en un proyecto que tienen una parte de visualización para escritorio hecha con esta tecnología. Como soy partidario de reutilizar al máximo, siempre encapsulo la funcionalidad todo lo que puedo, incluyendo funcionalidad de la interfaz de usuario. Por eso en este trabajo, tengo varios controles de usuario listos para arrastrar y soltar en cualquier formulario que los requiera. El caso es que tras haber trasteado bastante con la interfaz, de repente algunos formularios me empezaron a fallar, mostrándome un error como el de la figura (yo trabajo con todo en inglés, incluidos los nombres de clases  y variables):  (la parte difusa lleva el nombre del control que no se carga y su espacio de nombres) A pesar de que en el código del diseñador del formulario todo parecía estar bien y se reconoce el tipo del control y a pesar de que si ejecutas la aplicación... [Más]