Calcula la letra del Nif en Visual Basic

Visual Basic 1 Comentario »

Aquí os dejo el código de una aplicación muy simple pero efectiva que poniendo los números del NIF os calcula la letra.

La aplicación tiene la particularidad de permanecer siempre visible en la esquina inferior derecha y ocupar poco espacio, de esta manera es posible tenerla a mano mientras se trabaja con otras aplicaciones y no nos quita visión.

A continuación voy a dejar el código pero si alguien está interesado en la aplicación completa no tiene mas que decirlo y subo una instalación para que la descarguéis.

El programa se compone de un módulo con el siguiente código:

Visual Basic:
  1. Public Declare Function SetWindowPos Lib "user32" _
  2. (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
  3. ByVal x As Long, ByVal y As Long, _
  4. ByVal cx As Long, ByVal cy As Long, _
  5. ByVal wFlags As Long) As Long
  6. Public Const HWND_TOPMOST = -1

Y un formulario con el siguiente código:

Visual Basic:
  1. Private Sub CalculaNIF(strA As String)
  2. Const cCADENA = "TRWAGMYFPDXBNJZSQVHLCKE"
  3. Const cNUMEROS = "0123456789"
  4. Dim strT As String, strB As String
  5. Dim a#, Nif#, b#, c#
  6. Dim i As Integer
  7.  
  8. strT = Trim$(strA)
  9. If Len(strT) = 0 Then Exit Sub
  10.  
  11. strB = ""
  12.  '---Dejar sólo los números... &
  13. For i = 1 To Len(strA)
  14. If InStr(cNUMEROS, Mid$(strA, i, 1)) Then
  15. strB = strB + Mid$(strA, i, 1)
  16. End If
  17. Next
  18. strA = strB
  19. a# = 0
  20. Nif# = Val(strA)
  21. Do
  22. b# = Int(Nif# / 24)
  23. c# = Nif# - (24 * b#)
  24. a# = a# + c#
  25. Nif# = b#
  26. Loop While b# <> 0
  27. b# = Int(a# / 23)
  28. c# = a# - (23 * b#)
  29. strA = Trim$(strT) + Mid$(cCADENA, c# + 1, 1)
  30. Text2.Text = Mid$(cCADENA, c# + 1, 1)
  31. End Sub
  32.  
  33. Private Sub Command1_Click()
  34. Call CalculaNIF(Text1.Text)
  35. End Sub
  36.  
  37. Private Sub Form_Activate()
  38. Text1.SetFocus
  39. End Sub
  40.  
  41. Private Sub Form_Load()
  42. Me.ScaleMode = vbPixels
  43. SetWindowPos Me.hwnd, HWND_TOPMOST, Me.ScaleLeft, _
  44. Me.ScaleTop, Me.ScaleWidth, Me.ScaleHeight, 0
  45. Move (Screen.Width - Width), (Screen.Height - Height) - 500
  46.  
  47. End Sub
  48.  
  49. Private Sub Text1_GotFocus()
  50. Text1.SelStart = 0
  51. Text1.SelLength = Len(Text1.Text)
  52. End Sub
  53.  
  54. Private Sub Text1_KeyPress(KeyAscii As Integer)
  55. 'MsgBox KeyAscii
  56. Select Case KeyAscii
  57. Case 13
  58. Command1_Click
  59. Text1_GotFocus
  60. Exit Sub
  61. Case 8
  62. Case 46
  63. Case Else
  64. If Not IsNumeric(Chr(KeyAscii)) Then
  65. KeyAscii = 0
  66. End If
  67. End Select
  68. End Sub

También podéis descargar desde aquí los ficheros fuente.

Leer y escribir de un archivo INI. Visual Basic

Visual Basic 3 Comentarios »

Antes de la aparición del registro de 32 bits de Windows (Windows 95), si se deseaba guardar todo tipo de parámetros de la aplicación, tales como el tamaño de la ventana inicial, se utilizaban los archivos INI. La mayoría de las aplicaciones almacenan esta información en el registro de Windows ahora, sin embargo, puede resultarte más fácil utilizar archivos INI por ahora.
Una de las ventajas de la utilización de los archivos INI, es que se puede editar fácilmente los archivos manualmente y también, las opciones pueden ser fácilmente eliminadas. Los archivos INI tienen la siguiente estructura:

[SectionName]
KeyName1 = KeyValue
KeyName2 = KeyValue

Para un ejemplo de los archivos INI, busca en el archivo Win.ini que guarda en su directorio de Windows.

El siguiente código muestra cómo leer y escribir en un archivo INI con visual basic. Crea un nuevo proyecto y añade un módulo. Luego agrega el siguiente código:

Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

'// Funciones
Function GetFromINI(sSection As String, sKey As String, sDefault As String, sIniFile As String)
Dim sBuffer As String, lRet As Long
sBuffer = String$(255, 0)
' Llama a la DLL
lRet = GetPrivateProfileString(sSection, sKey, "", sBuffer, Len(sBuffer), sIniFile)
If lRet = 0 Then
' fallo de la DLL, save default
If sDefault <> "" Then AddToINI sSection, sKey, sDefault, sIniFile
GetFromINI = sDefault
Else
' DLL con existo
' return string
GetFromINI = Left(sBuffer, InStr(sBuffer, Chr(0)) - 1)
End If
End Function

'// Devuelve True si todo va bien. Si la sección no
'// existe la crea.
Function AddToINI(sSection As String, sKey As String, sValue As String, sIniFile As String) As Boolean
Dim lRet As Long
' Llama a la DLL
lRet = WritePrivateProfileString(sSection, sKey, sValue, sIniFile)
AddToINI = (lRet)
End Function

Puedes usar este codigo para escribir y leer de archivos ini.

Encriptar una contraseña en visual basic.

Visual Basic 2 Comentarios »

Esta función te permite comprobar la contraseña de un usuario contra una base de datos sin necesidad de conocerla. El proceso inverso no es posible.

La función está basada en otras que he recopilado por internet y he adecuado a los sistemas de información de mi empresa. Es correcta y cumple la ley de protección de datos ya que el administrador no conocerá la contraseña del usuario y queda almacenada en formato ilegible.

Desde que este algoritmo fue público, los usuarios deben evitar el uso de palabras individuales como contraseñas, ya que un programa "cracker" podría iniciar un bucle a través de un diccionario ortográfico y aplicar esta función para tratar de coincidir con el valor hashed. Para mas seguridad los usuarios deberían utilizar por lo menos dos palabras, y tal vez utilizar dígitos y signos de puntuación en la contraseña. Ya sabéis que a los hackers hay que ponérselo lo mas difícil posible, estas recomendaciones se las hago a mis usuarios pero otra cosa es que me hagan caso, seguro que unos cuantos de ellos tienen el nombre del marido o del hijo como contraseña.

Su uso se hace enviándole el usuario y la contraseña a la función para que te devuelva el valor hash y se contrasta con el valor almacenado en la base de datos.

Función:

Function HashPassword(ByVal vsUserId As String, ByVal vsPassword As String) As Double

Const uHASH_DEPTH = 6
Static k(uHASH_DEPTH) As Integer
Dim S As String
Dim I As Integer
Dim J As Integer
Dim k1 As Integer
Dim N As Integer
Dim fHash As Double
Dim fTemp As Double

' Si la contraseña está en blanco,
' el valor de hash sigue siendo cero.
' Por lo tanto significa "sin contraseña".
fHash = 0#

If vsPassword <> "" Then
' Si incluyes el nombre del usuario como parte del hash,
' dos usuarios con la misma contraseña no tendrán el mismo
' valor de hash:
S = vsPassword & vsUserId
's = UCase$(s) ' Activa esta linea para convertir a mayúsculas
N = Len(S)

k(1) = Asc(Mid$(S, 1, 1))
For J = 2 To uHASH_DEPTH
k1 = 1 + (k(J - 1) Mod N)
k(J) = Asc(Mid$(S, k1, 1))

If k(J) = k(J - 1) Then

k(J) = k(J) + 1
End If
Next J

For I = 1 To N
fTemp = I
For J = 1 To uHASH_DEPTH
k1 = 1 + ((I + k(J)) Mod N)
fTemp = fTemp * Asc(Mid$(S, k1, 1))
Next J

fHash = fHash + fTemp
Next I
End If

HashPassword = fHash
End Function

Uso de la función en el programa:

En la siguiente linea se hace una comparación entre la cadena hash que se supone que tenemos almacenada en la base de datos y la que ha tecleado el usuario.

bPwdOk es un boleano que nos dice si coincide el hash que tenemos almacenado en nuestra base de datos con el que ha tecleado el usuario.

bPwdOk = (StrComp(tabla!Pwd, HashPassword(txtUsuario.Text, txtPwd.Text), vbTextCompare) = 0)

  • tabla!pwd : campo que hemos obtenido a través de un recordset de la base de datos en la que está almacenado el valor hash de la contraseña del usuario.
  • txtUsuario.text : valor de la caja de texto del UserId, en el caso del gráfico D-SUAREZ.
  • txtPwd.text : el valor de la caja de texto que contiene la contraseña que ha escrito el usuario.

Capturar el usuario de Red desde Visual Basic.

Visual Basic No hay Comentarios »

En algunas ocasiones nos es útil capturar el usuario del equipo que maneja nuestra aplicación para dejar constancia de quien ha sido el usuario que ha creado o modificado un registro. El siguiente codigo nos ayuda a ello. Nos permite capturar el usuario con el que se ha iniciado la sesión en un pc con Windows, si se trabaja en un entorno con dominio nos devolverá el usuario que ha iniciado la sesión en el dominio.

Primero debemos declarar la función en "General-Declaraciones" de la siguiente forma

Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpbuffer As String, nSize As Long) As Long

Luego podemos capturar el usuario en el Form_Load del formulario principal, en el caso siguiente pongo el nombre del usuario en la caja de texto txtUserName.

Private Sub Form_Load()
Dim sBuffer As String
Dim lSize As Long

sBuffer = Space$(255)
lSize = Len(sBuffer)
Call GetUserName(sBuffer, lSize)
If lSize > 0 Then
txtUserName.Text = Left$(sBuffer, lSize)
Else
txtUserName.Text = vbNullString
End If
End Sub

WP Theme & Icons originales por N.Design Studio.
Aviso Legal Entradas RSS Comentarios RSS Acceder