Autor Tema: Compartir un valor entre modulos clases  (Leído 1503 veces)

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

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Compartir un valor entre modulos clases
« en: Agosto 21, 2012, 04:10:26 am »
Hola, alguien sabe de alguna forma de compartir un valor entre modulos clases, por ejemplo si yo agrego un modulo publico y pongo Dim Contador as long todas las clases dentro del proyecto pueden consultar ese valor desde el modulo publico, pero la idea de usar un modulo publico para declarar esa única variable no me gusta, debe existir alguna api, para hacer eso no?. (un Global o algo asi)

una opción se que puedo utilizar (CreateWindowEx ,FindWindow,  SetProp y GetProp ) pero no me parece para nada elegante.

mi idea es crear un tipo de semaforo o mejor dicho un tipo contador de clases que se van creando y cuando se descargan, van restando 1 valor al contador, cuando llega la ultima y ve que este valor es 0 llama a una función para descargar lo que cargo la primera


Saludos.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Compartir un valor entre modulos clases
« Respuesta #1 en: Agosto 21, 2012, 10:26:09 am »
Leandro mira arme este codigo que te permite compartir valores a nivel de thread, arme un sistemita con un flag y un valor para poder almacenar mas de un parametro, es bastante simple de entender y modificar a gusto.

Código: [Seleccionar]
Option Explicit

Private Const TLS_MINIMUM_AVAILABLE As Long = 64

Private Declare Function TlsGetValue Lib "kernel32.dll" (ByVal dwTlsIndex As Long) As Long
Private Declare Function TlsSetValue Lib "kernel32.dll" (ByVal dwTlsIndex As Long, ByVal lpTlsValue As Long) As Long
Private Declare Function TlsFree Lib "kernel32.dll" (ByVal dwTlsIndex As Long) As Long
Private Declare Function TlsAlloc Lib "kernel32.dll" () As Long

Private Sub Form_Load()
    WriteValue &HCAFECAFE, 1234
    Debug.Print ReadValue(&HCAFECAFE) '&HCAFECAFE es el identificador que le asignamos a la variable
End Sub

Private Sub WriteValue(ByVal lProp As Long, ByVal  lValue As Long)
    Dim lIndex As Long
    lIndex = GetIndex(lProp)
    If Not lIndex = -1 Then
        Call TlsSetValue(lIndex, lValue)
    End If
End Sub

Private Function ReadValue(ByVal lProp As Long) As Long
    Dim lIndex As Long
    lIndex = GetIndex(lProp)
    If Not lIndex = -1 Then
        ReadValue = TlsGetValue(lIndex)
    End If
End Function

Private Function GetIndex(ByVal lProp As Long) As Long
    Dim i       As Long
    Dim lIndex  As Long
   
    '// Try to find our property.
    lIndex = -1
    For i = 0 To TLS_MINIMUM_AVAILABLE - 1
        If TlsGetValue(i) = lProp Then
            lIndex = i + 1
            Exit For
        End If
    Next
   
    Dim lFlagIndex As Long
   
    '// No property found, allocate index.
    If lIndex = -1 Then
        Do
            lFlagIndex = TlsAlloc '// Find two consecutive slots
            lIndex = TlsAlloc
            If lIndex >= TLS_MINIMUM_AVAILABLE Then Exit Function
        Loop While Not lFlagIndex + 1 = lIndex
        Call TlsSetValue(lFlagIndex, lProp)
    End If
End Function
« última modificación: Agosto 21, 2012, 10:28:23 am por cobein »

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Compartir un valor entre modulos clases
« Respuesta #2 en: Agosto 21, 2012, 01:25:44 pm »
Buenisimo Cobein, ya me estaba dando por vencido, no tenia ni idea de esas apis, y muy bueno sistema.


Saludos.