Autor
|
Tema: necesito orientación sobre programación, me ayuda alguien ? (Leído 9,102 veces)
|
PROFENIX
Desconectado
Mensajes: 18
|
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 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/vgudppues 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
|
|
|
En línea
|
|
|
|
Serapis
|
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: 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
|
|
« Última modificación: 24 Diciembre 2018, 02:36 am por NEBIRE »
|
En línea
|
|
|
|
PROFENIX
Desconectado
Mensajes: 18
|
he hecho el mismo diseño y un copia y pega del código para llegar a entenderlo pero me salta un error 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
|
|
|
En línea
|
|
|
|
Serapis
|
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
|
|
« Última modificación: 24 Diciembre 2018, 15:32 pm por NEBIRE »
|
En línea
|
|
|
|
PROFENIX
Desconectado
Mensajes: 18
|
nuevo problema
|
|
|
En línea
|
|
|
|
tincopasan
Desconectado
Mensajes: 1.286
No es lo mismo conocer el camino que recorrerlo.
|
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
|
|
|
En línea
|
|
|
|
PROFENIX
Desconectado
Mensajes: 18
|
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
|
|
« Última modificación: 25 Diciembre 2018, 13:15 pm por PROFENIX »
|
En línea
|
|
|
|
tincopasan
Desconectado
Mensajes: 1.286
No es lo mismo conocer el camino que recorrerlo.
|
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) 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 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.
|
|
|
En línea
|
|
|
|
Serapis
|
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.
|
|
|
En línea
|
|
|
|
Serapis
|
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: hola 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.
|
|
|
En línea
|
|
|
|
|
|