Usar un NumericUpDown como valor de const

Iniciado por SrTrp, 3 Agosto 2017, 18:18 PM

0 Miembros y 1 Visitante están viendo este tema.

SrTrp

Como puedo asignar el valor de un NumericUpDown como valor de una variable de const eh intentado hacerlo normalmente ajustando el valor de Numeric pero ni hací e intente haciendo una variable y tampoco, no se si debo definir una espicificacion del dato en la constante.
Código (vbnet) [Seleccionar]
    Dim MD As Integer  = NumericUpDown5.Value
Private Const mouted = MD

ivancea96

Un const es un valor que no cambia, y tiene que tener un valor fijo.

¿Por qué necesitas que sea un const?

Serapis

Una constante, como su nombre indica es constante. Luego no puede adjudicarse ningún valor por procedimiento.

Cuando se compila el valor queda fijado... es decir todas las constantes con remplazadas por el valor contante. por eso siempre dará error cuando intentes asignarlo desde una ubicación que en sí misma no sea también una constante.

Es decir esto es válido:
Código (vbnet) [Seleccionar]

Public Const c_Doce = 12
Public Const c_Trece = (c_Doce +1)


Y es válido porque c_doce tiene un valor que es constante y c_doce +1 , al ser tanto c_doce y 1 valores constantes es válido.
Esto no es válido:
Código (vbnet) [Seleccionar]

Public MiVar As integer = 12
Public Const c_Doce = MiVar


En fin, tu debes saber si realmente necesitas una constante o una variable. Si has de asignar un valor desde un control numericUpDown, desde luego no es una constante lo que necesitas. O bien, no entiendes lo que significa constante.
Si todavía necesitas que el valor del control numericUpdown, quede en la constante, lo que debes hacer es revisar que valor tiene durante diseño y ese mismo valor consignarlo en la constante... que tiene numericUpDown5.Value = 52, pués vas a tu contante y le pones ese valor
Private Const mouted = 52

Pero no puedes asignarlo por código, porque entonces sería una variable.

Hay una solución pero no merece la pena en la mayoría de casos, aún así te la comento, por si soluciona tu caso (ya que siendo una variable, actúa realmente como una constante):

   
Código (vbnet) [Seleccionar]
Private MiVar As Integer = 12

    Public Property Mouted As Integer
        Get
            Return MiVar
        End Get
        Set(ByVal value As Integer)
            Static FirstTime As Boolean = False
            If (FirstTime = False) Then
                MiVar = value
                FirstTime = True
            'Else
                 'Disparar error si se cree conveniente...
            End If
        End Set
    End Property



Y que se utilizaría así:
Código (vbnet) [Seleccionar]
Dim MD As Integer  = NumericUpDown5.Value
Mouted = MD


Este código te permite asignar un valor procedente desde donde quieras, pero una sola vez, luego opera como si fuera una constante, se puede leer pero no escribir. y fíjate que por defecto, también le podemos dar inicialmente un valor...

Eleкtro

Hola.

1. La propiedad NumericUpDown.Value es de tipo Decimal, no Integer. Puedes dejar que el compiler castee el tipo de forma implícita pero no es lo más apropiado. Deberías especificar la sentencia Option Strict On en tu código fuente... así te evitarás posibles errores humanos.

2. No puedes declarar la constante ya que eso no es un valor constante. Sencillamente.

Una solución alternativa de uso genérico seria declarar una propiedad de solo lectura... ( dependiendo claro está de los que realmente pretendas hacer ):

Código (vbnet) [Seleccionar]
Public ReadOnly Property Mouted As Double
    Get
        If (Me.NumericUpDown5 IsNot Nothing) Then
            Return Me.NumericUpDown5.Value
        Else
            Return 0.0R
        End If
    End Get
End Property


O bien:
Código (vbnet) [Seleccionar]
Public ReadOnly Property Mouted As Integer
    Get
        If (Me.NumericUpDown5 IsNot Nothing) Then
            Return CInt(Me.NumericUpDown5.Value)
        Else
            Return 0I
        End If
    End Get
End Property


...¿Y si nos explicas por qué quieres hacer eso?.

Saludos.








SrTrp

#4
Vaya tienen razón los 3 se los agradezco no tenia muy en claro como se usaba la constante y pues yo quiero que la "constante" en este caso ya sería una variable como me explican este actualizando su valor conforme vaya yo aumentando el valor del numericupdown
codigo
Código (vbnet) [Seleccionar]

Public Class Form1
'ESTE ES QUE EDITE Y LES MOSTRE
 Dim MD As Integer  = NumericUpDown5.Value
Private Const mouted = MD

'ACA ES EL NORMAL
   Private Const mouted = 4
   Private Const mouted1 = 2






Agrego intente con tipo de Decimal como me comento elektro pero aun así me da un error cabe en declarar  que todo lo estoy realizando desde una funcion.
Código (vbnet) [Seleccionar]

Dim mouted1  As Decimal = NumericUpDown5.Value
'este es el error
Referencia a objeto no establecida como instancia de un objeto.

Serapis

Ten en cuenta que antes de poder asignar un valor a una variable procedente de un control, antes debe haberse creado la instancia del control...
...Esto es, desde qué procedimiento estás asignando el valor del NumericupDown.

No sé si el código que has puesto es consecuente o si son dos intentos distintos. si es consecuente (uno le sigue al otro, es decir ambos están en activos), si ya has declarado mouted1 como constante, no puedes utilizarlo al mismo nivel como otro tipo. Si lo usas en otro nivel, será sombreando al que esté en un nivel más arriba... es decir no será copia ni tendrá nada que ver con la otra declaración.

Por otro lado, poque no aprovechas el evento Change del control NumericUpDown, para actualizar el valor de esa variable?
Código (vbnet) [Seleccionar]
private sub NumericUpDown5_Change(.....
    Mouted = e.value ' ...o Mouted= NumericUpDown5.value si solo hay ese objeto enganchado al evento...
end sub

SrTrp

#6
Ya lo hice mira como quedo, pero creo que no cambia el valor

Código (vbnet) [Seleccionar]

Public MU As Integer
   Public MD As Integer
   Dim mouseclickup As Decimal = MU
   Dim mouseclickdown As Decimal = MD

Eso es en mi función

y ahora aca este desde el control de numeric
Código (vbnet) [Seleccionar]
Private Sub NumericUpDown5_ValueChanged....
       MU = NumericUpDown5.Value
   End Sub

   Private Sub NumericUpDown4_ValueChanged...
       MD = NumericUpDown4.Value
   End Sub

Serapis

añade un messabox.message(mu.Tostring) a ambas funciones y ve cambiando valores al numeric a ver si cambia o no...

He de suponer que la declaración de MU y MD están en la misma clase que el control, no?????. Si no estás creando variables d eigual nombre en otra parte del proyecto...

Si tu código es así, con dos clases:

Código (vbnet) [Seleccionar]
public class MisCosas
  Public Md as decimal

'....
End class

private class form1

    private sub NumericUpDown5_valuechanged(...
          Md = NumericUpDown5.Value
    En sub
End class


Esto no va a funcionar...

Pero esto sí...
Código (vbnet) [Seleccionar]
public class MisCosas
  Public Md as decimal

'....
End class

private class form1
    private mc as new MisCosas

    private sub NumericUpDown5_valuechanged(...
          mc.Md = NumericUpDown5.Value
    En sub
End class


Si tienes dudas muévete paso a paso pulsando F12... y así ves por donde pasa y por donde no...

SrTrp

Listo muchas gracias solo cambie unas cosas de lo que me brindaste y quedo al 100  ;-)