JASoft.org

Cómo crear una ventana que ocupe toda la pantalla

Cómo crear una ventana que ocupe toda la pantalla
Bueno, parece una pregunta tonta, pero no lo es tanto si queremos que además de ocupar el área disponible del escritorio también cubra la barra de tareas y las bandas del escritorio que hubiese establecidas. Para que una ventana Windows Forms ocupe toda la pantalla incluyendo la barra de tareas hay que darle el tamaño adecuado y además asegurarnos de que no está maximizada. El siguiente código ilustra lo que se necesita para instanciar un formulario así: MiForm frm = new MiForm();frm.FormBorderStyle = FormBorderStyle.FixedSingle;Rectangle formrect = Screen.GetBounds(frm);frm.Location = formrect.Location;frm.Size = formrect.Size;frm.WindowState = FormWindowState.Normal;Application.Run(frm); Esto es, por ejemplo, lo que hacen las pantallas de los programas de instalación. ¿Has probado a maximizar la ventana de fondo (azul normalmente) de un programa de instalación? Pues al hacerlo de repente ya no es capaz de cubrir la barra de tareas. Es conveniente a este tipo de ventanas quitarle... [Más]

Siguiendo con las consultas peliagudas...

Siguiendo con las consultas peliagudas...
Otra consulta que puede resultar de interés es aquella que nos permite identificar dentro de los registros de una tabla cuáles son los que están duplicados y así poder, por ejemplo, eliminarlos o cambiarlos. ¿Alguna idea de cómo conseguir esto?.... Piénsalo un poco más... ;-) Solución: SELECT nombre_campo, COUNT(*) FROM Nombre_Tabla GROUP BY Nombre_Campo HAVING COUNT(*) > 1 Esta vale para cualquier gestor de datos y permite obtener los resultados agrupados por el campo que queramos para localizarlos más fácil.

Consulta para escoger aleatoriamente registros de una tabla

Consulta para escoger aleatoriamente registros de una tabla
El otro día seme planteó el siguiente problema: ¿cómo puedo hacer para obtener con una consulta SQL un número 'N' de registros elegidos aleatoriamente dentro de una tabla con miles de registros? En SQL Server hay, por lo menos, dos formas de hacerlo. - Consulta 1: la complicada SELECT TOP N * FROM Nombre_Tabla ORDER BY RAND( (@@IDLE % IDENTITYCOL ) + DATEPART( ms , CURRENT_TIMESTAMP )  + IDENTITYCOL) De este modo se devuelven N identificadores de la tabla elegidos aleatoriamente. Lo que hace es coger un valor aleatorio en cada "vuelta" para un valor autonumérico que actúa como clave primaria de la tabla. Esto no es problema casi nunca ya que la mayor parte de las tablas suelen poseer un campo de este tipo. Sin embargo... - Consulta 2: más sencilla y genérica SELECT TOP N * FROM Nombre_Tabla ORDER BY NewID() Este método como se ve no presupone nada y sirve incluso para tablas sin clave primaria y para consultas cruzadas con otras tablas. Interesante ¿verdad?

Algunas sutilezas sobre paso de parámetros por referencia y por valor en C#

Algunas sutilezas sobre paso de parámetros por referencia y por valor en C#
Cuando se pasa una clase como parámetro a cualquier método de C# ésta se pasa siempre por refencia. Y a continuación paso a explicar esta "obviedad"... Las clases son tipos por referencia por lo que cuando se pasan como parámetro a un método, cualquier cambio que se realice sobre ellas desde dentro del método (asignar una propiedad o cualquier otra cosa que cambie su estado), se conserva al terminar la llamada al método. Sin embargo existe una palabra clave en el lenguaje llamada ref que sirve para pasar parámetros por referencia. ¿cuál es su objeto entonces si las clases se pasan por referencia siempre? Su objeto es pasar por referencia los llamados "tipos por valor". Tipos por valor son las estructuras y los tipos básicos (int, bool, etc...). Éstos, salvo que se indique explícitamente, siempre se pasan por valor, es decir, se pasa una copia de los mismos a la pila para su procesamiento. Consideremos el siguiente ejemplo: class Persona{    public string Nombre = "Original";} .... [Más]

J-Integra for .NET: el puente entre dos mundos

J-Integra for .NET: el puente entre dos mundos
La empresa Intrinsyc, especialista en soluciones de interoperabilidad, ha presentado la nueva versión de su producto J-Integra for .NET. J-Integra for .NET Se trata de una tecnología que permite tender puentes entre los desarrollos de nuestra empresa escritos en Java y los realizados con .NET. Al contrario que otros productos de esta índole, no se limita a habilitar las comunicaciones entre aplicaciones basadas en estas tecnologías (cosa relativamente fácil de conseguir hoy en día gracias a los Servicios Web), sino que realmente permite reutilizar los componentes de ambas indistintamente. Así nuestras bibliotecas escritas en Java se pueden utilizar directamente desde código escrito para la plataforma .NET (C#, VB.NET, etc...) como si fueran componentes nativos para esta tecnología e incluso desde Visual Studio. Al revés la afirmación es también cierta ya que permite usar cualquier componente .NET desde código Java como si se tratase de componentes nativos de este lenguaje ... [Más]

Cómo impedir que una aplicación se ejecute más de una vez

Cómo impedir que una aplicación se ejecute más de una vez
La mejor manera de conseguir que sólo pueda existir una copia de una determinada aplicación ejecutándose en cada instante en un equipo es mediante el uso de Mutexes. Los Mutexes son objetos del sistema operativo pensados para sincronizar procesos y subprocesos. La siguiente función permite averiguar mediante el uso de un Mutex si la aplicación se está ejecutando o no: public bool EnEjecucion(){   Mutex miMutex = new Mutex(false, "NombreÚnicoDeMiAplicación");   return = !miMutex.WaitOne(0, false);} Su funcionamiento se basa en establecer un Mutex con un nombre único y dependiente de nuestra aplicación, y posteriormente en la segunda línea, solicitar su propiedad con la función WaitOne. Este método devuelve true si el proceso se ha apoderado con éxito de él y false si no es así. Dado que la primera instancia de la aplicación se apodera de él ya no está disponible para las siguientes hasta que ésta primera termine, por lo que las siguientes obtendrán un false al usar WaitOne. Sencil... [Más]

Una diferencia importante entre los Bucles 'for' en C# y VB.NET

Una diferencia importante entre los Bucles 'for' en C# y VB.NET
Consideremos el sigueinte bucle 'for' escrito en C#: int n = 10;   for (int i=0; i < n; i++)  {   Console.WriteLine(i.ToString());   n--;  } Muy sencillo. La pregunta es: dado que dentro del bucle modificamos el valor de la variable "límite" (n), ¿cuántas veces se ejecutará? ¿10 o 5? Parece una pregunta tonta pero no lo es tanto. Depende de cómo se haya implementado internamente el bucle en el compilador de C#. Es posible que se ejecute 10 veces si el bucle almacena el valor al principio y en cada vuelta compara con este valor incial (esto puede ser más eficiente en muchos casos). Por otra parte si se compara el valor real en cada vuelta en realidad el bucle se ejecutará sólo 5 veces. La respuesta a la pregunta es la siguiente: en C# el valor real se compara en cada vuelta por lo que el bucle se ejecutará sólo 5 veces. Si por el contrario consideramos el mismo bucle escrito en VB.NET (o, para el caso VB Clásico o VBScript): Dim n As Integer = 10  Dim i As Integer  For i = ... [Más]

Transferencia de información entre páginas llamadas en secuencia

Transferencia de información entre páginas llamadas en secuencia
Un problema que se plantea muchas veces a los programadores de ASP.NET y que, normalmente, les cuesta solucionar es el siguente: Disponemos de una página que realiza determinadas consultas a una base de datos o recopila un volumen relativamente grande de información en su código. Tras procesarla (o en un PostBack) debemos llamar a otra página ASPX que debe utilizar la misma información costosa de obtener. ¿Qué hacemos? Existen muchas posibles soluciones, sólo que la mayoría no nos sirven de mucho o presentan muchos problemas. Entre otras tenemos las siguientes, que seguramente serían las que intentaría un programador de ASP clásico: Hacemos que la segunda página vuelva a recuperar los mismos datos. En fin, no arreglamos nada así. Metemos la información en un campo oculto de un formulario y lo enviamos por POST a la siguiente página. Esto es aún peor. Tiene un costo alto de ancho de banda y velocidad de descarga, es muy propenso a errores y problemas de seguridad y no es adecuad... [Más]

Diferencias al usar Clases y Estructuras en matrices

Diferencias al usar Clases y Estructuras en matrices
No voy a entrar aquí a explicar las diferencias "de bulto" entre clases y estructuras en .NET. Todo programador de la plataforma debería conocerlas pues es lo primero que se aprende. Sin embargo sí me gustaría resaltar una cuestión simple consecuencia de sus diferencias y que a muchos les puede pasar inadvertida. Se trata del comportamiento obtenido al instanciar una matriz. Imaginemos que tenemos una sencilla estructura como esta: struct Usuario{   public string Nombre;   public string Apellidos;} Si creamos una matriz de estructuras de este tipo así: Usuario[] usuarios = new Usuario[10]; podremos inmediatamente asignar valores a cada elemento de la matriz, ya que la estrucutra al ser un tipo por valor está disponible para que la usemos: usuarios[0].Nombre = "Pepe"; //No fallará Sin embargo si cambiamos la definición de Usuario conviertiéndola en una clase: class Usuario{   public string Nombre;   public string Apellidos;} El código de asignación anterior fallará deb... [Más]

Kit de desarrollo gratuito para TabletPC

Kit de desarrollo gratuito para TabletPC
El SDK para TabletPC que proporciona Microsoft está muy bien y comenzar a desarrollar aplicaciones con él no es complicado. Sin embargo hay ciertas cosas que no son tan fáciles de hacer como debería ser. Por ejemplo, si tienes un TabletPC o has jugado con alguno conocerás y amarás la aplicación Journal (o si tienes Office pues entonces OneNote). Intenta meter toda la funcionalidad de Journal en una de tus aplicaciones. Te reto ;-) La cosa ya no es tan fácil ¿verdad? Pues para ponértelo liso y llano la empresa Agilix ofrece su producto InfiNotes para Visual Studio. Lo que hace es incluir unos espectaculares controles que sólo con arrastraR y soltar ofrecen todo tipo de impresionantes características para hacer aplicaciones para TabletPC. Hacer una réplica de Journal es casi inmediato. El producto tiene dos versiones, la Standard y la Professional. La Standard es gratuita y la puedes descargar desde su página inmediatamente. En realidad la paga Microsoft para facilitarte que crees ... [Más]

Este soy yo y este es mi blog técnico, dedicado al software y a la programación.

¡Sígueme en Twitter!

Mis otros blogs

- JM Alarcón @ campusMVP.es
Contenido técnico en español orientado a desarrolladores
- JMAlarcon.es
Blog personal no técnico: sociedad, innovación, empresa...

Krasis

- campusMVP.es:
Los mejores cursos online de programación en español

- SELF LMS:
La plataforma de elearning más potente del mercado.

Histórico