[SNIPPET] SaveConfig() - Almacena toda la configuracion en un Long

Iniciado por Karcrack, 9 Julio 2010, 19:38 PM

0 Miembros y 2 Visitantes están viendo este tema.

Karcrack

Muchas veces cuando estas programando algo te ves en la necesidad de comunicar dos partes de tu software para que compartan cierta configuracion... como un Builder y un Stub... o un Cliente y un Server...

Cuando esa informacion que han de compartir son simples Booleans (Si/No) como, activar deteccion de Virtual Machines, Melt.. etc... Simplemente puedes almacenar una gran lista de parametros en un simple Long (4Bytes) ;D

He visto Aplicaciones que envian/almacenan cosas como: "ON" o "OFF", si si, en cadenas de texto... :-X Ademas de no ser nada optimo es horroroso por ejemplo abrir el EXE y ver como 20 "ON"s y "OFF"s :-X :-X

Si no me equivoco Cobein ya posteo un codigo que trabajaba con Bitmasks... pero bueno, aqui esta el mio :xD

Aqui va:
Código (vb) [Seleccionar]
Public Function ReadConfig(ByVal lSrc As Long, ByVal iPos As Integer) As Boolean
   ReadConfig = (lSrc And 2 ^ iPos)
End Function

Public Function SaveConfig(ParamArray vValues() As Variant) As Long
   Dim i       As Long
   Dim vTmp()  As Variant
   
   vTmp = vValues
   ReDim Preserve vTmp(0 To 30)
   
   SaveConfig = 0
   For i = 0 To 30
       If vTmp(i) Then SaveConfig = (SaveConfig Or 2 ^ i)
   Next i
End Function


Un ejemplo de uso? Aqui teneis :) :
Código (vb) [Seleccionar]
Private Const lSavedConfig  As Long = &H16E  'SaveConfig(False, True, True, True, False, True, True, False, True, False)

Private Sub Form_Load()
   Dim x       As Long
   
   For x = 0 To 30
       If ReadConfig(lSavedConfig, x) = True Then
           MsgBox "La opcion nº" & x & " esta activada"
       End If
   Next x
End Sub

Public Function ReadConfig(ByVal lSrc As Long, ByVal iPos As Integer) As Boolean
   ReadConfig = (lSrc And 2 ^ iPos)
End Function


Simplemente generas el numero con la funcion SaveConfig() que te permite guardar hasta 31 Booleans/Opciones, luego con la funcion ReadConfig() le pasas el numero de la opcion y la lees :D

Saludos, espero que os sea de utilidad :)

raul338

8 x 4 = 32............... y el bit que falta? :P

Es buena la idea, pero 32 (o 31) me parce algo excesivo, mejor guardar de 8 en 8 como sea necesario en un Byte :) (ahora mismo no tengo el codigo, pero lo habria logrado en .net, de todas formas se puede en vb)

Karcrack

#2
Cita de: raul338 en  9 Julio 2010, 19:55 PM
8 x 4 = 32............... y el bit que falta? :P

Es buena la idea, pero 32 (o 31) me parce algo excesivo, mejor guardar de 8 en 8 como sea necesario en un Byte :) (ahora mismo no tengo el codigo, pero lo habria logrado en .net, de todas formas se puede en vb)
Se empieza a contar por el 0 :P Ademas, no se puede usar el otro porque 2^31 es demasiado para VB :laugh: :laugh:

Si, bueno, puedes utilizar tantos bits como quieras... desde el 1 al 31...
Supongo que en .NET lo habras hecho mejor, ya que si no me equivoco permite usar mas operaciones de bitwise, como << o >> :D

raul338

Cita de: Karcrack en  9 Julio 2010, 20:08 PM.... no se puede usar el otro porque 2^31 es demasiado para VB :laugh: :laugh:
:xD bueno, seria mejor guardar de 8 en 8 (al menos para mi)

Cita de: Karcrack en  9 Julio 2010, 20:08 PM
Supongo que en .NET lo habras hecho mejor, ya que si no me equivoco permite usar mas operaciones de bitwise, como << o >> :D
Ps.... no conozco como "<<" o ">>".... uso And y Or depende el caso, Aun asi, en vb se puede, Seria como usar un enum de 8 campos...... lo voy a probar :)

LeandroA

Esta buena la funcion  :D (que triste es no saber nada de bits  >:( )