2011-05-20 10 views
6

preguntándome si alguien sabe de una forma de implementar un tipo de tipo anulable como NullableOfInteger en VB6? (Estoy tratando de evitar el uso de variantes)¿Es posible implementar un tipo anulable como NullableOfInteger en VB6

Puede crear fácilmente una clase personalizada NullableOfInteger y utilizar su estado no inicializado para indicar un estado nulo, pero esto tiene las desventajas obvias.

Más allá de eso no puedo pensar de otra manera? Mi instinto me dice que no habría una buena manera.

+0

¿Se puede usar VB.NET en su lugar? ¿O un tipo de 'variante'? – Juliet

+0

Uso C# para cualquier aplicación nueva, pero desafortunadamente estoy atrapado detrás de una montaña de código VB6 "heredado". –

Respuesta

7

VB6 no tiene la sobrecarga del operador ni la conversión implícita personalizada que utilizan los tipos anulables en VB.NET. Realmente no puedes hacerlo mejor que la variante.

Una alternativa es elegir un valor específico y tratar consistentemente ese valor como nulo. En .NET 1.0 días la gente solía usar int.MinValue. No sé cuál es el equivalente de VB6, pero estoy seguro de que hay algo. Esto funciona y no es tan malo como suena (pero los tipos que aceptan nulos son mejores).

+4

No conozco una constante predefinida en VB6, pero siempre puede usar 'Const MININT32 As Long = & H80000000',' Const MAXINT32 As Long = & H7FFFFFFF', 'Const MININT16 As Integer = & H8000',' Const MAXINT16 As Integer = & H7FFF', 'Const MININT8 As Byte = 0' y' Const MAXINT8 As Byte = & HFF'. Nota: 'Largo' en VB6 es un entero de 32 bits. 'Integer' es un entero de 16 bits. 'Byte' es un entero sin signo de 8 bits. – pickypg

2

Creo que respondió su propia pregunta; Nullable es una conveniencia: .NET tiene una implementación, VB6 no (en gran parte debido a Variant). Si desea una versión de tipo seguro para VB6, tiene que implementarla, y muchos la tienen. Recuerdo que un lugar común para ver este tipo de cosas estaba en las API de la base de datos.

1

Sólo otro punto de vista

En lugar de anulable que puede manejar esto mediante el uso Opcional

Si se define como Optional BLABLA As Integer que tendrá un valor predeterminado 0 así que si es nulo o vacío tendrá un valor predeterminado como 0 ..

¡Aquí hay un ejemplo que hice por mí mismo! Podría ser útil:

Uso:

ProgressInc ProgressBar1 'you can add other options if you want as shown below 
'ProgressInc ProgressBar1, 500, 50, 25, True 
'I always change Min value to 1 in my ProgressInc so if you even choose it as 0 it still gonna be 1 

también funciona de esta manera

Dim TheThing As Long 

ProgressInc ProgressBar1 ,TheThing 
'See no definition about TheThing except being Long type 
'cause of this its value is 0 

Sub:

Public Sub ProgressInc(ProgressBarName As ProgressBar, Optional Max As Long, Optional Min As Long, Optional Inc As Long, Optional Continues As Boolean = False) 
    Dim Recent As Long 

    On Err GoTo ProgressBarErr 

    ProgressBarName.ShowWhatsThis 

    DoEvents 

    'Maximum ProgressBar Value 
    If Max <> 0 Then 
     ProgressBarName.Max = Max 
    Else 
     Max = 100 
     ProgressBarName.Max = Max 
    End If 

    'Minimum ProgressBar Value 
    If Min <> 0 Then 
     ProgressBarName.Min = Min 
    Else 
     Min = 1 
     ProgressBarName.Min = Min 
    End If 

    If Inc <> 0 Then Inc = Inc Else Inc = 1 

    'When the ProgressBar value is at Maximum 
    'Return to the Minimum value 
    If Continues = True And ProgressBarName.Value = Max Then 
     ProgressBarName.Value = Min 
    End If 

    'Checkout Recent progress (pre calculate bar value) 
    Recent = ProgressBarName.Value + Inc 

    If Recent >= Max Then 
     'Recent value is higher than or equals to Max value 
     'to avoid errors caused by this issue Value should equal to Max 
     ProgressBarName.Value = Max 
    ElseIf Recent < Max Then 
     'Recent(pre calculated bar value) is lower than Max 
     'So nothing wrong here, proceed.. 
     ProgressBarName.Value = ProgressBarName.Value + Inc 
    End If 

    Exit Sub 

ProgressBarErr: 

    'ProgressBar error report. 
    MsgBox "With " & Err.Number & " number : '" & Err.Description & "' error occured. " 

End Sub 

ver allí im conseguir Min , Max, Inc Como largo y cuando no los defino, tienen 0 como valor predeterminado.

Cuestiones relacionadas