Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#1961
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.
Código (vbnet) [Seleccionar]

   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...
#1962
.NET (C#, VB.NET, ASP) / Re: dibujar en 3D
25 Diciembre 2018, 17:07 PM
Cita de: s_azazel en 25 Diciembre 2018, 12:00 PM
Muchas gracias por la respuesta NEBIRE

Si algun moderador puede que mueva el post no me di cuenta sorry :(

Usando una funcion de proyeccion no podre girar la imagen con el raton no???

He estado indagando por internet y he visto la opcion de usar los directX aun que parece complicada la cosa....:(

Con directX, se puede hacer de todo, pero en efecto, se requiere empolvarse en DirectX... es toda una tecnología por sí misma, que reqiere su propia curva de aprendizaje... lo mismo que utilizar cualquier otro motor 3D...

La cuestión es... ¿qué necesitas hacer?.
A - Si es tan solo lo que que dices al abrir el tema,(importar de un fichero datos 3D para dibujarlos) posicionar unas líneas dadas sus cordenadas 3D, te basta esa función que te digo. Esto te lo puedo poner más tarde, quizás mañana porque hoy tengo el día completo.

B - Si precisas además (de dibujar) poner rotación, desplazamiento y escala necesitas además otras funciones que roten, desplacen y escalen las cordenadas 3D. Esto implica (por razones de eficiencia) multiplicación de matrices, con lo que se añade un puñado de pequeñas funciones adicionales... Esto da más pereza, pero igualmente te miraría de ponerlo mañana o con más tiempo.

C - Si precisas tener control de muchos objetos, y ya no te basta con líneas, quieres cortar las líneas que queden tapadas por otras, ó meter texturas, tratar luz, colisiones, etc... entonces esto escapa de la ayuda de un foro, pero sobretodo el tiempo que uno está dispuestos a dedicar a ayudar... directamente es mejor que busques como usar un motor 3D, ya hecho. DirectX y OpenGL, serían tu punto de mira inicial, aunque los hay más específicos para según que tareas...

En fin declara cual de los 3 sería tu caso... para orientarte en la dirección que precisas.

Y sí, el ratón puede usarse para girar, tratando los eventos de ratón y decidiendo claramente que ejes se mueven con que eje del ratón (el eje Z, puede simularse con movimientos en diagonal, en tanto que los ejes X e Y con movimientos en X e Y del ratón)... (para esto estaríamos hablando como mínimo del caso "B").

Basicamente con cada moviento del ratón recalculas los ángulos de vista, se borra la imagen y se recrea de nuevo. Para que funciones en tiempo real, el cálculo debe ser fluído, lo que depende directamente d ela cantidad de objetos a dibujar y calcular y de la eficiencia del cálculo. Piensa que un cálculo como el que te sugiero, es apto sólo para unas pocas miles de líneas, si es más pesado, el cálculo puede demorarse y no será fluído en tiempo real... en tal caso hay que recurrir a usar motores cuyo cálculo se realiza directamente con la GPU, en vez de con la unidad flotante de la CPU...
#1963
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.
#1964
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'):
Código (vbnet) [Seleccionar]

    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...
Código (vbnet) [Seleccionar]

    '------------------------------------------ !!!! ------------ !!! ----
    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.
#1965
.NET (C#, VB.NET, ASP) / Re: dibujar en 3D
24 Diciembre 2018, 15:57 PM
En primer lugar este es el espacio para  visual basic 6 y anteriores. el foro de visual Basic NET es otro...

En segundo lugar, claro que se puede. Ahora mismo no recuerdo si hay un espacio de nombres reservado para ello...
...pero a las duras, simplemente necesitas una función para convertir las cordenadas 3D en 2D y luego usar Drawing2D para dibujarlas.

Desde luego mucho mejor crear una clase que empaquete todo, así puedas tener medidas del mundo3d, factor de escala, y cordenadas de rotación.

Si vas a dibujar más de un objeto 3D y cada uno con sus repectivas cualidades, entonces además necesitarás una clase que actúe de colección y reciba todos los objetos contenidos en él... vamos un pequeño motor 3d...

...si saco tiempo hoy o mañana, a ver si te pongo una función de proyeccción (que es  el nombre que recibe la conversión de cordenadas 3D en cordenadas 2D, que son las que se dibujan en la pantalla).
#1966
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...
Código (vbnet) [Seleccionar]

       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

#1967
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...
Código (vbnet) [Seleccionar]

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
#1968
No sé de que se extrañan...
Una IA, es como un niño de 3-5 años... los disparates son algo normal. No son conscientes, pese a que muchos se les llena la boca con el palabro 'inteligencia artificial'.

Lo que no es normal es que adulto pretenda basar o confiar su vida en lo que le diga una inteligencia de un niño de 3-5 años, y si lo hace, luego quejarse.
#1969
China, China, siempre China cochina...

Las autoridades chinas parecen enfermos mentales con la posibilidad de la dominación mundial...
#1970
Esto no es ni más ni menos que una decisión personal de algún directivo de la operadora en aquel sitio... sin ninguna duda tiene intereses económicos en la industria de 'autor' (quien sabe si le están pagando por ello).

Ya veremos que harán cuando los usuarios siendo conocedores del hecho decidan cambiarse de operadora.