RSS 2.0 Atom 1.0 CDF  
JASoft.org - March, 2005
El blog de José Manuel Alarcón Aguín. Programación .NET y mucho más...
 

Obtener la resolución actual de la pantalla es algo inmediato si utilizamos el objeto System.screen, ya que su propiedad Bounds nos indica este dato en sus propiedades Width y Height:

screen.Bounds.Width
screen.Bounds.Height

Realmente sencillo. Lo que ya es harina de otro costal es hacer que mediante código se cambie la resolución actual de la pantalla. La plataforma .NET no ofrece soporte para esta operación desde ninguna de sus clases pero, como siempre, la API de Windows viene a nuestro rescate. Se trata de un viejo truco de los tiempos de Visual Basic.

Necesitamos utilizar las dos funciones siguientes de la biblioteca User32.dll:

· EnumDisplaySettings:

Ofrece toda la información necesaria sobre las pantallas disponibles en el sistema (puede haber más de una, claro, yo de hecho trabajo con una tarjeta dual que tiene dos monitores enchufados). Su definición es la siguiente (copiada de MSDN):

BOOL EnumDisplaySettings(
  LPCTSTR lpszDeviceName,  // display device
  DWORD iModeNum,          // graphics mode
  LPDEVMODE lpDevMode      // graphics mode settings
);
El primer parámetro es el dispositivo sobre el que queremos obtener información. Si se pasa un nulo trabajará con el que contiene a la ventana que se está ejecutando. El segundo parámetro se usa para seleccionar el modo gráfico del cual se quiere obtener información y el último recoge dicha información en una estructura de tipo LPDEVMODE.
Explicar todos estos parámetros y los de la estructura se sale del ámbito de un post como este y además vienen bien explicados en la documentación de la API, a la cual te remito para profundizar.

· ChangeDisplaySettings:

Esta función cambia los ajustes de la pantalla por defecto utilizando los parámetros que le proporcionemos. Existe una función ampliada idéntica, ChangeDisplaySettingsEx, que permite cambiar los de cualquier pantalla, pero a los efectos de este post me centraré en la más sencilla. Su definición es la siguiente:

LONG ChangeDisplaySettings(
  LPDEVMODE
lpDevMode// graphics mode
  DWORD dwflags         // graphics mode options
);

El primer parámetro es una estructura de tipo LPDEVMODE igual que la de la función anterior. El segundo indica cómo se aplicarán los cambios, es decir, si se aplicarán para todos los usuarios o sólo para el actual , si será un cambio temporal o permanente, etc... Al igual que antes aquí encontrarás la documentación completa de la función para profundizar.

Lo que nos queda es pasar las definiciones anteriores a C# (con ayuda de atributos DllImport y los InteropServices), y en unas pocas líneas podemos hacer cambios de resolución. No voy a escribir aquí todo el código puesto que queda un poco largo debido a las definiciones de la API en C#, pero he preparado un archivo de ejemplo que te puedes descargar pulsando aquí (ZIP, 1.3 KB), y que contiene todo lo necesario para cambiar la resolución. Si lo sigues teniendo a mano la documentación de las funciones mencionadas no tendrás problema en entenderlo.

La clase creada para el ejemplo permite cambiar la resolución escribiendo tan sólo:

Resolucion.ChangeRes(1024, 768);

Y ya está. Genera excepciones indicando posibles problemas y también cuando se deba reinicair el equipo para que los cambios surtan efecto.

Por: José Manuel Alarcón Aguín | Tuesday, March 29, 2005 9:11:00 PM (Hora de verano romance, UTC+02:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

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 la capacidad de ser maximizadas, así nos aseguramos de que ocupan lo que tienen que ocupar.

Por: José Manuel Alarcón Aguín | Tuesday, March 22, 2005 10:03:00 AM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

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.

Por: José Manuel Alarcón Aguín | Wednesday, March 16, 2005 2:27:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

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?

Por: José Manuel Alarcón Aguín | Tuesday, March 15, 2005 8:49:00 AM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

Web Services Enhancements 2.0 (WSE 2.0) es el paquete para .NET que permite crear servicios Web avanzados siguiendo las propuestas para estándares en seguridad, enrutado, etc... que marca el W3C. WSE es casi indispensable para la creación de aplicaicones empresariales serias que se basen en Servicios Web. Puedes encontrar una introducción aquí.

MSDN Home

Microsoft acaba de liberar el Service Pack 3.0 para WSE 2.0. Este parche trae algunas correciones relativas al uso de certificados digitales X.509 y testigos de autenticación, y cambia la forma de trabajar de algunas características. Puedes leer todos los cambios aquí.

El paquete así como su documentación y distribuíbles se pueden obtener gratuitamente desde la dirección http://msdn.microsoft.com/webservices/building/wse/.

Por: José Manuel Alarcón Aguín | Thursday, March 10, 2005 8:38:00 AM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Noticias Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

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";
}

....

void CambiaNombre(Persona p)
{
    p.Nombre = "Cambiado";
}

...

Persona per = new Persona();
CambiaNombre(per);
Console.WriteLine(per.Nombre);

En este ejemplo, al llamar a la función CambiaNombre pasándole un objeto de la clase Persona, lo que obtenemos en la consola es la plabara "Cambiado". Esto se debe a que el objeto se pasa por referencia.

Si cambiamos la definición de la clase persona y la convertimos en una estructura (que tiene las mismas capacidades que una clase, vale la pena recordar):

struct Persona
{
    public string Nombre;
}

Al ejecutar el mismo código de antes en la consola veríamos "Original", ya que una estrcutura es un tipo por valor y por lo tanto lo que se pasa como parámetro es una copia del objeto, no una referencia al objeto original.

La forma que proporciona el lenguaje para pasar referencias a tipos por valor a los métodos es la palabra clave ref. Al colocarla delante del parámetro el compilado envía una referencia a la estructura y no una copia, por lo que se conservan las moificaciones hechas dentro del método. En nuestro ejemplo bastaría con poner:

void CambiaNombre(ref Persona p)

y al llamar al método también:

CambiaNombre(ref per);

El problema de esto es que antes de pasar el parámetro hay que convertir el tipo por valor en un tipo por referencia, lo que se conoce técnicamente como operación de Boxing. Y al terminar la llamada se debe hacer un Unboxing que es la operación contraria. Dicho proceso es más costoso que simplemente pasar una referencia por lo que el rendimiento de la aplicación puee bajar si se hace con mucha frecuencia (dentro de un bucle largo, por ejemplo). Además, el propósito perseguido normalmente cuando se crea una estrcutura es precisamente usarla como tipo por valor, por lo que en la práctica la palabra clave ref se usa más bien poco.

Existe una palabr similar llamada out que también se puede poner en un parámetro para poder obtener referencias a objetos modificados y que tiene sentido incluso con clases. La diferencia entre refout es que en el primero el objeto que se pase al parámetro tiene que estar inicializado (es decir, tiene que ser una instancia concreta de un tipo) mientras que en el segundo caso puede ser simplemente una variable sin inicializar que a la vuelta de la función contendrá una clase concreta como valor de retorno.

Por: José Manuel Alarcón Aguín | Wednesday, March 09, 2005 2:01:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

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 (y con soporte para el entorno Eclipse).

La "magia" del producto se basa en que ofrece la única implementación de Java existente en el mercado del protocolo .NET Remoting, que es el modo nativo de comunicación entre procesos de .NET y permite el uso de componentes desde otros procesos y/o máquinas como si estuviesen en ejecutándose en el mismo proceso.

Desde la página web de la empresa (j-integra.intrinsyc.com) se puede descargar gratuitamente una versión de evaluación de 30 días así como la documentación correspondiente.

Por: José Manuel Alarcón Aguín | Saturday, March 05, 2005 8:58:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

A ver... Aprovecho la ocasión y como sé que, lógicamente, casi todos los que visitais este blog estáis interesados en la programación, los sistemas y las tecnologías de Microsoft en general, me gustaría que me ayudáseis con un tema que tengo entre manos.

Te agradecería mucho que me dejases un comentario en este post indicándo cuáles de los siguientes temas consideras lo suficientemente interesantes como para apuntarse a un curso. Siempre pensando en personas que están en empresas y necesitan mejorar sus conocimientos y técnicas:

  1. Iniciación a ciertos temas de programación de .NET (por ejemplo: ASP.NET, ADO.NET, la plataforma .NET...)
  2. Cuestiones avanzadas y puntuales de programación (por ejemplo: .NET Remoting, Web Services Enhancements 2.0, Enterprise Services...)
  3. Programación en lenguajes anteriores (ej: ASP 3.0, Visual Basic...)
  4. Programación para la Web sin estar atada a plataformas concretas (ej: HTML, JavaScript...)
  5. Programación con ASP.NET 2.0 y Visual Studio 2005.
  6. Escritura de aplicaciones seguras (ej: técnicas para escribir aplicaciones que no sean vulnerables)
  7. Seguridad de sistemas (ej: blindaje de Windows, SQL Server o IIS, IPSec, seguridad de redes inalámbricas...)
  8. Gestión de sistemas (Directorio Activo, Exchange, Sharepoint...).
  9. SQL Server 2005
  10. Arquitectura y diseño de aplicaciones (Ej: patrones de arquitectura, UML, ORM...).

Basta con que dejes un comentario al post indicando los números de la lista de arriba de tu interés y, si quieres, algún comentario a mayores.

Un millón de gracias por la colaboración. De este modo también me animaré a publicar más cosas aquí que se adapten a los intereses de los que me visitais...

Por: José Manuel Alarcón Aguín | Tuesday, March 01, 2005 8:35:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Off-Topic


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner
Copyright © 2010 José Manuel Alarcón Aguín. All rights reserved.