Búsqueda personalizada

lunes 22 de diciembre de 2008

jueves 22 de mayo de 2008

Pasar Parametros al Ejecutar un exe

Primero vamos a ejecutar un exe desde alguna otra aplicacion que tenemos, y agregado necesitamos pasarle un par de parametros, para mi caso era el nombre de la aplicacion porque tenia varias aplicaciones en el dot exe y ademas otro parametro era diferenciar las tablas de usuario y proveedor.

Code:

Shell("D:\OttComputer SA\DEV\SERKon\01.00.xx\src\SERKon\FA_DC\FA_DC\bin\Debug\FA_DC.exe OP-Ausgleich 0")


'En tu aplicacion en el main
Private Sub Frm_Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Puedes verificar si te estan pasando los parametros
If My.Application.CommandLineArgs.Count > 0 Then

'Y asi los capturas, en unas variables tipo string para mi caso
'La solucion esta planteada, el resto es tuyo
Me.appParam = My.Application.CommandLineArgs(0)
Me.tableParam = My.Application.CommandLineArgs(1)

End If
End Sub


Un pequeño paso para el programador, uno grande para la empresa :P

SQL Crear una tabla nueva mediante copia directa de otra tabla

Crear una tabla nueva copiando los campos y la data de otra tabla, es decir que vamos a tener una copia de la otra tabla pero con un nombre nuevo

Code:

SELECT * INTO user_open_account FROM client_open_account


Y eso es todo, a la vez que creas la tabla haces una copia exacta de la otra

Subreporte SQL Reporting Services (SSRS)

Como llamar a un subreporte desde el reporte principal, no es tan sencillo como en Crystal Reports y me parece que esta parte ha de venir mejorada en SQL2008, espero..

Poner un subreporte en SSRS no es lo dificil, el problema es hacerlo funcionar en el codigo de tu aplicacion, aca pongo una de las soluciones pero todavia falta pulir esto


'Funcion donde cargamos el reporte principal con los datos y parametros respectivos
'No hay descripcion del resto del reporte porque no es parte del tema
'Solo estamos intentando solucionar lo del subreporte
Private Sub Frm_reports_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Añadimos el evento SubreportProcessing al Reportviewer
'Y lo direccionamos a la funcion SetSubDataSource que esta detallada mas abajo **
AddHandler ReportViewer1.LocalReport.SubreportProcessing, AddressOf Me.SetSubDataSource

BS.DataSource = DS_Temp_Reports
BS.DataMember = DS_Temp_Reports.Tables(0).TableName
..
..
..


**
Public Sub SetSubDataSource(ByVal sender As Object, ByVal e As SubreportProcessingEventArgs)

Dim StrSQL As String = "SELECT customer_id, name1, street FROM customer"

Dim Da As New SqlDataAdapter(StrSQL, connectionString)

'Cargamos el Dataset
Da.Fill(DS)

Try
'Cargamos el Subreporte con el Dataset que llenamos anteriormente
e.DataSources.Add(New ReportDataSource(DS.Tables(0).TableName, DS.Tables(0)))
Catch ex As Exception

End Try
End Sub


Y ya esta en teoria, lo pongo para acordarme que es una solucion probable y en realidad funciono, pero no me dejo 100% satisfecho, ya veremos cuando tenga el paquete 2008 en mis manos si se puede mejorar esto

lunes 21 de abril de 2008

Esconder Ventana Principal y abrir otra Ventana

Me encontre con este problema y lo acabo de resolver hoy en la mañana.

Basicamente, tienes un formulario principal y tu menu con opciones, deseas que uno de los formularios que se abren al dar click en las opciones aparezca apenas abras la aplicacion, pero siempre se abre el formulario que esta seteado como principal.

Ah pero para eso ni me tomaba la molestia de escribir diras, pongo Frm.Hide() o Visible = False y ya esta o sino la famosa Opacity = 0 dentro del main. Pero el flickering/parpadeo que se produce es terrible, puede ocurrir que veas como va desapareciendo o que la veas un segundo y desaparezca lo cual luce terrible para una aplicacion final.

Sin mas lata aqui va la solucion:

'El Load del Formulario Principal
Private Sub FrmPrincipal_Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Aca vamos a cargar el formulario que deseo se abra
'Como formulario inicial
Dim my_NEW_form As New Frm_pay()
my_NEW_form.ShowDialog()

End Sub


'Este es el evento salvador
'Si usas igual el hide pero la clave es ponerlo dentro de esta funcion
'Nunca veras nada, simplemente no aparecera
Private Sub FrmPrincipal_Main_Activated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Activated

Me.Hide()


End Sub



'Para este momento debes tener abierto el formulario
'Que decidiste sea tu formulario inicial (
my_NEW_form instanciado de Frm_pay())
'Pero debes tomar en cuenta que el formulario principal sigue ahi
'En memoria y no se ha cerrado

'Esta parte ira entonces en tu nuevo formulario
'En la opcion de salir o para mi caso cuando el user de click en la X (arriba, derecha)
'del formulario procedemos a cerrar toda la aplicacion
Private Sub Frm_pay_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing


Application.Exit()


End Sub


Y listo, cualquier duda dejanla en los comentarios y respondere lo mas rapido posible

miércoles 9 de abril de 2008

Cambiar Toolstrip o Botones en PrintPreviewDialog

CHANGE PRINT BUTTON IN PRINTPREVIEWDIALOG

CAMBIAR BOTON PRINT EN PRINTPREVIEWDIALOG

Como podran ver realize muchas busquedas respecto a este tema, y he aqui otra de esas pequeñas cosas que facilitan la vida del desarrollador.

Un resumen para el que tenga tiempo de leer, estoy trabajando en un diseñador de reportes tipo Crystal Reports solamente que casi todas las funcionalidades que tenemos los desarrolladores para hacer reportes ahora se las pongo a disposicion de cualquier mortal usuario.

Entre estas funcionalidades, uso el control PrintPreviewDialog para las previas de los documentos antes de proceder a imprimir, pero por default vienen varios botones (Print, Zoom, etc) que parecen intocables puesto que solo parecia podias modificar ciertas propiedades.

Para hacer corto el cuento, queria quitar el boton de imprimir y poner mi propio boton y aqui vamos con el fuente:



Dim PrintPreviewDialog1 As New PrintPreviewDialog()

'Debo asignar un PrintDocument
PrintPreviewDialog1.Document = PrintDocument

'Cambio ciertas propiedades del Zoom, de la ventana, etc
PrintPreviewDialog1.PrintPreviewControl.Zoom = 1.0
PrintPreviewDialog1.WindowState = FormWindowState.Maximized
PrintPreviewDialog1.Document.DefaultPageSettings.Landscape = True

'Esto es lo interesante
'Hago un Cast del Control y su toolstrip
'Remueve el item en la primera posicion del PrintPreviewDialog
'Que es el boton de print por default
DirectCast((PrintPreviewDialog1.Controls(1)), ToolStrip).Items.RemoveAt(0)

'Inserto en la misma posicion 0
'mi control que por casualidad
'es un boton de impresion
'donde el usuario puede realizar toda la configuracion
'elegir impresora, tamaño de papel, etc
DirectCast((PrintPreviewDialog1.Controls(1)), ToolStrip).Items.Insert(0,Me.PrintToolStripButton)


Espero les sirva, es bastante rebuscado este tema ojala y este pronto en los buscadores
Saludos


Update del Tema:
Me di cuenta que te llevas el boton de imprimir pero nunca lo regresas, aqui la linea correspondiente

Me.MainToolStrip.Items.Insert(5, DirectCast((PrintPreview.Controls(1)), ToolStrip).Items(0))






jueves 3 de abril de 2008

Calcular DPI y Convertir Pixel a Cm

Alguna vez necesite de esto para trabajar con impresiones o imagenes y recopilando informacion obtuve lo siguiente, pienso que esta es la forma correcta de hacerlo para los dos topicos mencionados puesto que lo corrobore con una pagina web.


CODIGO PARA CALCULAR LOS DPI

'Para obtener los DPI, aqui esta el calculo
'Obtenemos el Width & Height de nuestra pantalla
Dim intX As Integer = Screen.PrimaryScreen.Bounds.Width
Dim intY As Integer = Screen.PrimaryScreen.Bounds.Height

'Esta formula es para obtener la resolucion me parece
Dim dpi As Double = (intX ^ 2 + intY ^ 2) ^ 0.5

'Y aqui es donde en realidad se obtienen los dpi
'Se divide el calculo anterior para el tamaño de tu monitor
'No encontre como obtener el tamaño del monitor directamente de la PC pero si hay como
dpi = dpi / 16.9

PD: Talvez tambien hay forma de sacar los dpi directo de la PC, pero buee


CODIGO PARA CONVERTIR DE PIXEL A CM Y VICEVERSA

El calculo anterior nos sirve para la conversion o si ya poseen los DPI obtenidos de la impresora directamente o algo asi, los van a usar aca

pix = cm * dpi / 2.54

or

cm = 2.54 * pix / dpi


Y para comprobar que no es invento jeje aca dejo el link de un convertidor de pixel a cm via web

martes 1 de abril de 2008

Resizing un PictureBox en Runtime con el Mouse

Estoy tratando de recordar todas las otras cosas que he solucionado para ir poniendolas aca, pero hasta eso voy a colgar las que se me vayan presentando semanalmente.

El problema aca es que queria que los users puedan manipular un PictureBox con la misma funcionalidad que tenemos los developers, de poder aumentar o disminuir sus dimensiones con el raton una vez colocado en pantalla y aqui vamos.

Empezamos directo con el codigo, no creo necesario poner graficos pero si alguien no tiene claro el panorama dejen su mensaje y con gusto ayudo en lo que este a mi alcance.


Codigo Fuente
'Declaramos esta variable global que sera nuestro handle del evento Resize
'En español la bandera para saber cuando el usuario quiere cambiar el tamaño del PictureBox
Dim allowResize As Boolean

'Cuando el usuario hace MouseDown en el PictureBox habilitamos el Resize
Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

'Cambio el estilo del borde del PictureBox solo para diferenciar
PictureBox1.BorderStyle = BorderStyle.FixedSingle

'Pongo la variable que habilita el resize en true
allowResize = True

'Cambio el cursor a uno mas apropiado, hay variedad eso ya les toca a uds
Me.PictureBox1.Cursor = Cursors.SizeNWSE

'Esto es para otra funcionalidad que necesitaba pero se las dejo suelta
'Si les interesa me avisan
'Si el usuario da click del centro hacia los bordes top,left del Picturebox
'Quiere decir que lo que quiere no es Resize sino moverlo
'Aqui comienza otra historia, la del evento Drag & Drop
If e.X < (PictureBox1.Right - Me.PictureBox1.Left) / 2 And e.Y < (Me.PictureBox1.Bottom - Me.PictureBox1.Top) / 2 Then

Me.PictureBox1.Cursor = Cursors.SizeAll
allowResize = False
End If
End Sub


'Evento MouseMove donde realizamos el Resize
Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

'Enable Reize allowResize = true
If allowResize Then

'A continuacion simplemente manejo los cambios de dimensiones
'dependiendo hacia donde se mueva el mouse
'Si el mouse se mueve hacia la derecha y hacia abajo a la vez
'Hago un calculo con ciertas posiciones que tiene el picturebox
'Como rigth, left, etc.. Esto si averiguen en Visual, ya saben click derecho "Go to definition" ;)
If e.X >= (PictureBox1.Right - Me.PictureBox1.Left) - 5 And e.Y >= (Me.PictureBox1.Bottom - Me.PictureBox1.Top) - 5 Then

'Cambio el Ancho y el Alto con este calculo, crece
'Esto funciona pero si quieren que lo explique a mayor profundidad, poner mensaje
Me.PictureBox1.Width = Me.PictureBox1.Right - Me.PictureBox1.Left + 5
Me.PictureBox1.Height = Me.PictureBox1.Bottom - Me.PictureBox1.Top + 5

Me.PictureBox1.Refresh()

'Si el raton se mueve hacia la derecha, crece
ElseIf e.X >= (PictureBox1.Right - Me.PictureBox1.Left) - 5 Then
Me.PictureBox1.Width = Me.PictureBox1.Right - Me.PictureBox1.Left + 5

Me.PictureBox1.Refresh()

'Si el raton se mueve hacia abajo, crece
ElseIf e.Y >= (Me.PictureBox1.Bottom - Me.PictureBox1.Top) - 5 Then
Me.PictureBox1.Height = Me.PictureBox1.Bottom - Me.PictureBox1.Top + 5

Me.PictureBox1.Refresh()

'Si el raton se mueve hacia la izquierda y hacia arriba, decrece
ElseIf e.X < (PictureBox1.Right - Me.PictureBox1.Left) - 10 And e.Y < (Me.PictureBox1.Bottom - Me.PictureBox1.Top) - 10 Then Me.PictureBox1.Width = Me.PictureBox1.Right - Me.PictureBox1.Left - 3 Me.PictureBox1.Height = Me.PictureBox1.Bottom - Me.PictureBox1.Top - 3 Me.PictureBox1.Refresh() 'Si el raton se mueve hacia la izquierda, decrece
ElseIf e.X < (PictureBox1.Right - Me.PictureBox1.Left) - 5 Then Me.PictureBox1.Width = Me.PictureBox1.Right - Me.PictureBox1.Left - 3 Me.PictureBox1.Refresh() 'Si el raton se mueve hacia arriba, decrece
ElseIf e.Y < (Me.PictureBox1.Bottom - Me.PictureBox1.Top) - 5 Then Me.PictureBox1.Height = Me.PictureBox1.Bottom - Me.PictureBox1.Top - 3 Me.PictureBox1.Refresh() End If Else
'Aqui levantaria el DoDragDrop, otra historia como dije antes

End If
End Sub


'Por ultimo el MouseUp que indica que termino el resize
Private Sub PictureBox1_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp

Me.PictureBox1.BorderStyle = BorderStyle.None

'Con esto termina el resize
allowResize = False
End Sub


Nada del otro mundo verdad, pero me mate buscando en internet y no encontre nada que se ajuste a lo que la gente preguntaba, porque hacer Resize at Runtime no es simplemente cambiarle PictureBox.SizeMode a Zoom o algo asi, es cambiar las dimensiones intentando simular a los editores de graficos.

Es por esto que cuelgo este tema, y aclaro que falta pulirlo un poco pero al menos con esto ya puedes seguir trabajando porque los jefes no esperan jeje si hacen mejoras ya saben compartan

jueves 27 de marzo de 2008

Añadir Boton Font a tu aplicacion

Nada del otro mundo pero le puede servir a alguien (algo de tiempo ahorrado siempre ayuda)

Como pueden ver, agregamos el boton que va a hacer las veces de Font Button para nosotros, lo que vamos a visualizar es el cuadro de dialogo de los fonts al hacer click (ver foto mas abajo)

y aqui va el codigo del boton:

Private Sub Font_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Font_Button.Click Dim font_dialog As New FontDialog

'Verifica si la fuente escogida por el usuario existe y sino retorna un msg de error
font_dialog.FontMustExist = True


'Set a minimum and maximum size to be
shown in the FontDialog.
'Rango de tamaños de letra (8 - 32
)
font_dialog.MaxSize = 32
font_dialog.MinSize = 8


'Show the Apply button in the dialog.

font_dialog.ShowApply = True
'

Show effects such as Underline and Bold.

font_dialog.ShowEffects = True

'Aqui aparece el cuadro de dialogo que nos permite trabajar
'Con todas las funcionalidades de las fuentes


If font_dialog.ShowDialog() = DialogResult.OK Then
'Si el usuario presiona Ok se aplicaran los cambios al texto seleccionado
'Para mi caso el Text de mi Textbox que queria modificar

TxtBoxPiece.Font = font_dialog.Font 'Cambiamos la fuentey las demas propiedades
_
TxtBoxPiece.Size = New Drawing.Size((TxtBoxPiece.Text.Length) * font_dialog.Font.Size, font_dialog.Font.Height) 'Cambiamos el tamaño del Textbox para visualizar correctamente el texto modificado

End If

End Sub

PD.: Este fuente tiene cosas agregadas pero lo tome de un sitio para acomodarlo a mi app, asi que cualquier parecido ya saben

miércoles 26 de marzo de 2008

Problema con Combobox (entre Load y SelectedIndexChanged)

El escenario del problema es el siguiente, tenemos:
- Evento Load del Form
- Evento SelectIndexChanged del Combobox
- El evento SelectIndexChanged no se levanta correctamente, para mi caso dicha falla se ve reflejada en que no cargue informacion en otro control

Al cargar desde un Dataset un combobox, si queremos inicializar (el texto que aparecera en el combo cuando se abre la app por primera vez) el combo con alguno de los elementos que cargue en el mismo, simplemente no ocurrira. El problema (bug de Visual x cierto) es que el evento SelectIndexChanged se levanta apenas se comienza a cargar el combo y eso ocasiona que la inicializacion se pierda.

Solucion: Remover el Handler del evento y ponerlo una vez cargado el combo, con el codigo lo entenderan mejor


Private Sub Frm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Aqui removemos momentaneamente el Handler del evento

'SelectedIndexChanged que pertenece al Combo

RemoveHandler FlatComboBox.SelectedIndexChanged, AddressOf FlatComboBox_SelectedIndexChanged

Dim ds As New DataSet

'Esta funcion DataLayer.ReadData() es la que me trae los datos de la base en un dataset


ds = DataLayer.ReadData()

Me.OC_Select_System_FlatComboBox.DataSource = ds.Tables("System")

Me.OC_Select_System_FlatComboBox.ValueMember = "app"

Me.OC_Select_System_FlatComboBox.DisplayMember = "app"


'Aqui inicializo el index del Combo


Me.OC_Select_System_FlatComboBox.SelectedIndex = -1


'Ahora añadimos el Handler a donde corresponde


AddHandler FlatComboBox.SelectedIndexChanged, AddressOf
FlatComboBox_SelectedIndexChanged

'Y aqui elejimos el elemento con el que queremos inicializar nuesto combobox
'Es decir el texto que se va a mostrar en el Combo apenas abrimos nuestra app
'Se produce un cambio en el index y se levanta correctamente el evento

Me.OC_Select_System_FlatComboBox.SelectedIndex = 0

'
Luego de este paso, se levantara el evento SelectIndexChanged **

End Sub



** Solo para referencia pongo el evento SelectIndexChanged
Private Sub
FlatComboBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FlatComboBox.SelectedIndexChanged

Dim app As String = Me.FlatComboBox.Text


FillListBox( app)

End Sub



PD.: El codigo esta en VB.Net pero si lo quieren en C# aqui la solucion


http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx

Copy & Paste y la pagina se encarga del resto