hola antes que nada decir que yo de programación no tengo ni idea. pues a ver mi intención es hacer un mini programa que no necesite instalación que una vez lo compiles sea un simple exe, entonces necesito que alguien que sepa me diga que debería de usar y yo ya me buscaría la vida buscando código y demás por hay.
como ya he dicho de programación no se nada y después de llevarme un rato haciendo el diseño en el visual basic del excel me entero que no podría compilar lo que llevaba hecho para hacerlo funcionar sin que necesitase el excel en el ordenador donde lo llevase. entonces antes de cometer el mismo error, pues e pensado en preguntar a gente que sepa de la materia, para no volver a perder el tiempo.
a continuación os enseño lo que había hecho en visual basic
(http://i68.tinypic.com/2ns18af.jpg)
bien como podréis ver no es nada del otro mundo, la intención de este programa es que cuando metas las cantidades el programa te lo multiplique por los billetes y monedas que tiene representado a su izquierda, este resultado te lo enseñe en importe el cual no puedas tocar me refiero que no puedas modificar por otras cantidades o borrar y abajo donde pone total te lo sume y haga lo mismo solo mostrarte el resultado sin que puedas modificar o borrar la cantidad que te de.
aquí tenéis en excel hecho lo que quiero hacer, por si no entendéis lo que intento explicar
https://www.justbeamit.com/vgudp (https://www.justbeamit.com/vgudp)
pues eso me gustaría hacer que fuese un exe y que no necesite de instalación, ya que donde se ejecutaría es un PC antiguo sin acceso a internet y al que tampoco se le puede instalar cosas.
entonces en que programa hago de nuevo el diseño, programo el tema de las multiplicaciones y la suma y que una vez lo compile quede en un simple exe
No sé quien te haya dicho que no puedes hacerlo en VB, pero es completamente falso.
Ahora bien, para una cosa tan sencilla, no necesitas excel para nada.
Crea la interfaz desde el propo Visual Basic.
Debes crear una función llamada totalizar, que recalcula la suma total, cada vez que cambie un valor (mejor que usar el evento 'change' usar el evento 'validate').
Tengamos controles de texto llamados txtBillete50, txtBillete20, ...txtBillete1, ... txtBillete01... txtBillete001, en estos usaremos el evento validating para verificar que el valor recibido es válido como número. Es entonces cuando si pasa la validación, cambia el valor de la casilla de la derecha. Y cada vez que la casilla de texto de la derecha cambie, se totaliza... y el resultaod se pone en txtTotal.
Los controles de la derecha los he llamado tal que txtImporte50, txtImporte20 y txtImporteX5 (se me coló el X, ya no lo voy a cambiar). Estos controles les he puesto la propiedad 'Readonly' a TRUE, para que el usuario no pueda modificar el valor y el fondo de color amarillo.
Los controles 'label' (etiquetas), no importa el nombre que tengan...
Al código, se adjunta una pequeña vistosidad... el evento validating, solo salta cuando el control 'pierde el foco', eso implica que mientras no se pinche en otro lado, no se ejecutará el código asociado... entonces mientras editamos el texto de los txtBillete... cambiamos su color de fondo, a beige, y cuando haya sido validado a blanco... También puede optarse por ocultar el txtTotal cuando se está editando los txtBillete... y hacerlo visible cuando saltó el evento 'validated'... así el resultado no se podría saber hasta no haber validado el control siendo editado. Pero bueno, queda a tu esfuerzo...
Te pego todo el código de lo que se ve en la ventana...
Qué falta: pués poner el resto de controles para el resto de monedas, y añadir el manejador de eventos de cada caso correspondiente. Puedes fijarte para ello en el código... Se puede optimizar, pero siendo neófito, así te vale para poder 'entenderlo'.
Aquí una imagen de la interfaz:
(https://i.imgur.com/Pfdc6R8.png)
Si ejecutas el código paso a paso (pulsa la tecla F11, cada vez), podrás ver como salta por el código...
Public Class Form1
Private Inicializado As Boolean
Private Sub txtBillete50_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete5.TextChanged
sender.backcolor = Color.Beige
txtTotal.Visible = False
End Sub
Private Sub txtBillete50_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtBillete50.Validated, txtBillete20.Validated, txtBillete5.Validated
sender.backcolor = Color.White
txtTotal.Visible = True
End Sub
Private Sub txtBillete50_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete50.Validating
Dim v As UShort 'UInt16 entero de 16 bits (valor en el rango: 0-65536)
' si admite un valor negativo, cambia al tipo short (int16)
If UShort.TryParse(txtBillete50.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
'txtImporte50.Text ="0"
Else
txtImporte50.Text = (v * 50).ToString
End If
End Sub
Private Sub txtBillete20_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete20.Validating
Dim v As UShort
If UShort.TryParse(txtBillete20.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 20'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte20.Text = (v * 20).ToString
End If
End Sub
Private Sub txtBillete5_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete5.Validating
Dim v As UShort
If UShort.TryParse(txtBillete5.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 5'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporteX5.Text = (v * 5).ToString
End If
End Sub
Private Sub Totalizar() Handles txtImporte50.TextChanged, txtImporte20.TextChanged, txtImporteX5.TextChanged
dim CantidadTotal As UInteger ' entero de 32 bits...
If (Inicializado = True) Then
CantidadTotal = 0
CantidadTotal += UInteger.Parse(txtImporte50.Text)
CantidadTotal += UInteger.Parse(txtImporte20.Text)
CantidadTotal += UInteger.Parse(txtImporteX5.Text)
txtTotal.Text = CantidadTotal.ToString
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Inicializado = True
End Sub
End Class
he hecho el mismo diseño y un copia y pega del código para llegar a entenderlo pero me salta un error
(http://i65.tinypic.com/fucg1w.jpg)
para no hacer 33 capturas a los textbox le e puesto el mismo nombre en el text que en el diseño por si e cometido algún error con tu explicación el cual no me doy cuenta
Parece que solo te falla el textbox de importe 5.
Fíjate que yo le he llamado "txtImporteX5", no "ImporteX5"
Los dos últimos fallos, te señala que en efecto no existe el control txtImporteX5, porque le diste un nombre distinto.
El primer error, también se corregirá ya que el manejador de eventos (handles), para dicho control se creará cuando tenga tal nombre.
Como los controles, deben alojar valores numéricos, no escribas nada en ellos durante diseño... a lo sumo un "0" (cero).
El código escrito en los txtBillete... en el evento validating, se asegura que lo que introduzcas sea un valor numérico...
Dim v As UShort
' Se puede convertir el contenido de este control en un número entero de 16 bits?
If UShort.TryParse(txtBillete20.Text, v) = False Then
' Si es que no, cancelamos la validación: el foco se mantendrá en el control
' hasta que se introduzca un valor numérico aceptable.
e.Cancel = True
' entonces no saltará el evento 'validated'.
else ' ok, pasó la validación, entonces
' entonces pasamos la cantidad de billetes a dinero en el textbox a su derecha.
' como es de 20, lo multiplicamos por 20. y lo convertimos a texto.
txtImporte20.Text = (v * 20).ToString
' ahora si saltará el evento 'validated' que ocurrirá justo tras esto.
end if
nuevo problema
(http://i67.tinypic.com/i3auj9.jpg)
hay varias formas de solucionar ese problema, el más facil es asignarle el valor 0 a los textbox, porque sino no convierte una cadena con valor nulo a entero, otra forma sería verificar que si el textbox tiene un valor asignado haga la conversión.En resumen en tiempo de diseño donde dice text(en las propiedades)darle un valor 0
Cita de: tincopasan en 25 Diciembre 2018, 07:24 AM
hay varias formas de solucionar ese problema, el más facil es asignarle el valor 0 a los textbox, porque sino no convierte una cadena con valor nulo a entero, otra forma sería verificar que si el textbox tiene un valor asignado haga la conversión.En resumen en tiempo de diseño donde dice text(en las propiedades)darle un valor 0
gracias con poner el 0 se me soluciono el problema.
lo que me gustaría saber ahora es que debería de poner para números con coma osea para monedas como seria 0,50 0,20, 0,10, 0,05 0,02 o 0,01
Private Sub txtBillete5_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete5.Validating
Dim v As UShort
If UShort.TryParse(txtBillete5.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 5'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporteX5.Text = (v * 5).ToString
End If
End Sub
porque si pongo en txtImporteX5.Text = (v * 5).ToString le pongo v * 0,05 me lo da como erroneo
Varias cosas:
1)en mi caso es raro que ponga un código hecho sin ver que a desarrollado quien pregunta, en este caso el código no es tuyo y supongo que el creador solo quiso orientarte, ya que es bastante malo(para mí)
2)
Citarhola antes que nada decir que yo de programación no tengo ni idea. pues a ver mi intención es hacer un mini programa que no necesite instalación que una vez lo compiles sea un simple exe
está bien, pero deberías usar lo que te dan(para aprender) y no esperar todo hecho
3)hay una herramienta muy buena se llama google
4)en este caso el problema es la declaración de las variables ya que usan enteros y necesitas flotantes.
5)algo simple como cambiar:
CantidadTotal += Single.Parse(txtImporteX5.Text)
en la función totalizar
6)no te ofendas, ponele algo de interés en aprender lo básico, como lo hiciste para usar esa asquerosidad de excel.
Es verdad, estamos hablando de céntimos, que son fraccines de moneda.
En programación, en general casi todos los lenguajes siguen para números la convención del lenguaje de origen (el inglés), donde el separador de decimales (por defecto) es el punto. Así 0.5 es la mitad de uno...
Al multiplicar puede optarse por poner el valor constante, o una representación (que siempre resultaría) (v* (1/2)), ya que 1/2= 0.5 y 1/10= 0.1
Eso sí en las fracciones declara 'v' como single, no como un tipo de datos numérico entero. Por tanto donde pone UShort, para esos casos sería Single
(como en dim v as single y en single.tryparse ... single.parse
Observa, por ejemplo para 1 céntimo: (le he llamado como al resto con el sufijo '001'):
Private Sub txtBillete001_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TxtBillete001.Validating
Dim v As Single
If Single.TryParse(TxtBillete001.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un número el valor para 'monedas de 1 céntimo'.", "Error: No es un número.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
/ Estas don líneas son equivalentes y al compilar generarían el mismo código porque la parte
/ diferente entre ambas son constantes, que se resuelven en dicho momento.
TxtImporte001.Text = (v * 0.1).ToString
'TxtImporte001.Text = (v * (1 / 10)).ToString
End If
End Sub
Por lo mismo (que tendremos decimales), en la función de totalizar, se debe cambiar el tipo de datos para "CantidadTotal", de UInteger a Single
Y por la misma razón la conversión de texto a número debe forzarse a single, no a UInteger...
Observa como va quedando... y nota como he añadido el manejador de eventos (Handle), a la función para txtImporte001.textchanged (que viene a decir que cuando el valor de ese textbox, cambie se ejecute esa rutina).
He añadido un ---!!!--- para que aprecies los cambios y añadidos respecto de la versión previa...
'------------------------------------------ !!!! ------------ !!! ----
Private Sub Totalizar() Handles TxtImporte001.TextChanged, txtImporte50.TextChanged, txtImporte20.TextChanged, txtImporteX5.TextChanged
' -------------------------!!!---
Dim CantidadTotal As Single ' entero de 32 bits...
If (Inicializado = True) Then
' ---------------------!!!-----
CantidadTotal = Single.Parse(txtImporte50.Text)
CantidadTotal += Single.Parse(txtImporte20.Text)
CantidadTotal += Single.Parse(txtImporteX5.Text)
' ---!!! -------------------------------!!!------
CantidadTotal += Single.Parse(TxtImporte001.Text)
txtTotal.Text = CantidadTotal.ToString
End If
End Sub
Nota, por último que debes añadir el handles para cada txtBilleteXXX que añadas nuevo, para las rutinas:
Private Sub txtBillete50_TextChanged(...) y Private Sub txtBillete50_Validated(...) tal y como yo he hecho en totalizar. No confundas, en éstas es el manejador del textbox billete... en aquella es el textbox de importe.
Nota también que cuando añades el handle, se indica el objeto (control) y el evento correcto... cualquier equivocación en el objeto o en evento, puede producir resutados inesperados, erróneos, o inexactos, impredecibles... a saber...
...y bueno, ya deberías ser capaz de completarlo.
Cita de: tincopasan en 25 Diciembre 2018, 16:35 PM
Varias cosas:
1)en mi caso es raro que ponga un código hecho sin ver que a desarrollado quien pregunta...
Es un caso distinto, cuando alguien quiere aprender a programar y cuando alguien declara no tener ni idea ni estar interesado más que en resolver un único problema puntual y punto...
Así se presentaba:
Citarhola antes que nada decir que yo de programación no tengo ni idea.
Entonces no cabe indicarle que estudie, que aprenda... solo cabe darle algo de código simple (adaptado a los que presenta), pero que pueda entender aunque sea subóptimo y que complete el resto.
me e puesto a añadir los nuevos textbox y demas cosas pero cuando e añadido lo que serian los billetes de 10 no se porque demonios no hace la operacion correspondiente.
Public Class Form1
Private Inicializado As Boolean
Private Sub txtBillete50_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged
sender.backcolor = Color.White
txtTotal.Visible = True
End Sub
Private Sub txtBillete50_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtBillete50.Validated, txtBillete20.Validated, txtBillete10.Validated, txtBillete5.Validated, txtMonedas2.Validated, txtMonedas1.Validated, txtMonedas050.Validated, txtMonedas020.Validated, txtMonedas010.Validated, txtMonedas005.Validated, txtMonedas002.Validated, txtMonedas001.Validated
sender.backcolor = Color.White
txtTotal.Visible = True
End Sub
Private Sub txtBillete50_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete50.Validating
Dim v As UShort 'UInt16 entero de 16 bits (valor en el rango: 0-65536)
' si admite un valor negativo, cambia al tipo short (int16)
If UShort.TryParse(txtBillete50.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
'txtImporte50.Text ="0"
Else
txtImporte50.Text = (v * 50).ToString
End If
End Sub
Private Sub txtBillete20_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete20.Validating
Dim v As UShort
If UShort.TryParse(txtBillete20.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 20'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte20.Text = (v * 20).ToString
End If
End Sub
Private Sub txtBillete10_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs)
Dim v As UShort
If UShort.TryParse(txtBillete10.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 10'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte10.Text = (v * 10).ToString
End If
End Sub
Private Sub Totalizar() Handles txtImporte50.TextChanged, txtImporte20.TextChanged, txtImporte10.TextChanged
Dim CantidadTotal As Single ' entero de 32 bits...
If (Inicializado = True) Then
CantidadTotal = 0
CantidadTotal += Single.Parse(txtImporte50.Text)
CantidadTotal += Single.Parse(txtImporte20.Text)
CantidadTotal += Single.Parse(txtImporte10.Text)
txtTotal.Text = CantidadTotal.ToString
End If
End Sub
vale despues de muchos intentos y demas movidas ya lo tengo conseguido a continuacion el codigo y la aplicacion
https://www.justbeamit.com/tgk55
Public Class Form1
Private Inicializado As Boolean
Private Sub txtBillete50_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged
sender.backcolor = Color.White
txtTotal.Visible = True
End Sub
Private Sub txtBillete50_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtBillete50.Validated, txtBillete20.Validated, txtBillete10.Validated, txtBillete5.Validated, txtMonedas2.Validated, txtMonedas1.Validated, txtMonedas050.Validated, txtMonedas020.Validated, txtMonedas010.Validated, txtMonedas005.Validated, txtMonedas002.Validated, txtMonedas001.Validated
sender.backcolor = Color.White
txtTotal.Visible = True
End Sub
Private Sub txtBillete50_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete50.Validating
Dim v As UShort 'UInt16 entero de 16 bits (valor en el rango: 0-65536)
' si admite un valor negativo, cambia al tipo short (int16)
If UShort.TryParse(txtBillete50.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
'txtImporte50.Text ="0"
Else
txtImporte50.Text = (v * 50).ToString
End If
End Sub
Private Sub txtBillete20_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete20.Validating
Dim v As UShort
If UShort.TryParse(txtBillete20.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 20'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte20.Text = (v * 20).ToString
End If
End Sub
Private Sub txtBillete10_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete10.Validating
Dim v As UShort
If UShort.TryParse(txtBillete10.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 10'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte10.Text = (v * 10).ToString
End If
End Sub
Private Sub txtBillete5_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete5.Validating
Dim v As UShort
If UShort.TryParse(txtBillete5.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 5'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte5.Text = (v * 5).ToString
End If
End Sub
Private Sub txtMonedas2_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas2.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas2.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 2'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte2.Text = (v * 2).ToString
End If
End Sub
Private Sub txtMonedas1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas1.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas1.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 1'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte1.Text = (v * 1).ToString
End If
End Sub
Private Sub txtMonedas050_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas050.Validating
Dim v As Single
If Single.TryParse(txtMonedas050.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte050.Text = (v * 0.5).ToString
End If
End Sub
Private Sub txtMonedas020_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas020.Validating
Dim v As Single
If Single.TryParse(txtMonedas020.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.20'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte020.Text = (v * 0.2).ToString
End If
End Sub
Private Sub txtMonedas010_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas010.Validating
Dim v As Single
If Single.TryParse(txtMonedas010.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.10'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte010.Text = (v * 0.1).ToString
End If
End Sub
Private Sub txtMonedas005_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas005.Validating
Dim v As Single
If Single.TryParse(txtMonedas005.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.05'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte005.Text = (v * 0.05).ToString
End If
End Sub
Private Sub txtMonedas002_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas002.Validating
Dim v As Single
If Single.TryParse(txtMonedas002.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.02'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte002.Text = (v * 0.02).ToString
End If
End Sub
Private Sub txtMonedas001_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas001.Validating
Dim v As Single
If Single.TryParse(txtMonedas001.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.01'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte001.Text = (v * 0.01).ToString
End If
End Sub
Private Sub Totalizar() Handles txtImporte50.TextChanged, txtImporte20.TextChanged, txtImporte10.TextChanged
Dim CantidadTotal As Single ' entero de 32 bits...
If (Inicializado = True) Then
CantidadTotal = 0
CantidadTotal += Single.Parse(txtImporte50.Text)
CantidadTotal += Single.Parse(txtImporte20.Text)
CantidadTotal += Single.Parse(txtImporte10.Text)
CantidadTotal += Single.Parse(txtImporte5.Text)
CantidadTotal += Single.Parse(txtImporte2.Text)
CantidadTotal += Single.Parse(txtImporte1.Text)
CantidadTotal += Single.Parse(txtImporte050.Text)
CantidadTotal += Single.Parse(txtImporte020.Text)
CantidadTotal += Single.Parse(txtImporte010.Text)
CantidadTotal += Single.Parse(txtImporte005.Text)
CantidadTotal += Single.Parse(txtImporte002.Text)
CantidadTotal += Single.Parse(txtImporte001.Text)
txtTotal.Text = CantidadTotal.ToString
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Inicializado = True
End Sub
Private Sub txtBillete50_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete50.KeyPress
If Asc(e.KeyChar) = 13 Then
txtBillete20.Focus()
e.Handled = True
End If
End Sub
Private Sub txtBillete20_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete20.KeyPress
If Asc(e.KeyChar) = 13 Then
txtBillete10.Focus()
e.Handled = True
End If
End Sub
Private Sub txtBillete10_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete10.KeyPress
If Asc(e.KeyChar) = 13 Then
txtBillete5.Focus()
e.Handled = True
End If
End Sub
Private Sub txtBillete5_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete5.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas2.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas2.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas1.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas1.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas050.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas050_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas050.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas020.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas020_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas020.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas010.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas010_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas010.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas005.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas005_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas005.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas002.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas002_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas002.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas001.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas001_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas001.KeyPress
If Asc(e.KeyChar) = 13 Then
txtTotal1.Focus()
e.Handled = True
End If
End Sub
Private Sub Totalizar(sender As Object, e As EventArgs) Handles txtImporte50.TextChanged, txtImporte20.TextChanged, txtImporte10.TextChanged
End Sub
End Class
gracias por la ayuda de verdad os los digo.
El unico problemilla que me encuentro es que el icono no se aplicar en la ventana del propio programilla, solo se aplica al ejecutable y no se el porque. pero bueno lo que queria hacer ya esta hecho, nuevamente muchas gracias
Me alegro que lo hayas podido resolver...
Sin embargo, te hago 1 observación, y es que se puede presentar un problema.
Nos olvidaremos de optimizaciones, te funciona y resulta simple de entender, así te será fácil a futuro de modificar, para ampliar, etc...
El problema que puede aparecer:
----------------------------------------
Al principio, recordarás que para billetes declaramos como tipo de datos para 'v', ushort, esto implica que al tratar de convertir el texto a ushort, rechace cosas que no son números, pero también números negativos y números decimales... perfecto.
...pero en las monedas, si intentas meter en monedas (por ejemplo de 10 centimos) "10.46" te lo aceptará, y sin embargo el número de monedas no pueda ser decimal, el número de monedas siempre debe ser un número entero...
...e igualmente rechazar también valores negativos. También se podría poner "-11" en monedas y al calcular descontaría el valor de esas monedas... pero no creo que quieras aceptar números negativos.
(prueba a poner decimales o negativos en los billetes y verás que no deja, en cambio en las monedas si deja, y no es lo que queremos)
La solución pasa por tratar cada aspecto de la forma específica, la validación por un lado con el tipo sindecimales y sin números negativos, y por otro la asignación al textbox Importe de la derecha... y se puede proceder, de diferente manera. Lo resolvemos muy fácilmente...
Recuerda que entonces, debes cambiar el contenido (solo) de los txtMonedas..._Validating de la misma forma, que trato la de 50 céntimos, aquí:
Igualmente recalco con ---!!!--- donde hay cambios, para que prestes atención en la parte que cambia.
Private Sub txtMonedas050_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas050.Validating
'-------------------!!!----
Dim v As ushort
' -------- !!! -----
If ushort.TryParse(txtMonedas050.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
' ------------------------------------!!!---------
txtImporte050.Text = (0.5 * v).ToString ' antes: (v * 0.5).ToString
End If
End Sub
...y definitivamente te funcionará como quieres.
mmm...veo que no has hecho todo lo que te he dicho...
En totalizar tienes que añadir los handles de todos los controles tras cuyo cambio afectan al total:
Private Sub Totalizar() Handles txtImporte50.TextChanged, txtImporte20.TextChanged, txtImporte10.TextChanged
Detrás de "Handles"... observa que están solo los de los billetes de 50, 20, y 10, faltan los de 5 y los de las monedas...
En cambio en Private Sub txtBillete50_TextChanged(...) y en Private Sub txtBillete50_Validated(...) si que los añadiste, luego entiendo que lo anterior es un olvido...
vale he hecho los cambios que me has comentado, pero te comento que he encontrado un fallo el cual no se a que se debe. imagino que habrá que programarlo también. es el hecho en que si por ejemplo en los billetes de 50 pones 4 el resultado sera 200 y en la totalización dará 200, pero cuando llegas al billete de 5 y si en un principio pones que hay 5 que serian 25 el resultado en la totalización serian 225, pero si borras los 5 porque eran 6 el resultado te lo da que serian 30 pero en la suma no se efectúa dicho cambio en la operación, no se si me explico.
esta observación la veo que pasa a partir de los billete de 5
https://www.justbeamit.com/zk7mk
Public Class Form1
Private Inicializado As Boolean
Private Sub txtBillete50_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged
sender.backcolor = Color.White
txtTotal.Visible = True
End Sub
Private Sub txtBillete50_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtBillete50.Validated, txtBillete20.Validated, txtBillete10.Validated, txtBillete5.Validated, txtMonedas2.Validated, txtMonedas1.Validated, txtMonedas050.Validated, txtMonedas020.Validated, txtMonedas010.Validated, txtMonedas005.Validated, txtMonedas002.Validated, txtMonedas001.Validated
sender.backcolor = Color.White
txtTotal.Visible = True
End Sub
Private Sub txtBillete50_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete50.Validating
Dim v As UShort 'UInt16 entero de 16 bits (valor en el rango: 0-65536)
' si admite un valor negativo, cambia al tipo short (int16)
If UShort.TryParse(txtBillete50.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
'txtImporte50.Text ="0"
Else
txtImporte50.Text = (v * 50).ToString
End If
End Sub
Private Sub txtBillete20_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete20.Validating
Dim v As UShort
If UShort.TryParse(txtBillete20.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 20'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte20.Text = (v * 20).ToString
End If
End Sub
Private Sub txtBillete10_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete10.Validating
Dim v As UShort
If UShort.TryParse(txtBillete10.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 10'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte10.Text = (v * 10).ToString
End If
End Sub
Private Sub txtBillete5_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete5.Validating
Dim v As UShort
If UShort.TryParse(txtBillete5.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 5'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte5.Text = (v * 5).ToString
End If
End Sub
Private Sub txtMonedas2_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas2.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas2.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 2'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte2.Text = (v * 2).ToString
End If
End Sub
Private Sub txtMonedas1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas1.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas1.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 1'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte1.Text = (v * 1).ToString
End If
End Sub
Private Sub txtMonedas050_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas050.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas050.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte050.Text = (0.5 * v).ToString
End If
End Sub
Private Sub txtMonedas020_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas020.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas020.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.20'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte020.Text = (0.2 * v).ToString
End If
End Sub
Private Sub txtMonedas010_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas010.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas010.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.10'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte010.Text = (0.1 * v).ToString
End If
End Sub
Private Sub txtMonedas005_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas005.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas005.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.05'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte005.Text = (0.05 * v).ToString
End If
End Sub
Private Sub txtMonedas002_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas002.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas002.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.02'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte002.Text = (0.02 * v).ToString
End If
End Sub
Private Sub txtMonedas001_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas001.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas001.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.01'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte001.Text = (0.01 * v).ToString
End If
End Sub
Private Sub Totalizar() Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged
Dim CantidadTotal As Single ' entero de 32 bits...
If (Inicializado = True) Then
CantidadTotal = 0
CantidadTotal += Single.Parse(txtImporte50.Text)
CantidadTotal += Single.Parse(txtImporte20.Text)
CantidadTotal += Single.Parse(txtImporte10.Text)
CantidadTotal += Single.Parse(txtImporte5.Text)
CantidadTotal += Single.Parse(txtImporte2.Text)
CantidadTotal += Single.Parse(txtImporte1.Text)
CantidadTotal += Single.Parse(txtImporte050.Text)
CantidadTotal += Single.Parse(txtImporte020.Text)
CantidadTotal += Single.Parse(txtImporte010.Text)
CantidadTotal += Single.Parse(txtImporte005.Text)
CantidadTotal += Single.Parse(txtImporte002.Text)
CantidadTotal += Single.Parse(txtImporte001.Text)
txtTotal.Text = CantidadTotal.ToString
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Inicializado = True
End Sub
Private Sub txtBillete50_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete50.KeyPress
If Asc(e.KeyChar) = 13 Then
txtBillete20.Focus()
e.Handled = True
End If
End Sub
Private Sub txtBillete20_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete20.KeyPress
If Asc(e.KeyChar) = 13 Then
txtBillete10.Focus()
e.Handled = True
End If
End Sub
Private Sub txtBillete10_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete10.KeyPress
If Asc(e.KeyChar) = 13 Then
txtBillete5.Focus()
e.Handled = True
End If
End Sub
Private Sub txtBillete5_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete5.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas2.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas2.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas1.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas1.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas050.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas050_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas050.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas020.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas020_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas020.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas010.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas010_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas010.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas005.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas005_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas005.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas002.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas002_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas002.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas001.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas001_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas001.KeyPress
If Asc(e.KeyChar) = 13 Then
txtTotal1.Focus()
e.Handled = True
End If
End Sub
Private Sub Totalizar(sender As Object, e As EventArgs) Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged
End Sub
End Class
Cita de: PROFENIX en 26 Diciembre 2018, 22:20 PM
vale he hecho los cambios que me has comentado, pero te comento que he encontrado un fallo el cual no se a que se debe. imagino que habrá que programarlo también. es el hecho en que si por ejemplo en los billetes de 50 pones 4 el resultado sera 200 y en la totalización dará 200, pero cuando llegas al billete de 5 y si en un principio pones que hay 5 que serian 25 el resultado en la totalización serian 225, pero si borras los 5 porque eran 6 el resultado te lo da que serian 30 pero en la suma no se efectúa dicho cambio en la operación, no se si me explico.
esta observación la veo que pasa a partir de los billete de 5
Public Class Form1
'.... código previo omitido.
Private Sub Totalizar() Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged
Dim CantidadTotal As Single ' entero de 32 bits...
If (Inicializado = True) Then
CantidadTotal = 0
CantidadTotal += Single.Parse(txtImporte50.Text)
CantidadTotal += Single.Parse(txtImporte20.Text)
CantidadTotal += Single.Parse(txtImporte10.Text)
CantidadTotal += Single.Parse(txtImporte5.Text)
CantidadTotal += Single.Parse(txtImporte2.Text)
CantidadTotal += Single.Parse(txtImporte1.Text)
CantidadTotal += Single.Parse(txtImporte050.Text)
CantidadTotal += Single.Parse(txtImporte020.Text)
CantidadTotal += Single.Parse(txtImporte010.Text)
CantidadTotal += Single.Parse(txtImporte005.Text)
CantidadTotal += Single.Parse(txtImporte002.Text)
CantidadTotal += Single.Parse(txtImporte001.Text)
txtTotal.Text = CantidadTotal.ToString
End If
End Sub
'... código intermedio omitido.
Private Sub Totalizar(sender As Object, e As EventArgs) Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged
End Sub
End Class
De entrada tienes repetida la función... borra esta segunda que tienes al final del código
Tu problema es que no te ciñes a lo que te dije aqúi:
CitarNota también que cuando añades el handles, se indica el objeto (control) y el evento correcto... cualquier equivocación en el objeto o en evento, puede producir resutados inesperados, erróneos, o inexactos, impredecibles... a saber...
Fíjate que en esta rutina los eventos a enganchar, son los de cambio
de los textbox de IMPORTE (mira el código que te pasé como si lo tienen así, te lo pongo aquídebajo), y
NO el de los textbox de las CANTIDADES, que has puesto (mira tu rutina más arriba).
'------------------------------------------ !!!! ------------ !!! ----
Private Sub Totalizar() Handles TxtImporte001.TextChanged, txtImporte50.TextChanged, txtImporte20.TextChanged, txtImporteX5.TextChanged
' -------------------------!!!---
Dim CantidadTotal As Single ' entero de 32 bits...
If (Inicializado = True) Then
' ---------------------!!!-----
CantidadTotal = Single.Parse(txtImporte50.Text)
CantidadTotal += Single.Parse(txtImporte20.Text)
CantidadTotal += Single.Parse(txtImporteX5.Text)
' ---!!! -------------------------------!!!------
CantidadTotal += Single.Parse(TxtImporte001.Text)
txtTotal.Text = CantidadTotal.ToString
End If
End Sub
Es decir,
lo correcto es esto: Private Sub Totalizar() Handles
TxtImporte50.TextChanged, ...
y
no esto que has puesto:
Private Sub Totalizar() Handles
txtBillete50.TextChanged, ...
perdona no es que no me ciña a lo que me digas, es que no me di cuenta. cada vez que me dices que tengo que cambiar algo me voy fijando pero hay cosas que en el primer momento se me escapa no se porque pero lo veo igual y pienso joe pues no se donde esta la diferencia. sigo cambiando cosas y pruebo los cambios y digo esto tira, y pienso sera que hay no tenia que fijarme y yo lo e entendido mal.
bueno creo que ya esta todos los cambios aplicados
Public Class Form1
Private Inicializado As Boolean
Private Sub txtBillete50_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtBillete50.TextChanged, txtBillete20.TextChanged, txtBillete10.TextChanged, txtBillete5.TextChanged, txtMonedas2.TextChanged, txtMonedas1.TextChanged, txtMonedas050.TextChanged, txtMonedas020.TextChanged, txtMonedas010.TextChanged, txtMonedas005.TextChanged, txtMonedas002.TextChanged, txtMonedas001.TextChanged
sender.backcolor = Color.White
txtTotal.Visible = True
End Sub
Private Sub txtBillete50_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtBillete50.Validated, txtBillete20.Validated, txtBillete10.Validated, txtBillete5.Validated, txtMonedas2.Validated, txtMonedas1.Validated, txtMonedas050.Validated, txtMonedas020.Validated, txtMonedas010.Validated, txtMonedas005.Validated, txtMonedas002.Validated, txtMonedas001.Validated
sender.backcolor = Color.White
txtTotal.Visible = True
End Sub
Private Sub txtBillete50_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete50.Validating
Dim v As UShort 'UInt16 entero de 16 bits (valor en el rango: 0-65536)
' si admite un valor negativo, cambia al tipo short (int16)
If UShort.TryParse(txtBillete50.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
'txtImporte50.Text ="0"
Else
txtImporte50.Text = (v * 50).ToString
End If
End Sub
Private Sub txtBillete20_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete20.Validating
Dim v As UShort
If UShort.TryParse(txtBillete20.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 20'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte20.Text = (v * 20).ToString
End If
End Sub
Private Sub txtBillete10_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete10.Validating
Dim v As UShort
If UShort.TryParse(txtBillete10.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 10'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte10.Text = (v * 10).ToString
End If
End Sub
Private Sub txtBillete5_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete5.Validating
Dim v As UShort
If UShort.TryParse(txtBillete5.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 5'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte5.Text = (v * 5).ToString
End If
End Sub
Private Sub txtMonedas2_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas2.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas2.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 2'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte2.Text = (v * 2).ToString
End If
End Sub
Private Sub txtMonedas1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas1.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas1.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 1'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte1.Text = (v * 1).ToString
End If
End Sub
Private Sub txtMonedas050_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas050.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas050.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte050.Text = (0.5 * v).ToString
End If
End Sub
Private Sub txtMonedas020_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas020.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas020.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.20'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte020.Text = (0.2 * v).ToString
End If
End Sub
Private Sub txtMonedas010_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas010.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas010.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.10'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte010.Text = (0.1 * v).ToString
End If
End Sub
Private Sub txtMonedas005_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas005.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas005.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.05'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte005.Text = (0.05 * v).ToString
End If
End Sub
Private Sub txtMonedas002_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas002.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas002.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.02'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte002.Text = (0.02 * v).ToString
End If
End Sub
Private Sub txtMonedas001_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMonedas001.Validating
Dim v As UShort
If UShort.TryParse(txtMonedas001.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'monedas de 0.01'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
txtImporte001.Text = (0.01 * v).ToString
End If
End Sub
Private Sub Totalizar() Handles txtImporte50.TextChanged, txtImporte20.TextChanged, txtImporte10.TextChanged, txtImporte5.TextChanged, txtImporte2.TextChanged, txtImporte1.TextChanged, txtImporte050.TextChanged, txtImporte020.TextChanged, txtImporte010.TextChanged, txtImporte005.TextChanged, txtImporte002.TextChanged, txtImporte001.TextChanged
Dim CantidadTotal As Single ' entero de 32 bits...
If (Inicializado = True) Then
CantidadTotal = 0
CantidadTotal += Single.Parse(txtImporte50.Text)
CantidadTotal += Single.Parse(txtImporte20.Text)
CantidadTotal += Single.Parse(txtImporte10.Text)
CantidadTotal += Single.Parse(txtImporte5.Text)
CantidadTotal += Single.Parse(txtImporte2.Text)
CantidadTotal += Single.Parse(txtImporte1.Text)
CantidadTotal += Single.Parse(txtImporte050.Text)
CantidadTotal += Single.Parse(txtImporte020.Text)
CantidadTotal += Single.Parse(txtImporte010.Text)
CantidadTotal += Single.Parse(txtImporte005.Text)
CantidadTotal += Single.Parse(txtImporte002.Text)
CantidadTotal += Single.Parse(txtImporte001.Text)
txtTotal.Text = CantidadTotal.ToString
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Inicializado = True
End Sub
Private Sub txtBillete50_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete50.KeyPress
If Asc(e.KeyChar) = 13 Then
txtBillete20.Focus()
e.Handled = True
End If
End Sub
Private Sub txtBillete20_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete20.KeyPress
If Asc(e.KeyChar) = 13 Then
txtBillete10.Focus()
e.Handled = True
End If
End Sub
Private Sub txtBillete10_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete10.KeyPress
If Asc(e.KeyChar) = 13 Then
txtBillete5.Focus()
e.Handled = True
End If
End Sub
Private Sub txtBillete5_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtBillete5.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas2.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas2_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas2.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas1.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas1.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas050.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas050_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas050.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas020.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas020_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas020.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas010.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas010_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas010.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas005.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas005_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas005.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas002.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas002_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas002.KeyPress
If Asc(e.KeyChar) = 13 Then
txtMonedas001.Focus()
e.Handled = True
End If
End Sub
Private Sub txtMonedas001_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtMonedas001.KeyPress
If Asc(e.KeyChar) = 13 Then
txtTotal1.Focus()
e.Handled = True
End If
End Sub
End Class
Bien, pués ahora que parece que ya te funciona todo bien, vamos a hacer una optimización de reducción de código...
La rutina validating... Si te fijas bien, hay una por cada billete y moneda, pero el código que hacen es siempre el mismo... entonces vamos a parametrizar las diferencias para reunirlas en una sola función, y desde todas ellas invocar a esa.
Primero creamos la función que hará el trabajo de todas, y luego vemos de modificar una a modo de ejemplo pero que se aplica a todas (cambiando las diferencias):
Private Sub ValidandoBiletesyMonedas(ByVal Valor As String, ByVal TxtDestino As TextBox, ByVal FactorConv As Single, ByVal TextoMsg As String, ByVal e As System.ComponentModel.CancelEventArgs)
Dim v As UShort
If UShort.TryParse(Valor, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un número el valor para" & TextoMsg, "Error: No es un número (entero y positivo).", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
TxtDestino.Text = (FactorConv * v).ToString
End If
End Sub
Como ves la rutina hace exactamente lo mismo que hemos venido haciendo en cada una, solo que está es 'universal' para todas ellas... Puede ser llamada desde todas las otras que tienen ese código, con una sola línea en aquellas llamando a esta, con los valores adecuados en sus parámetros...
Ahora te pongo, como se ha cambiado una de ellas, para que de modo similar, apliques el cambio a todas, fijándote bien en los valores que pones en la llamada a esta función recién redactada...
De ejemplo tomamos la de 1 céntimo... nota que dejo comentado el código previo que tenía... te sirve para verificar que los datos que pasas a la función son los mismos que ahí tienes, cuando funciones bien, puedes eliminarlo y estarás eliminando unas 100 líneas de código de un plumazo.
Private Sub txtMonedas001_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TxtBillete001.Validating
' sender se refiere siempre al objeto que lo llama, aquí txtMonedas001, poner sender.text es casi lo mismo que poner txtMonedas001.text
Call ValidandoBiletesyMonedas(sender.text, TxtImporte001, 0.1, " 'monedas de 1 céntimo'.", e)
'Dim v As UShort 'Single 'UShort
'If UShort.TryParse(txtMonedas001.Text, v) = False Then
' e.Cancel = True
' Call MessageBox.Show("No puede tomarse como un número el valor para 'monedas de 1 céntimo'.", "Error: No es un número.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
'Else
' TxtImporte001.Text = (0.1 * v).ToString
'End If
End Sub
Cuando compruebes que te funcionen bien (porque no equivocaste los valores que se pasan a la función), puedes eliminar el código comentado en cada función, y mira como queda reducido:
Private Sub txtMonedas001_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TxtBillete001.Validating
Call ValidandoBiletesyMonedas(sender.text, TxtImporte001, 0.1, " 'monedas de 1 céntimo'.", e)
End Sub
p.d.: Cuando hagas esa optimización y te salga bien... sin errores (si quieres, por supuesto), todavía volveremos a optimizarlo más, no solo esa, también las de KeyPress... para que sean remplazas todas por solo 2 funciones en cada caso.
lo que me comentas que deberia de cambiar para optimizar seria esta parte del codigo ?
Private Sub txtBillete50_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtBillete50.Validating
Dim v As UShort 'UInt16 entero de 16 bits (valor en el rango: 0-65536)
' si admite un valor negativo, cambia al tipo short (int16)
If UShort.TryParse(txtBillete50.Text, v) = False Then
e.Cancel = True
Call MessageBox.Show("No puede tomarse como un numero el valor para 'billete de 50'.", "Error: No es un numero.", MessageBoxButtons.OK, MessageBoxIcon.Warning)
'txtImporte50.Text ="0"
Else
txtImporte50.Text = (v * 50).ToString
End If
End Sub
y si es asi te refieres que elimine todos esos codigo y lo sustituya por el que me comentas aqui, pero claro poniendo los nombres de los billetes y monedas que corresponde en cada uno.
Private Sub txtMonedas001_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TxtBillete001.Validating
Call ValidandoBiletesyMonedas(sender.text, TxtImporte001, 0.1, " 'monedas de 1 céntimo'.", e)
End Sub
es que esta parte es la que no llego a comprender bien del todo, la verdad y no se si te estas refiriendo a eso o a otra cosa.
P.D. me traido el programita al pc donde se ejecutara para probarlo, y no e tenido una cosa en cuenta no se si sera una metedura de pata muy grande y tendre que comenzar desde 0 o si por el contrario seria una tonteria, el caso es que no lo e pidido ejecutar porque este pc trabaja con windows 2000 de 32 bits y el programita el exe compilado es de 64 bits.
Hay forma sencilla de arreglar eso o tendre que empezar desde 0?
Citar...y si es asi te refieres que elimine todos esos codigo y lo sustituya por el que me comentas aqui, pero claro poniendo los nombres de los billetes y monedas que corresponde en cada uno...
Exacto, si...
Citarporque este pc trabaja con windows 2000 de 32 bits y el programita el exe compilado es de 64 bits.
Si el ordenador destino ha de ser fijo un windows 2000, hay que rehacerlo en vb6...
No obstante, no elimines el programa... si tarde o temprano, tienes que usarlo en un equipo más actual, pués ya lo tienes.
CitarHay forma sencilla de arreglar eso o tendre que empezar desde 0?
No. Son tecnologías distintas. En windows 2000 incluso es muy probable que no admita ningún framework más actual que el 1.1 o 2.0 de NET (no estoy seguro, habría que mirarlo).
Ya en el XP, la versión superior que admite es el NET 3.5
En fin, básicamente se puede rehacer con VB6, con cambios eso sí... La cuestión es si tienes un IDE de VB6...
Cita de: NEBIRE en 29 Diciembre 2018, 00:43 AM
Exacto, si...
Si el ordenador destino ha de ser fijo un windows 2000, hay que rehacerlo en vb6...
No obstante, no elimines el programa... si tarde o temprano, tienes que usarlo en un equipo más actual, pués ya lo tienes.
No. Son tecnologías distintas. En windows 2000 incluso es muy probable que no admita ningún framework más actual que el 1.1 o 2.0 de NET (no estoy seguro, habría que mirarlo).
Ya en el XP, la versión superior que admite es el NET 3.5
En fin, básicamente se puede rehacer con VB6, con cambios eso sí... La cuestión es si tienes un IDE de VB6...
lo he compilado en x86 y con la versión framework.net 2.0 que es la mas baja que me permite el visual studio que yo tengo, lo probare hoy. con los resultados que obtenga te lo comentare.
después de intentar ejecutarlo me salta este error
(http://i66.tinypic.com/20kss2g.jpg)
habrá que hacerlo en visual basic finalmente ?
P.D. quiero recordar que ese ordenador no puedo instalar nada. me refiero a si me dices a mira eso instalas tal libreria de dll o lo que sea y se te soluciona. no puedo porque es el ordenador donde yo trabajo y no quiero joderla con los programas que ya maneja el propio ordenador, solo por la cosa de tener este mini programita de calculo.
Te está señalando que no encuentra el fichero mscoree.dll en ninguna de las rutas (environ Path) que el sistema tiene habilitado buscar...
Me temo que si, que finalmente te pediría como mínimo instalar el framework 2.0, en caso de que el win2000 lo admitiese.
Bueno, miro de hacerte el programa en VB6 y te lo paso, en realidad son 5 minutos... es de suponer que al menos sí tendrás ahí el runtime de VS6.0 instalado en ese equipo...
pd.: mscoree.dll es parte del runtime del .NET framework
Descargar desde aquí:
https://workupload.com/file/VTqLuWdj
Está comprimido con winrar. Después de extraerlo, aunque no tiene virus, siempre es recomendable pasarle el antivirus (por ejemplo desde https://www.virustotal.com ) antes de ejecutarlo, nunca se sabe si fue manipulado en la nube...
Una captura de como se ve...
(https://i.imgur.com/lNOhLV9.png)
Y aquí el código en vb6...
Private Const c_VALID_CHARS As String = "0123456789"
Private Const c_COLOR_AGUAMARINA As Long = &HF0F0E0
Private Const c_COLOR_ARENA As Long = &HC0D0E0
Private NextFoco As Integer
Private Valores As Variant
Private Sub Form_Load()
Valores = Array(50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01)
End Sub
Private Sub ComBorrar_Click()
Dim k As Integer
For k = 0 To 11
TxtMonedas(k).Text = "0"
Call TxtMonedas_Validate(k, False)
Next
Call Calcular
End Sub
Private Sub TxtMonedas_Change(Index As Integer)
TxtMonedas(Index).BackColor = c_COLOR_ARENA
TxtTotal.Text = String$(8, "-")
TxtImporte(Index).Text = String$(8, "-")
End Sub
' Limitado a 8 cifras.
' Es decir valor máximo admitido en cantidad es: 99.999.999
Private Sub TxtMonedas_Validate(Index As Integer, Cancel As Boolean)
Dim Valor As Long
If TryParseToLong(TxtMonedas(Index).Text, Valor) = False Then
Cancel = True
Call MsgBox("No se acepta como un número el contenido para " & TxtMonedas(Index).Tag, vbExclamation, "Error: No es un número (entero y positivo)")
TimFoco.Enabled = True ' para seleccionar su contenido listo para editar.
Else
TxtMonedas(Index).BackColor = c_COLOR_AGUAMARINA
TxtImporte(Index).Text = CStr(Valores(Index) * Valor)
Call Calcular
End If
End Sub
' Realiza la suma y presenta el resultado en el textbox del total.
Private Sub Calcular()
Dim k As Long, n As Single
For k = 0 To 11
n = (n + CSng(TxtImporte(k).Text))
Next
TxtTotal.Text = CStr(n)
End Sub
' por cada carácter en el texto verifica si es uno entre: "0123456789",
' si es así devuelve TRUE y el texto se convierte en el valor (un entero de 31 bits).
' si no devuelve FALSE y el valor se hace 0
Private Function TryParseToLong(ByRef Texto As String, ByRef Valor As Long) As Boolean
Dim k As Long
If (Len(Texto) > 0) Then
For k = 1 To Len(Texto)
If (InStr(c_VALID_CHARS, Mid$(Texto, k, 1)) = 0) Then
Valor = 0
Exit Function
End If
Next
Valor = CLng(Texto)
TryParseToLong = True
Else
Valor = 0
End If
End Function
'---------------------------------------------------
' Saltar el foco entre controles...
' En realidad para eso sirve la tecla 'tab'
' pero lo he dejado como tu tenías.
'---------------------------------------------------
'
' Entrega el foco al siguiente textbox.
Private Sub TimFoco_Timer()
TimFoco.Enabled = False
TxtMonedas(NextFoco).SetFocus
End Sub
' Deja seleccionado el contenido del textbox que tiene el foco (para editar/borrar fácilmente).
Private Sub TxtMonedas_GotFocus(Index As Integer)
With TxtMonedas(Index)
.SelStart = 0
.SelLength = Len(.Text)
End With
End Sub
' Si pasa la validación...
' Pasar el foco automáticamente al siguiente control.
' tras el último se pasa al botón total.
Private Sub TxtMonedas_KeyUp(Index As Integer, KeyCode As Integer, Shift As Integer)
Dim cancelar As Boolean
If (KeyCode = vbKeyReturn) Then
Call TxtMonedas_Validate(Index, cancelar)
If (cancelar = False) Then
NextFoco = (Index + 1)
If (Index < 11) Then
TimFoco.Enabled = True
Else
NextFoco = 0 'Index
ComTotal.SetFocus
End If
Else
TxtMonedas(Index).SetFocus
End If
End If
End Sub
Private Sub TxtMonedas_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
NextFoco = Index
End Sub
' el botón es competamente inútil, solo tiene por objeto invitar a pulsarlo para que
' el textbox que tiene el foco, pierda el control y proceda la validación.
' Y como adquiere el foco, presionar intro, entregamos el foco al primer textbox.
Private Sub ComTotal_KeyUp(KeyCode As Integer, Shift As Integer)
If (KeyCode = vbKeySpace) Then
NextFoco = 0
TimFoco.Enabled = True
End If
End Sub
Cuando estás editando un campo, se pone de color arena y la casilla de importe y del total, se borra su contenido (tal como se ve en la siguiente imagen), para indicar que debe recalcularse al termino de la edición... así cuando un valor aparece en el total, se corresponde fielmente con el contenido de cada casilla y todas tendrán su color de fondo en aguamarina.
(https://i.imgur.com/HmegbSL.png)
Por cierto me olvidaba decirte que usa la fuente "Segoe UI", así que cópiala de tu equipo y la pegas en el win 2000, si no intentará tomar la que mejor se adapte a las características... pero a saber si acierta, y puede verse mal.
He actualizado la descarga, tenía un pequeño error que colgaba el programa cuando se dejaba vacío el textbox...
Y he aprovechado para añadir un botón 'borrar' y una imagen de calculadora.
Recuerda que puedas saltar entre cajitas de texto, usando la tecla 'Tab' (esto en prácticamente todas las ventanas de Win2), pero igualmente he dejado la funcionalidad que tu tenías a través de la tecla 'intro' (tecla 'space' para el botón 'total').
(https://i.imgur.com/lERIzGp.png)
Hola te comento, yo uso visual estudio 2015 cree un nuevo proyecto elegi visual basic, y elegi la opcion universal de windows y luego la primera opcion, total que al form que aparece solo añadi un label y luego lo compile en x86. Para probar si asi en el pc del windows 2000 funcionaria y sigue sin ir. En cambio tu programita si que va. Con lo que me pregunto, que estoy haciendo mal en el visual studio ? O es que me tendria que buscar el visual basic 6.0 ?
aparte de eso tambien te comento otro problema que tengo.
en el visual estudio el codigo que me has puesto me salen errores por todos lados como por ejemplo diciendome de que Variant'; use el tipo 'Object' en su lugar y como ese mas cosas.
sospecho que algo estaré haciendo mal, el que ni idea.
alguna sugerencia de como arreglarlo ?
una captura de los fallos
(http://i63.tinypic.com/k480m8.jpg)
por otro lado de ese codigo no consigo diferenciar que nombre les tengo que poner a los textbox para hacerlos coincidir con el codigo que me pusiste, para ir entendiendolo mas o menos.
Citarlo compile en x86. Para probar si asi en el pc del windows 2000 funcionaria y sigue sin ir.
En windows 2000, no sé que versión soporta del NET framework, yo te decía como mucho hasta la versión 2.0, pero es probable que ni eso (jamás tuve la versión 2000, pasé directamente del 98 al XP).
En cualquier caso, si funcionara, como mínimo exige tener instalado el framework 2.0 Es decir si no está instalado, nunca funcionará ningún programa de NET que requiera NET Framework 2.0.
Vete a la carpeta de windows, (en el win 2000), mira una ruta tal que así (cambiando la unidad de instalación si no fuera "C:")
C:\WINDOWS\Microsoft.Net\Framework
Si existe dicha carpeta, ahí saldrán otras carpetas, cuyo nombre es similar a éste:
v2.0.50727
En ése caso indica que es la versión 2.0.xxx
Interesa ver cual es la versión mayor instalada, pués está señalando cual es/son los frameworks instalados de NET.
Si ni siquiera existe tal carpeta, o bien win 2000 no soporta NET, o bien no tienes ninnguna versión instalada.
Como dices que no quieres instalar nada... pués no tiene sentido que te diga:
Busca en la página de MS, la versión Net Framework 1.0, elige tu idioma (el mismo que tiene instalado el S.O. (español, inglés, ...???), lo descargas y lo instalas, luego igual con el Net Framework 1.1, luego igual con el Net framework 2.0, y luego con el Net framework 3.0 ... desde el momento en que te dijere que el S.O. no está diseñado, no admite ... es inútil instalar una versión más nueva. Pero al menos saber si tiene instalado o admite alguna versión, ayudaría...
CitarEn cambio tu programita si que va.
El programa está compilado en Visual Basic 6 (Visual Studio versión 6.0 (1998)).
...y el código expuesto (en ese mismo mensaje), es el código del programa.
Visual Basic (Visual Studio) 6.0 es enteramente compatible con Win 2000.
CitarCon lo que me pregunto, que estoy haciendo mal en el visual studio ?
sospecho que algo estaré haciendo mal, el que ni idea.
No puede copiarse y pegarse código de un proyecto en VS6.0 en un proyecto de NET (da igual qué versión) y esperar que funcione, sin cambios.
Citaralguna sugerencia de como arreglarlo ?
Puede uno copiar y pegar, si luego supiera recodificarlo haciendo los cambios pertienentes.
En las primeras versiones de VB NET (VB NET2003 y VB NET2005, al menos), había un importador de código de VS6, y añadía comentarios sobre lo que ya no se admitía y que lo remplazaba... aún siguiendo todas las directrices, no era ni mucho menos óptimo (más bien deficiente)... se trataba más de una estrategia para animar a la gente a migrar a VS NET
...pero no tiene sentido hacer eso, ya estuvimos anteriormente haciendo código para NET... y funcionaba.
Faltaba solo optimizarlo, hasta entonces el código era para que resultara asimilable de entender.
Qué sentido tendría ahora tomar código en VS6, para transformarlo a VB NET, si ya tenemos ese código en NET hecho?.
Ahora mismo, tu problema no es el código, tu problema es que la palataforma donde quieres integrarlo es completamente distinta de la plataforma de producción. ...Si win 2000 admite algún framework de NET (yo creo que sí, que alguno debe admitir), pero si no lo tienes instalado y no quieres instalarlo... son y serán incompatibles.
...pero ni siquiera tienes ese problema, toda vez que ya he creado yo el programa para tí, con Visual Basic 6.0...
Citar
O es que me tendria que buscar el visual basic 6.0 ?
Si quieres compilarlo por tu cuenta sí.
Pero ten en cuenta que sobre la interfaz se han reflejado valores en propiedades, que ahí no aparecen... por ejemplo los textbox de monedas, son un array de textboxes, lo mismo los textboxes de importe y los labels de valor.
Los arrays de controles en NET, es algo que nunca se adoptó... De hecho en las postrimerías, un proyecto que tuve que readaptar por exigencias de una empresa en mantener el código lo más similar (en apariencia textual) posible a VB6, tuve que remplazar tales arrays por colecciones del mismo nombre, para que al leer el código les 'sonara' como igual, aunque por debajo, era completamente distinto.
Pero bueno, si te consigues un IDE de VB6.0 y lo instalas, te paso el texto íntegro del proyecto, o mejor copia de los ficheros del proyecto.
El código aún tratandose del lenguaje Basic y del mismo "fabricante", es totalmente distinto en VB6 que en VB NET.
No merece la pena perder el tiempo aprendiendo VS6.
Para quien a estas alturas no sabe nada de él, es preferible que aprenda Visual Basic NET.
En cualquier caso, si todo lo que necesitabas era esa calculadora, ya la tienes... para qué darle más vueltas?.
Por cierto, no sé si te bajaste la versión previa o la última que puse, olvidé hacer el chequeo de cuando se dejaba en blanco el textbox, que cerraba el programa... para disitnguirlo de la previa, aproveché para poner una imagen de una calculadora en la esquina superior izquierda.
Por cierto tengo curiosidad por saber que significa eso de "...de la CM".
Pues para mi resulta una putada muy grande lo que me acabas de responder. porque después de calentarme la cabeza en como solucionar los distintos problemas de la versión que ya tenia casi lista que solo faltaba pulir la un poco, porque como dije desde el comienzo de programación 0 conocimientos y no esperaba ayuda como la que me has ofrecido, pues después de ver los resultados me estaba gustando e incluso podríamos decir que me estaba sintiendo orgulloso de haber conseguido lo que ya había conseguido, ahora resulta que todo se va a la ***** por culpa del Framework. siento un cabreo y frustración internamente de la ostia.
agradezco muchísimo tu ayuda y tu ofrecimiento de hacerlo por mi, de verdad te lo digo.
lo que a continuación voy a decir es el como lo habría hecho yo.
solo que yo no habría añadido esos colores a los textbox como hiciste tu, los habría dejado en blanco y el tipo de letra arial en negrita, no habría añadido el botón que pone total y como ultimo el sonido que hace cuando cambia de textbox si se pudiera lo habría anulado ya que es algo molesto. lo otro que imagino que es por cuestiones de ir rapido, es el tema de billetes que en el de 5 € a puesto un 0 delante y en las monedas de 0,50 se te paso poner un espacio con el simbolo del €
en cuanto al detalle del icono de la calculadora no lo habría puesto ni tampoco ese titulo en el programa calculadora monetaria.... lo habría llamado como que ya has visto calculadora de la CM.
repito agradezco muchísimo tu ofrecimiento, pero claro me encuentro ahora con un programa el cual el icono de la calculadora por ejemplo se solapa con las letras de al lado y de abajo, osea que esta como puesta encima de la C de calculadora y de la B de billetes, aparte de los detalles del 0 y del €. en cuanto a tamaño creo que si que esta bien o un pelin mas grande pero no mucho mas. el cual no e podido personalizarlo yo o el adaptarlo como le podría gustar al resto de mis compañero de trabajo pero sin que se flipasen lógicamente. imagino que de hay viene mi frustración, porque no tengo derecho a unas exigencia ni nada por el estilo, ante tu detalle altruista.
el problema de no poder instalar nada, no es cuestión mía, es porque se trata del pc de donde yo trabajo, que como es tan antiguo nadie se atreve a instalar le nada no vayan a joderse el propio windows O alguno de los programas ya instalado para que funcionen los programas de la empresa. porque sino a ver quien es el lumbrera que le dice al jefe que el pc se a jodido por hacer un programa el cual llevamos haciendo los cálculos en papel hace mas de 10 años y viendo lo que cobran por arreglar ciertas cosas en mi trabajo que uno mismo diría que eso no puede costar tanto dinero no me quiero ni imaginar lo que le podría costar una re instalación del sistema operativo y los programas de nuevo. de hay viene el tema este de no poder instalar le nada.
y para resolver tu duda de la CM, CM en mi trabajo significa caja manual.
pues nada, les ofreceré a mis compañeros tu programa y quien quiera usarlo que lo use y quien no, pues nada.
nuevamente te lo digo, gracias por tu tiempo y hacer el programa.
He realizado algunos cambios, siguiendo tus observaciones:
- El tipo de letra a Arial.
- Los colores los he atenuado, son casi blancos. El color amarillo en el fondo de un textbox, viene a indicar que no es editable por el usuario.
- La imagen de la calculadora, la he movido a la esquina superior izquierda (cordenadas 0,0)
- El título a la derecha de la imagen, movido un poco a la derecha.
- Los textos "Billetes", "Cantidad" e "Importe", movidos un poco más abajo...
- He puesto el espacio que se me escapó para los 50 céntimos,
- He retirado el cero para los billetes de 5 euros.
- El botón total no sobra, no es preciso usarlo si no se quiere.
- El título del programa lo he cambiado ligeramente con la info que aportas.
- El sonido se produce siempre que se pulsan ciertas teclas en un textbox editable (por ejemplo teclas: intro, escape)... para evitarlo, usad la tecla Tabulador (la tecla a la izquierda de la "Q"), cumple la misma funcionalidad que buscabas en la tecla intro... pero sin ese molesto sonido.
Debajo la imagen de como es ahora y como se veía antes (para comparar).
Espero que los cambios te satisfagan...
https://workupload.com/file/LLnV5LSM
(https://i.imgur.com/bqHLAaD.png)
ostias killo, no tengo palabras la verdad, muchisimas gracias.
una consulta, el framework sustituye archivos del SO o solo añade archivos ? no se si arriesgarme la verdad en instalar el framework 2.0 o no
por otro lado en conseguido el vb6.0
El framework de NET no remplaza ningún fichero existente (solo así mismo, es decir si se diera el caso que tienes un framework 2.0 dañado, pués obviamente si, pero lo remplaza por lo mismo que es o debería ser), crea nuevos ficheros. Incluso si tienes una versión previa, no la sobrescribe.