lunes, 30 de diciembre de 2013

Cerrar u ocultar ventana desde otra ventana WPF con VB 2010

Me he visto en esta situación debido a que muchas de las cosas que son fáciles y cotidianas manejando formularios en VB, no tan similares a manejar ventanas WPFs.

Bueno al grano, este es el código del botón de la ventana principal que abrirá la segunda ventana, y de la 2da. ventana mediante un botón manipularemos la primera ventana.


Aquí el código del botón de la 2da ventana, que manipulara la 1ra. ventana, en este caso lo que estoy haciendo es esconder la primera ventana, si quieres cerrar la primera ventana, lo único que tienes que hacer es cambiar la palabra "Hide" por la palabra "Close".


Eso es todo...

Chao.

lunes, 28 de octubre de 2013

Como recuperar la clave del usuario sa en Sql Server

Hay muchas maneras de liarla con nuestra base de datos SqlServer y una de ellas es olvidar o no tener a nuestra disposición la clave del usuario sa. Puede ser debido a que nunca la usemos, porque tenemos nuestro propio usuario administrador y realmente no iniciamos sesión con esa cuenta. Puede ser que hayamos heredado esa maravillosa base de datos y no tengamos ningún usuario ni de dominio que sea administrador. O peor aún, que incluso desde el mismo día de la instalación no sepamos esa clave y acabamos de eliminar el único login con los permisos adecuados... Para cualquiera de estas historias tristes puede haber una solución que no sea reinstalar.
Desde SqlServer 2005 (y hasta SqlServer 2012 que yo sepa) existe, como plan de recuperación para este tipo de desastre, la posibilidad de arrancar la base de datos SqlServer en modo "single-user" y poder acceder a ella con cualquier usuario de miembro del grupo de administradores del sistema. Arrancar la base de datos en single-user está pensado para realizar tareas de mantenimiento, como por ejemplo aplicar patches y realizar otras tareas. En nuestro caso, donde hemos perdido la clave del usuario sa, nos permitirá, una vez limitado el acceso, conectarnos por ejemplo via sqlcmd y agregar un usuario de la base de datos al rol sysadmin dentro de Sql Server. A continuación un resumen...
Pasos a seguir:
  • Abrimos el Administrador de Configuración de SqlServer. Buscamos el Servicio de SqlServer y miramos las Propiedades, en la pestaña Opciones Avanzadas o Parámetros de inicio añadimos un -m al final de la linea. (puede variar segun la versión). Presionamos aceptar y reiniciamos el servicio.

  • Una vez reiniciado, abrimos la linea de comandos y el cliente sqlcmd. Ejecutamos lo siguiente:
 sqlcmd -S localhost

 1> EXEC sp_addsrvrolmember 'DOMINIO\Dba','sysadmin';

  • Volvemos al Administrador de Configuración de SqlServer, quitamos el -m que hemos añadido en el primer punto y volvemos a reiniciar el servicio. Finalmente probamos de acceder con el usuario de dominio anterior y restauramos la clave del usuario sa (y la guardamos en lugar seguro). Misión cumplida.
Existe una variante sobre el uso del parámetro -m para arrancar la bbdd en modo usuario único, es -m"Nombre app" (En el nombre de la aplicación cliente se distinguen mayúsculas y minúsculas). Este uso del parámetro limita las conexiones a una aplicación cliente con el nombre especificado. Por ejemplo, -m"SQLCMD" limita las conexiones a una conexión única y esa conexión se debe identificar como el programa cliente SQLCMD. Se puede usar esta opción cuando estemos iniciando SQL Server en modo de usuario único y una aplicación cliente desconocida esté usando la única conexión disponible. Para limitarlo al Management Studio, usamos -m"Microsoft SQL Server Management Studio - Query".

lunes, 9 de septiembre de 2013

Anatomía de un juego adictivo



Hace apenas un par de días me senté a jugar Candy Crush vía Facebook. Me llamaba la atención cómo es que un juego como éste pudiese tener 100 millones de usuarios que juegan cotidianamente. ¿Qué es lo que hace este juego especialmente adictivo? ¿Cómo se puede escribir el siguiente juego exitoso? He aquí las conclusiones a las que he llegado:
  • Antes que nada, haga su juego gratuito. No quiero decir con esto que haga una versión recortada para que ésta se distribuya gratuitamente. No. El juego completo, sin restricciones, debe ser gratis. Más de uno ya se estará preguntando ¿cómo entonces el programador hará dinero? Siga leyendo.
  • Haga un juego con cientos de niveles. Esto es para que el usuario no deje de jugar. Imaginen que el PacMan hubiese sido así. Imaginen que cambiaran los laberintos, que hubiese otra clase de perversos personajes diferentes a los fantasmas, imaginen que de acuerdo al nivel adquirido, hubiese otro tipo de pastillas para obtener poderes, etcétera. Otro ejemplo: Tetris: sí, se juega contra el tiempo (salen cada vez más rápidamente los ladrillos) y contra el que no llenes la pantalla de ellos. Qué tal darle un giro, buscar alternativas al juego original, poner otro tipo de ladrillos, por ejemplo, algunos que fuesen invisibles, o que tuviesen premios, o que explotaran al caer al piso, qué sé yo. Las posibilidades son ilimitadas.
  • Los niveles siempre deben ser un reto mayor o diferente al anterior. Me sorprende que Candy Crush tiene no sé cuantos cientos de niveles. ¿Pues qué tanto han pensado estos programadores?
  • Evidentemente el juego debe ser agradable a la vista. Candy Crush tiene -aparte de buenos programadores-buenos diseñadores gráficos y los efectos de sonido y de video son estupendos. Es importante este punto porque un juego puede ser muy bueno, pero si es poco atractivo visualmente, posiblemente no sea muy exitoso.
  • Contrate a alguien para que le haga la música del juego. Esta debe ser relativamente repetitiva para enfatizar que se está en el juego. La música de Candy Crush no me parece particularmente pegajosa, pero es claro que eso le da además, identidad al juego.
  • Y ahora la parte monetaria: si quiere hacer dinero, limite la vida del jugador. En Candy Crush hay cinco vidas (oportunidades, pues), para pasar de un nivel a otro. Cuando uno falla y se acaban las vidas el sistema le da las siguientes opciones: i. esperar una serie de minutos para obtener vidas extras o bien, ii.pedirle a los amigos que le concedan vidas (dentro del mismo Facebook) o incluso, iii. comprar por cantidades menores, 1 dólar, 92 centavos de dólar, etcétera, más vidas. Suena extraño que esto pueda convertirse en un ingreso considerable, pero piénsese: si hay 100 millones de usuarios y sólo el 0.1% compra vidas o lo que el juego ofrece, estámos hablando de 100,000 personas que contínuamente están comprando beneficios para jugar. 100,000 dólares (¿cuánto tiempo le gusta por semana?), no le caen a nadie mal. Y que conste, estoy haciendo un cálculo muy conservador.
  • Ataque todas las plataformas posibles: Candy Crush se puede jugar en Android, en iOS, en el navegador, etcétera. Si quiere tener millones de jugadores se requiere que su gran juego esté en las más plataformas posibles.
  • Si su juego empieza a tener éxito, venda los derechos para que salgan camisetas, balones, juguetes, pijamas, calcomanías por sumas módicas. Seguramente ganará mucho dinero y además, su juego estará mucho más presente en la vida cotidiana de las personas.
Si usted programador tiene una buena idea para un juego y quiere vivir de esto créame, estas recomendaciones podrían hacerlo salir de un salario menor y entrar a “las grandes ligas”. Desde luego que el problema es hacerse de una idea con la que se pueda jugar y que sea lo suficientemente atractiva para que la gente le entre. Ningún juego -de la noche a la mañana- cobra fama instantánea. Angry Birds fue un gran éxito, pero seguro pasó por una temporada de “sensibilización” por decirlo de alguna manera, para que los potenciales jugadores le entraran. Así que ya sabe qué hay que hacer.

martes, 3 de septiembre de 2013

Componente RibbonControl de DevExpress para NET

Contextualizar

El tipo de menú Riboon fue una de las principales innovaciones visuales desarrolladas para aplicaciones de escritorio (y más tarde adaptado para aplicaciones web). Hasta entonces, solían utilizar una estructura simple al menú principal de las ventanas, que consistía en una barra superior y sin muchos detalles gráficos de los que derivan las barras verticales con los elementos que eran sólo de texto, a veces, un pequeño cuadro en la esquina.

La figura 1 muestra un ejemplo de un menú, con el primer elemento resaltado.

Estructura común del Menú Principal
Figura 1: Estructura del Menú Principal Común

En el estilo de menú Riboon, los elementos comenzaron a ser agrupados en pestañas que contienen grupos que se pueden insertar en varios tipos de elementos, tales como botones y cuadros de texto. El ejemplo más conocido de este modelo es el uso de Microsoft Office, como se muestra en la Figura 2.

Menú de Office 2007 a la cinta
Figura 2: menú de Office 2007 a ​​la ribbon

Esto rápidamente se convirtió en uno de los diseños más "deseables" en el medio de la programación del menú, y los desarrolladores han llegado a adoptarlo en sus nuevas aplicaciones y migrar los viejos.

El RibbonControl de DevExpress

En este contexto, algunos fabricantes de componentes comenzaron a desarrollar sus soluciones para diversas plataformas y comercializarlos (o distribuirlos de forma gratuita). Mientras IDEs no proporcionaron un componente nativo para cumplir con esta nueva "ola", empresas como DevExpress incluyen este componente en sus bibliotecas, haciendo más fácil el acceso a este modelo de interfaz.

Aquí se presentarán este componente de DevExpress para Visual Studio, destacando sus principales características y dar las bases necesarias para que cualquier desarrollador con conocimiento de la herramienta puede incluirlo en sus aplicaciones.

Así que para empezar, creamos una aplicación de Windows Forms en Visual Studio (en este caso se utiliza la versión de 2010, pero puede utilizar otra versión, pero teniendo en cuenta que puede haber diferencias debido a las diferentes versiones de la biblioteca).

En el formulario principal, vamos a añadir un RibbonControl desde la pestaña "Navegación y Diseño" en la caja de herramientas de DevExpress.

El aspecto inicial se muestra en la siguiente figura, que pone de relieve algunos elementos de la cinta.

RibbonControl en forma con elementos resaltados
Figura 3: RibbonControl en forma con elementos resaltados

Miembros en comisión son:
  • 1 Barra de acceso rápido: es posible insertar elementos de los que se accede con más frecuencia, lo que facilita el acceso por parte del usuario. Más adelante se explicará cómo agregar elementos a la "Barra de herramientas de acceso rápido" (Barra de herramientas de acceso rápido).
  • 2 pestañas de ribbon: la estructura principal de ribbon está dividida en páginas con pestañas (páginas de ribbon), que se insertan en los grupos con diversos elementos. Un menú que utiliza alusión anteriormente, las páginas podrían representar los puntos de menú más alto nivel (esos son siempre visibles en la parte superior de la ventana).
  • 3 Ribbon Grupo de Páginas: dentro de las páginas son la cinta son los grupos de páginas cinta, en la que se insertan los elementos reales de menú (botones, submenús, cuadros de texto, etc.) Sólo con hacer una referencia rápida de las aplicaciones comerciales, podríamos imaginar que la página era el "registros", mientras que los grupos subdivididos en "acciones", "Personas", "seguridad", etc. Artículo proporcionado a lo largo de la cinta se incrementará para facilitar la comprensión de los conceptos.

Estilo del Ribbon y "utilizar" con los formularios

Ejecutando el proyecto, tenemos un resultado similar a la figura 4, donde vemos que la Riboon se encuentra dentro de formulario. Sin embargo, si se compara con las aplicaciones como Word y Excel, en tales casos, Riboon se "fusiona" con el formulario.

Forma de correr con la cinta interna
Figura 4: Formulario de correr con la cinta interna

Para conseguir el efecto de "fusion" con el formulario, dando la impresión de que él es parte de la estructura de "cerrar" la ventana, se debe utilizar una forma de tipo RibbonForm, situada en espacio de nombres DevExpress.XtraBars.Ribbon.

Para ello basta con cambiar la clase del formulario principal de la aplicación. Visualización del código de la forma, cambiamos la declaración de la clase de la siguiente manera:

Listado 1: Modificando el formulario para RibbonForm
public partial class Form1: DevExpress.XtraBars.Ribbon.RibbonForm
{
public Form1 ()
       {
        InitializeComponent ();
}
}
Ejecutando el proyecto de nuevo, el resultado es diferente, como se ve en la siguiente figura. En tiempo de diseño, ahora es posible ver los cambios estéticos.

RibbonForm fusionó con la cinta
Figura 5: RibbonForm fusionó con la cinta

También puede cambiar el diseño general de Riboon con uno de los tres modelos disponibles: Office 2007, Office 2010 y Office Mac. Para esta configuración, basta con cambiar la propiedad RibbonStyle de Riboon. Los resultados obtenidos son los siguientes:

RibbonStyle Office2010
Figura 6: RibbonStyle Office2010

RibbonStyle MacOffice
Figura 7: RibbonStyle MacOffice

El Office2007 es un patrón de estilo, que se puede ver en la Figura 5.

En las figuras 6 y 7, vemos que hay una flecha en la parte superior derecha de la cinta. Este pequeño botón se puede utilizar para ocultar el área principal de la cinta (donde están los grupos). El mismo efecto se puede lograr haciendo doble clic sobre la solapa.


Adicionando páginas, grupos e items de forma rápida

Para aumentar a Riboon, utilizamos los siguientes procesos:
  • Para agregar páginas: Haga clic en la pestaña de la página y seleccione la opción "Add Page".
  • Para agregar grupos: haga clic en la pestaña de la página en la que se agrega el grupo y seleccione la opción "Add PageGroup".
  • Para añadir elementos: haga clic en el grupo al que desea agregar los elementos y escoger una de varias opciones disponibles.
Estos son los principales procedimientos en la estructuración de Riboon, que forman dan forma al menú rápido.

Para ilustrar, vamos a crear dos páginas con algunos grupos, como se muestra en la Figura 8 ..

Ambos grupos tienen las páginas como la propiedad Text, que representa el texto que aparece en la cinta.

Cinta con páginas y grupos añadidos
Figura 8: Cinta con páginas y grupos añadió

A continuación, añadir algunos botones dentro de los grupos. Los botones tienen varias propiedades, entre las que cabe destacar en este punto:
  • Caption: texto que aparece en el botón.
  • Glyph: pequeña imagen, que aparece junto al texto.
  • LargeGlyph: imagen grande sobre el texto que se muestra en el botón para hacer un "botón grande".
En la siguiente imagen se define con dos botones con Large Glyph una con Glyph y otra sin ninguna imagen.

Botones con y sin imágenes
Figura 9: Los botones con y sin imágenes

Una vez añadidos, los botones funcionan como cualquier otro botón en términos de la interacción del usuario. Para activar el evento click, tome dos clicks en cada uno.


Añadir elementos a la barra de herramientas de acceso rápido y el menú de la aplicación


Para agregar elementos a la barra de herramientas de acceso rápido es necesario utilizar el diseño de la ventana de edición de Riboon,  que se puede hacer desde la "etiqueta inteligente(Smart Tag)" (pequeña flecha aparece en la esquina superior derecha del componente para seleccionarlo) seleccionando la opción "Run Design".

En la ventana que se abre, debe acceder a la opción "Quick Access Toolbar" en el lado izquierdo, como se muestra en la siguiente figura.

Edición de cinta de la ventana
Figura 10: Ventana para editar el diseño de ribbon

Como podemos ver en el lado derecho con los elementos ya creados de la ribbon (sólo los botones). Para agregar a la barra de herramientas de acceso rápido, basta con arrastrar a la región en blanco en el centro de la pantalla.
Para ilustrar esto, vamos a arrastrar el enlace "Productos" y cierre la ventana de edición de diseño. A continuación, compile el proyecto y obtendra el siguiente resultado.

Artículo añadido a la barra de herramientas de acceso rápido
Figura 11: Artículo añadido a la "Barra de herramientas de acceso rápido (Quick Access Toolbar)"

También puede insertar elementos en la cabecera de la cinta, en la región donde las fichas son las páginas. Para ello, de nuevo en la ventana del editor de diseño, seleccione la opción "Elementos PageHeader Ribbon", y, como en el caso de la barra de herramientas de acceso rápido, arrastre los elementos a la región central. En este caso, también insertar el botón "Productos", como se muestra en la Figura 1.

Para añadir elementos a la cabecera de la cinta
Figura 12: Agregar elementos a la cabecera de ribbon

Ahora, el botón aparece en la esquina superior derecha, como se muestra a continuación.

Botón en la cabecera de la cinta
Figura 13: Botón en la cabecera de ribbon

Por último, para completar la personalización básica de Ribbon, podemos insertar elementos en el menú de la aplicación, el que se muestra al hacer clic en el icono bola superior izquierda.

A esto hay que añadir un componente ApplicationMenu en el toolbox del formulario y haga clic en smart tag, seleccionando la opción "Run Design". Esto abrirá la ventana de edición de ribbon, ya conocida por nosotros, y sólo tienes que arrastrar algunos artículos para la región central, como en los casos anteriores. En el ejemplo, se inserta en dos de los botones dibujados creado anteriormente y el resultado se muestra a continuación.

Los elementos del menú de la aplicación
Figura 14: Los elementos del menú de la aplicación

Conclusiónes

Las propiedades, métodos y posibilidades de personalización de RibbonControl son muchas y que tomaría algunos artículos para explicar en detalle.

En esta publicación, sin embargo, el objetivo era dar una visión general del componente, lo que permite a los lectores a empezar a usarlo en sus aplicaciones.

Con la información que se presenta aquí es posible construir una estructura razonable con ribbon para formar el menú principal de los formularios, con las divisiones en pestañas y grupos que a su vez contienen varios elementos.


El presente contenido no es de mi propiedad, si deseas ver el documento original se encuentra en portugues y este es el enlace 
http://www.devmedia.com.br/conhecendo-o-componente-ribboncontrol-da-devexpress-para-net/25945

jueves, 29 de agosto de 2013

Obtener el valor del item seleccionado del ListBox o ComboBox en C# WPF

Es habitual que además de añadir una cadena al ListBox o ComboBox añadamos o relacionemos también un valor numérico con dicha cadena. También sucede que al recuperar, por lo menos los que estamos acostumbrados a VB quisiéramos recuperar el valor de esta forma ListBox1.SelectedValue, sin embargo esto no funciona en controles WPF, pero aquí les dejo la forma de recuperar el valor (no la cadena que puede ser visualizada) en 2 lineas.

Si es un ListBox,

string valor = ((System.Data.DataRowView)ListBox1.SelectedItem).Row.ItemArray[0].ToString();
MessageBox.Show(valor);

Si es un ComboBox

string valor = ((System.Data.DataRowView)ComboBox1.SelectedItem).Row.ItemArray[0].ToString();
MessageBox.Show(valor);

(editado)
Si por si caso te preguntas como recuperar la cadena que has seleccionado

string valor = ComboBox1.SelectedItem.ToString();
MessageBox.Show(valor);

miércoles, 28 de agosto de 2013

Error extraño en C#

No se que paso, prácticamente es el mismo código, cuando me apareció el error "No se puede utilizar como método el miembro 'System.Data.DataSet.Tables' no invocable", busque por internet la solución y no encontré nada.

Lo bueno es que lo arregle, probando todo tipo de código que encontré por ahí, y al final encontré uno que funcionaba todo chevere, copie linea por linea en el que me daba error, y lo gracioso es que me sigue dando error.

El código de arriba, se encuentra en un botón (el que esta mal) y el otro en otro botón en la misma ventana WPF, son completamente iguales solo que no se porque en el primer caso me da error.



viernes, 18 de enero de 2013

Solo lectura en Gridcontrol

La verdad no encontré para que todo el control sea solo en modo lectura, pero puedes colocar cada columna en forma independiente en modo lectura de la siguiente forma.

GridControl1(1).ReadOnly = True

donde 1 es en numero de la columna, o también puedes poner el nombre de la columna.

Si quieres que toda la tabla sea en modo lectura, pon esto.


 For NCol = 0 To GridControl1.Columns.Count - 1
            GridControl1.Columns(NCol).ReadOnly = True
Next

jueves, 10 de enero de 2013

Modificar app.config - Cadena de Conexión

Para aclarar estoy usando Visual Basic 2010 y WPF, sin embargo el WPF no interviene en el código que utilizare, así que los que utilizan Formularios no tendrían problema alguno.

Para empezar abrimos el app.config.


Añadan una conexion con el Nombre "CadenaConexion", el connectionString coloquen lo que sea, al final va ser modificado por nuestra aplicacion, y en providen name pueden colocar "System.Data.SqlClient" para los que utilizan Sql Server o "MySql.Data.MySqlClient" para los que utlizan MySQL, al final tampoco importa mucho ya que también sera modificado por nuestra aplicacion.


Crea una ventana o formulario con una caja de texto (TextBox) con el nombre o name "TBcadena" y un Botón con el nombre de "BTActualizar", entra al evento Clic del botón y coloca este código.


Como veras el boton esta llamando a un procedimiento llamado CambiarCNX y donde se le envía un parámetro de tipo string, en este caso le estamos pasando el contenido del TextBox.

El codigo del procedimiento es este.


Ya estaría, si quieres verificar si resulto, porque muchos ESTOY SEGURO que al fijarse en su app.config no ven cambio alguno, les comento que al momento de ejecutar crea su propio app.config y esta dentro del la carpeta bin o debug.

Y NO precisamente se llama app.config, tiene el nombre del proyecto con la extensión vshost.exe (no es un EXE es un XML) y se puede abrir con el Bloc de Notas o NotePad


Listo, esito sería.

---------------------------------------------------------------------------------------

Yo no sabia pero me entere, así como nosotros podemos abrir con un Bloc de Notas, otros también podrían hacerlo no te parece, podrian ver nuestro usuario, lo peor ver la contraseña de acceso.

Para que te calmes tambien se puede guardar encriptado de la siguiente forma.

Este es el código de procedimiento CambiarCNX, ves alguna diferencia...


Exacto, al final aumente una llamada a otro procedimiento, el que me encripta los datos y su código es este.


Ahora si, fíjate tu supuesto app.config que en realidad tiene otro nombre y se encuentra en la carpeta Bin o Debug. Solo veras garabatos.

Ahí te ves.....