Category: VB6

Apr 17 2007

VB: StrConv, o como jugar a mayúsculas y minúsculas.

El otro día, en una aplicación de VB6 (aunque también os pongo el código para VB2005), debía poner la información de contacto de un cliente. Como comprenderéis nada del otro mundo, pero, en la forma de presentarlo, sí, o casi ;). Quería poner el nombre con la primera en mayúscula y el resto en minúsculas. Tenía dos opciones, o bien empezaba a jugar con el right, left, ucase y todo el copón o usaba StrConv:

¿Qué es lo que hace la función StrConv?

Básicamente las tres, mayúsculas, minúsculas y las que os comentaba. La sintaxis es la siguiente: Imaginemos que tenemos en la variable Texto un nombre: Malo Maloso.


StrConv(Texto, vbUpperCase) 'devuelve MALO MALOSO.
StrConv(Texto, vbLowerCase) ‘devuelve malo maloso.
StrConv(Texto, vbProperCase) ‘devuelve Malo Maloso.

En VB2005 sería prácticamente igual:


Public Shared Function StrConv( _
ByVal str As String, _
ByVal Conversion As Microsoft.VisualBasic.VbStrConv, _
Optional ByVal LocaleID As Integer,
) As String

Donde:

VbStrConv.None: No se realiza ninguna conversión
VbStrConv.UpperCase: Convierte la cadena a mayúsculas.
VbStrConv.LowerCase: Convierte la cadena a minúsculas.
VbStrConv.ProperCase: Pone en mayúscula la primera letra de cada palabra de la cadena.

Jan 29 2007

VB: Weekday o que día de la semana es hoy

Me ha aparecido un problemica, quiero saber que día de la semana es una fecha X.

Pues bien, hay una funcion en VB (aplicable a asp y vbscript), llamada:

Weekday(date, [firstdayofweek])

Si miramos la ayuda vemos que nos pone: Returns a whole number representing the day of the week, que traducido del marciano viene a decir que devuelve un número representativo del día de la semana.

Pero tiene truco!, ya que ese numero que devuelve depende del segundo atributo, por ejemplo: Weekday(”1/12/2005″, 1) nos devolvera 5, osea, jueves ya que el 1 en la función representa al Domingo, el 2 al lunes,… y como el 1 de la función representa al domingo, pues del domingo al jueves hay… 5 diícas, por lo que si ponemos WeekDay(”1/12/2005″,2) nos devolvera…. 4!, ya que parte del segundo dia de la semana que es lunes, y del lunes al jueves hay… 4 diícas (Lunes+martes+miercoles+jueves=4).

Ah! si se omite el atributo [firstdayofweek] coge por defecto el valor de la variable vbSunday, que es 1.

  • vbUseSystemDayOfWeek = 0 (el del sistema)
  • vbSunday = 1
  • vbMonday = 2
  • vbTuesday = 3
  • vbWednesday = 4
  • vbThursday = 5
  • vbFriday = 6
  • vbSaturday = 7
Dec 22 2006

VB6: Controls(propiedad)

Pos nada, que hemos puesto un control de entrada a una aplicación, por lo que, según quien entre en un formulario concreto puede hacer o no puede hacer ciertas cosas. Dicho formulario tiene como cuatrocientosmil objetos entre textbox, checkbox, etc… así que ¿como pongo el enabled=False de todo cristo de una forma rápida y sencilla? Con la propiedad controls del formulario:

For i = 0 To NombreFormulario.Controls.Count - 1
If TypeOf NombreFormulario.Controls(i) Is TextBox Then
NombreFormulario.Controls(i).Text = ""
End If
Next i

Para controlar otros objetos del formulario basta con cambiar TextBox por el objeto que quieras controlar y listo, de una tacada tienes todo con enabled=False.

Nov 09 2006

VB6: El redondeo ese gran kab… desconocido

Pues sí, otra vez una función propia de VB nos ha vuelto locos, tarumbas, hasta que nos encontramos con el siguiente texto en la Pág. 195 del libro “Programación avanzada con Microsoft Visualbasic 6.0” de Francesco Balena:

[...] Round tiene un secreto no documentado: cuando la parte decimal es exactamente 0.5 redondeará hacia arriba si su parte entera es un número impar y redondeará hacia abajo si la parte entera es par. [...]

[!] Si queremos redondear a dos decimales el 2,875, la parte entera a la que hace alusión no es el 2 sino el segundo decimal: el 7.

El Round tiene los siguientes parámetros:

Round(numero, numeroDecimales)

Por lo que si el decimal inmediatamente posterior al indicado en el parámetro numeroDecimales, o sea, el que hay que redondear, es un 5 ocurre lo anterior, sino redondea perfectamente, dando igual que termine en 5.

¿Esto que quiere decir?

Que si ponemos Round(2.8754215, 3) redondeara perfectamente, mientras que Round(2.8754215, 2) hará el redondeo raro comentado arriba.

¿Entonces, que hacemos?

Para solucionar esto, hemos creado la siguiente función en vb:

Public Function G_Redondeo(Numero As Double, Optional Decima As Long) As Double
Dim NumC As Double
Dim Num As String
Dim Deci As String
NumC = Numero - Fix(Numero)
If Len(CStr(NumC)) - 2 <= Decima Then
G_Redondeo = Round(Numero, Decima)
Exit Function
Else
'el 3 es el 0, de Left(CStr(NumC) (=2) + 1, que es el ultimo decimal, el q redondeamos
Num = CStr(Fix(Numero) + CDbl(Left(CStr(NumC), Decima + 3)))
End If
Num = CStr(Numero)
Deci = Right$(Num, 1)
''Si es 5 hacemos el redondeo hacia arriba, por eso el 6
If Deci = "5" Then
Deci = "6"
End If
Num = Left$(Num, Len(Num) - 1) & Deci
If IsMissing(Decima) Then
G_Redondeo = Round(CDbl(Num))
Else
G_Redondeo = Round(CDbl(Num), Decima)
End If
End Function

¿Y porqué ocurre este redondeo raro?

El propio autor nos lo indica:

[...] Este comportamiento es necesario para que evite la introducción de errores cuando esté utilizando evaluaciones estadísticas. [...]

Y digo yo, ¿no podrían haber realizado una función propia para esto y dejarse de marear la perdiz? en fin, como diría quien yo me se, ¡es microsoft!