Cuando compilo la app y la ejecuto me sale esto:
(http://img5.imageshack.us/img5/9674/prtscrcapturel.jpg)
Pero cuando ejecuto la app desde el IDE no me sale ningún error (Bueno, menos en la consola, me sale una excepción en rojo) pero el programa funciona perfectamente apesar de esa excepción...
¿Hay alguna manera de evitar que salga esa ventana sin tener que investigar dentro del código del form?
Esa ventana es aviso de una excepción no controlada, si lees da mucha información acerca de donde y como se dio el error, tienes que revisar el código en el lugar donde te dice que lo hubo, buscando valores inválidos, variables no inicializadas, divisiones por 0, desbordamientos y ese tipo de cosas.
Al menos allí se logra ver IndexOutOfRangeException, que es un tipo de excepción que resulta de excederse del Index en un arreglo, Por ejemplo una lista contiene 5 elementos, eso quiere decir que contiene los Index del 0 al 4, intentar llamar al 5 acabaría en esta excepción. Se puede ver que el error da en CargarPropiedades y que a su vez este método se llama desde el evento Form.Load.
Cita de: Keyen Night en 21 Noviembre 2012, 16:31 PM
Esa ventana es aviso de una excepción no controlada, si lees da mucha información acerca de donde y como se dio el error, tienes que revisar el código en el lugar donde te dice que lo hubo, buscando valores inválidos, variables no inicializadas, divisiones por 0, desbordamientos y ese tipo de cosas.
Gracias, pero entonces no se puede desactivar ese tipo de avisos desde el "app.config" o en algún sitio?
EDITO: Te agradezco mucho los datos que me has dado pero no me apetece nada buscar " divisiones por 0, desbordamientos" porque nos e hacerlo, y la app funciona perfectamente aunque el debugger me diga que no.
Lo he arreglado de una manera más fácil, añadiendo una excepción en el form load. :xD
Un saludo
Un error es señal de que algo anda mal, lo correcto es corregirlo no ignorarlo. No puedes caer ante un error, porque en todos los proyectos hasta en los mejores y más grandes incluso con los mejores programadores, los errores existen y la lógica es combatirlos. Aunque si en verdad deseas ignorarlo.....
En Configuraciones del Proyecto, puedes Activar el Handler de excepciones no controladas, y filtrar esta excepción para así ignorarla.
Proyecto > Aplicación (Es una pestaña) > Ver eventos de aplicaciones (Es un botón esta abajo al final) > Se abre una nueva ventana de código busca y agrega el evento UnhandledException > Y agregas esto:
If TypeOf e.Exception Is IndexOutOfRangeException Then
e.ExitApplication = False
End If
Tienes que tener en cuenta que cuando se da un error en un método todo el código que prosigue al lugar donde se dio el error no se ejecuta y el método se corta violentamente.
Dim A As Integer = 5
Dim B As Integer = 1
B -= 1
Dim C As Integer = A / B 'Error'
'Desde aquí se corta el método'
MessageBox.Show(C)
Este código tiene un error común, una variable se vuelve cero en tiempo de ejecución luego se hace una division que resulta en error, si configuramos nuestra aplicación para ignorar el error, entonces el valor de C nunca sería calculado y el mensaje tampoco seria mostrado
Es mala practica no controlar los errores, debes manejar todas las excepciones, validar absolutamente todo.
Cita de: DonVidela en 21 Noviembre 2012, 16:47 PM
Es mala practica no controlar los errores, debes manejar todas las excepciones, validar absolutamente todo.
Tienes toda la razón, es mala práctica, pero pienso que para solventar ese tipo de cosas hay que tener mejor dominio del lenguaje, del que tengo yo.
Un saludo!
Coloca el código que esta en Form_Load, nunca digas que no puedes hacer algo, aquí todos comenzamos con Hola Mundo, y como tu puedes ver ya has avanzado ¿o no? ;) No te rindas tan fácilmente se necesita mucha perseverancia para terminar un proyecto precisamente por la paciencia que hay que tener para hallar y solucionar los errores.
Cita de: Keyen Night en 21 Noviembre 2012, 16:54 PM
Coloca el código que esta en Form_Load, nunca digas que no puedes hacer algo, aquí todos comenzamos con Hola Mundo, y como tu puedes ver ya has avanzado ¿o no? ;) No te rindas tan fácilmente se necesita mucha perseverancia para terminar un proyecto precisamente por la paciencia que hay que tener para hallar y solucionar los errores.
Gracias.
Pues mejor pongo todo el form (Aún le estoy retocando lo del Drag&Drop):
Imports System.Windows.Forms
Imports System.IO
Public Class Form1
Dim filesystem As Object, ThisDir As Object
Dim mcheck(0) As CheckBox
Dim playerargs As String
#Region "Propertys"
'userSelectedPlayerFilePath
Public Property userSelectedPlayerFilePath() As String
Get
Return playertextbox.Text
End Get
Set(value As String)
playertextbox.Text = value
End Set
End Property
' userSelectedFolderPath
Public Property userSelectedFolderPath() As String
Get
Return foldertextbox.Text
End Get
Set(value As String)
foldertextbox.Text = value
End Set
End Property
#End Region
#Region "Load / Close"
' Form load
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Try
Me.Text = My.Settings.APPName & " - By Elektro H@cker"
If Not My.Computer.FileSystem.DirectoryExists(My.Settings.folderpath) Then
foldertextbox.Text = "Selext a folder..."
Me.Size = New System.Drawing.Size(362, 228)
Panel1.Size = New System.Drawing.Size(0, 0)
My.Settings.folderpath = Nothing
My.Settings.Save()
Else
foldertextbox.Text = My.Settings.folderpath
End If
If Not My.Computer.FileSystem.FileExists(My.Settings.playerpath) Then
playertextbox.Text = "Selext a music player..."
My.Settings.playerpath = Nothing
My.Settings.Save()
Else
playertextbox.Text = My.Settings.playerpath
End If
updatecheckboxes()
CargarPropiedades()
Catch
End Try
End Sub
' Form close
Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Dim mCheckados(0) As Int32
Dim Cuantos As Int32 = 0
Dim empty = Nothing
For Each c As CheckBox In Panel1.Controls
empty = "no"
Next
If Not empty = "no" Then
My.Settings.Valores = Nothing
Else
For i As Int32 = 0 To mcheck.Length - 1
If mcheck(i).Checked = True Then
Cuantos += 1
Array.Resize(mCheckados, Cuantos)
mCheckados(Cuantos - 1) = i + 1
End If
Next
My.Settings.Valores = mCheckados
End If
My.Settings.Save()
End Sub
#End Region
#Region "Save / Get settings"
' Generate propertys
Public Sub GenerarPropiedades()
Dim CheckedN As String = Nothing
For i As Int32 = 0 To mcheck.Length - 1
If mcheck(i).Checked = True Then
CheckedN &= i + 1
End If
Next
My.Settings.Save()
End Sub
' load propertys
Private Sub CargarPropiedades()
Dim ListaCheckados As Int32() = My.Settings.Valores
For i As Int32 = 0 To mcheck.Length - 1
For Each indiceCheckado As Int32 In ListaCheckados
mcheck(indiceCheckado - 1).Checked = True
Next
Next
End Sub
#End Region
#Region "Checkboxes"
' Checkbox drawing
Public Sub updatecheckboxes()
' delete the old checkboxes
Panel1.Controls.Clear()
' create the new checkboxes
Dim filesystem = CreateObject("Scripting.FileSystemObject")
Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
Dim i As Int32 = 0
Dim pos As Int32 = 10
For Each folder In ThisDir.Subfolders
Array.Resize(mcheck, i + 1)
mcheck(i) = New CheckBox
With mcheck(i)
.AutoSize = True
.Location = New Point(10, pos)
.Name = "CheckBox" & i + 1
.Text = folder.Name
End With
Me.Panel1.Controls.Add(mcheck(i))
AddHandler mcheck(i).CheckedChanged, AddressOf LlamadaCheckBox
i += 1
pos += 20
Next
End Sub
' Checkbox events
Public Sub LlamadaCheckBox(ByVal sender As Object, ByVal e As System.EventArgs)
Dim filesystem = CreateObject("Scripting.FileSystemObject")
Dim ThisDir = filesystem.GetFolder(My.Settings.folderpath)
Dim CheckboxN As CheckBox = CType(sender, CheckBox)
If CheckboxN.Checked = True Then
playerargs = playerargs & " " & ControlChars.Quote & Path.Combine(ThisDir.Path, CheckboxN.Text.ToString()) & ControlChars.Quote
Else
playerargs = Replace(playerargs, " " & ControlChars.Quote & Path.Combine(ThisDir.Path, CheckboxN.Text.ToString()) & ControlChars.Quote, "")
End If
End Sub
#End Region
#Region "Buttons"
' Folder button
Public Sub C1Button3_Click(sender As Object, e As EventArgs) Handles folderbutton.Click
Dim folderselected As New System.Windows.Forms.FolderBrowserDialog
Dim Resultado As DialogResult
folderselected.RootFolder = Environment.SpecialFolder.Desktop
Resultado = folderselected.ShowDialog
If Resultado.ToString() = "OK" Then
userSelectedFolderPath = folderselected.SelectedPath
My.Settings.folderpath = folderselected.SelectedPath
My.Settings.Save()
playerargs = Nothing
Me.Size = New System.Drawing.Size(362, 540)
Panel1.Size = New System.Drawing.Size(322, 296)
updatecheckboxes()
End If
End Sub
' Player button
Public Sub C1Button1_Click(sender As Object, e As EventArgs) Handles playerbutton.Click
Dim playerselected As New OpenFileDialog()
playerselected.InitialDirectory = Environ("programfiles")
playerselected.Title = "Select your favorite music player"
playerselected.Filter = "Music players|bsplayer.exe;mpc.exe;mpc-hc.exe;mpc-hc64.exe;umplayer.exe;vlc.exe;winamp.exe;wmp.exe"
PlayerDialog.FilterIndex = 1
Dim selection As System.Windows.Forms.DialogResult = playerselected.ShowDialog()
If selection = DialogResult.OK Then
userSelectedPlayerFilePath = playerselected.FileName
My.Settings.playerpath = playerselected.FileName
My.Settings.Save()
End If
End Sub
' Play button
Public Sub C1Button2_Click(sender As Object, e As EventArgs) Handles playbutton.Click
If Not playerargs = Nothing Then
Process.Start(userSelectedPlayerFilePath, playerargs)
If autoclose.Checked = True Then
Me.Close()
End If
Else
MessageBox.Show("You must select at least one folder...", My.Settings.APPName)
End If
End Sub
' Select ALL checkboxes
Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles selectall.CheckedChanged
If selectall.Checked = False Then
For Each ctrl In Panel1.Controls
ctrl.Checked = False
Next
selectall.Text = "Select all"
Else
For Each ctrl In Panel1.Controls
ctrl.Checked = True
Next
selectall.Text = "Unselect all"
End If
End Sub
#End Region
#Region "Drag & Drop"
Private Sub Panel1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel1.DragDrop
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Dim Objetos As String() = e.Data.GetData(DataFormats.FileDrop)
Panel1.Text = Objetos(0)
userSelectedFolderPath = Objetos(0)
My.Settings.folderpath = Objetos(0)
My.Settings.Save()
playerargs = Nothing
updatecheckboxes()
End If
End Sub
Private Sub Panel1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Panel1.DragEnter
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
e.Effect = DragDropEffects.All
End If
End Sub
Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles foldertextbox.DragDrop
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
Dim Objetos As String() = e.Data.GetData(DataFormats.FileDrop)
Dim attributes = Objetos(0)
If ((attributes And FileAttributes.Directory) = FileAttributes.Directory) Then
MsgBox("es un dir")
Else
MsgBox("no es un dir")
End If
foldertextbox.Text = Objetos(0)
userSelectedFolderPath = Objetos(0)
My.Settings.folderpath = Objetos(0)
My.Settings.Save()
playerargs = Nothing
updatecheckboxes()
End If
End Sub
Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles foldertextbox.DragEnter
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
e.Effect = DragDropEffects.All
End If
End Sub
#End Region
End Class
No ignores errores, no es necesario un conocimiento alto del lenguaje para detectar ese problema, el error es más que descriptivo.
En el método CargarPropiedades estas omitiendo validar algo.
Saludos
Hola.
Cita de: Novlucker en 21 Noviembre 2012, 17:08 PM
En el método CargarPropiedades estas omitiendo validar algo.
Cuando abres la app por 1ª vez, ¿cómo está inicializado
My.Settings.Valores ?
Podrías crearte un Sub con el código que metes en el FormClosing y ese Sub meterlo en Load llámandolo antes del
CargaPropiedades, si
My.Settings.Valores no está inicializado.
Saludos.
Cita de: HdM en 21 Noviembre 2012, 17:29 PM
Cuando abres la app por 1ª vez, ¿cómo está inicializado My.Settings.Valores ?
No se si te refieres a esto, es
Int32, con valor "
0"
Cita de: HdM en 21 Noviembre 2012, 17:29 PMPodrías crearte un Sub con el código que metes en el FormClosing y ese Sub meterlo en Load llámandolo antes del CargaPropiedades, si My.Settings.Valores no está inicializado.
¿Y como compruebo si está inicializada?
Yo he intentado un:
MsgBox(My.Settings.Valores.ToString())
para ver si es "0", pero no se ejecuta el msgbox (ni el resto de código que sigue debajo).
Pero el My.Settings.Valores lo definías como un array ¿no?
Compruébalo con:
If IsNothing(My.Settings.Valores) then
'llamas al Sub
End If
Pon un punto de interrupción y le pasas el mouse por arriba :xD
Saludos
Cita de: HdM en 21 Noviembre 2012, 18:08 PM
If IsNothing(My.Settings.Valores) then
'llamas al Sub
End If
lo he intentado, pero creo que no lo hago bien.
He descubierto que la excepción de la consola aparece solamente cuando cierro el form sin que haya ningún checkbox clickado, y me dice la consola lo de "IndexOutOf..."
Si ejecuto la app (compilada) sin que haya ningún checkbox seleccionado (por ejemplo el primer uso) pues me manda error, pero si habia algún checkbox seleccionado no me sale la ventana de error...
En cambio, si ejecuto la app desde la IDE sin que haya ningún checkbox clickado, la consola no dice nada de excepciones, pero si lo hago desde la app compilada con esas circunstancias si, es un poco raro ¿no?
Cita de: Novlucker en 21 Noviembre 2012, 18:11 PM
Pon un punto de interrupción y le pasas el mouse por arriba :xD
Saludos
Que significa para ti pasarle el mouse por arriba?, yo le pongo el breakpoint, pero...y luego? xD
(Perdón por el doble post)
Private Sub CargarPropiedades()
If Not IsNothing(My.Settings.Valores) Then
Dim ListaCheckados As Int32() = My.Settings.Valores
For i As Int32 = 0 To mcheck.Length - 1
For Each indiceCheckado As Int32 In ListaCheckados
mcheck(indiceCheckado - 1).Checked = True
Next
Next
End If
End Sub
Pero me sigue enviando otro tipo de errores:
************** Exception Text **************
System.ArgumentException: The property 'Valores' could not be created from it's default value. Error message: There is an error in XML document (1, 1).
at System.Configuration.SettingsPropertyValue.Deserialize()
at System.Configuration.SettingsPropertyValue.get_PropertyValue()
at System.Configuration.SettingsBase.GetPropertyValueByName(String propertyName)
at System.Configuration.SettingsBase.get_Item(String propertyName)
at System.Configuration.ApplicationSettingsBase.GetPropertyValue(String propertyName)
at System.Configuration.ApplicationSettingsBase.get_Item(String propertyName)
at PlayLists.My.MySettings.get_Valores() in C:\Users\Administrador\Desktop\WindowsApplication19\My Project\Settings.Designer.vb:line 86
at PlayLists.Form1.CargarPropiedades() in C:\Users\Administrador\Desktop\WindowsApplication19\Form1.vb:line 107
at PlayLists.Form1.Form1_Load(Object sender, EventArgs e) in C:\Users\Administrador\Desktop\WindowsApplication19\Form1.vb:line 60
at System.EventHandler.Invoke(Object sender, EventArgs e)
at System.Windows.Forms.Form.OnLoad(EventArgs e)
at System.Windows.Forms.Form.OnCreateControl()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.WmShowWindow(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WmShowWindow(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Intento empezar por el siguiente error pero...
System.ArgumentException: The property 'Valores' could not be created from it's default value. Error message: There is an error in XML document (1, 1).
¿A que documento XML se refiere? ¿y como es posible que me diga que el error está en el caracter 1 de la columna 1? suena imposible...
EDITO:
at PlayLists.Form1.CargarPropiedades() in C:\Users\Administrador\Desktop\WindowsApplication19\Form1.vb:line 107
línea 107:
If Not IsNothing(My.Settings.Valores) Then
Venga ya... :¬¬ :¬¬ :¬¬
Cita de: DonVidela en 21 Noviembre 2012, 16:47 PM
Es mala practica no controlar los errores, debes manejar todas las excepciones, validar absolutamente todo.
concuerdo contigo
uno debe poder predecir almenos el 95% de los posibles errores, y crear subrutinas capaces de subsanar el error en ejecucion
solucionar este tipo de errores que solo salen cuando esta compilado, y no salen en el IDE es facil, tenes varias posibilidades:
1 - comentar una parte del codigo, por ejemplo todo el codigo del evento form_load lo comentas y luego compilas y probas el programa, si no salta error el error esta ahi, mira que facil.
2 - vas poniendo msgbox por cada linea, te fijas hasta que msgbox llego antes de que salte el erorr y listo ahi tenes la linea del error.
me imagino que estas ejecutando el .exe que esta en bin/release y no el de debug.
saludos.
Hola.
Deja en el designer:
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute()> _
Public Property Valores() As Int32()
Get
Return CType(Me("Valores"), Int32())
End Get
Set(ByVal value As Int32())
Me("Valores") = value
End Set
End Property
Es decir sin valor por defecto (omitiendo Global.System.Configuration.DefaultSettingValueAttribute("0")). Así ya no debería darte problemas el IsNothing()
Saludos.
Cita de: seba123neo en 21 Noviembre 2012, 19:48 PM
me imagino que estas ejecutando el .exe que esta en bin/release y no el de debug.
La verdad es que no... estaba con el debug, no conozco las diferencias entre compilar en modo "release" y "debug", pensé que solo era para facilitar la diferencia entre la versión debug y la release, pero voy a googlear sobre eso, gracias!
Cita de: HdM en 21 Noviembre 2012, 20:06 PM
<Global.System.Configuration.UserScopedSettingAttribute(), _
Global.System.Diagnostics.DebuggerNonUserCodeAttribute()> _
eres un genio de VB, un pequeño problema menos!
Gracias,
Saludos
La diferencia es el modo en que el compilador optimiza el MSIL resultante, y es incluso un poco más notorio en el código generado para VB.NET, ya que dado que se permite el incluir puntos de interrupción en código no ejecutable (en C# no es posible), se agregan pequeñas instrucciones nop que en modo release son eliminadas.
Saludos
misiles resultantes... :xD instrucciones nop... en fin, más cosas que googlear xD, Gracias por la info Nov
Te recomiendo que aprendas sobre Excepciones, Saludos ;)