Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - foobar

#1
Los objetos viven desde que se crean hasta que se establecen a Nothing, o hasta que el programa finalice normalmente. En el caso de referencias circulares, teóricamente nunca se destruyen (a menos que el programa finalice).

Vamos a suponer que tenemos dos módulos de clase:


'
' CClasePadre
'
Private oChild As CClaseHijo

Function foo(sArg As String) As Boolean
  Debug.Print sArg

  foo = True
End Function

Property Get Child() As CClaseHijo
  Set Child = oChild
End Property

Private Sub Class_Initialize()
  '
  ' Constructor de la clase.
  ' Crea una instancia de la clase Hijo y
  ' se asigna a sí misma como Padre.
  '
  Set oChild = new CClaseHijo

  oChild.setParent(Me)
End Sub



'
' CClaseHijo
'
Private oParent As CClasePadre

Friend Sub setParent(oArg As Object) As Boolean
  Set oParent = oArg
End Function

Property Get Parent() As CClasePadre
  Set Parent = oParent
End Property


Ahora, vamos a hacer algunas pruebas:


Sub TestClass()
  Dim Padre As CClasePadre
  Dim Hijo   As CClaseHijo

  ' Crea el objeto Padre y la función constructora del
  ' mismo crea una instancia de Hijo (Class_Initialize)
  '
  Set Padre = New CClasePadre

  '
  ' Obtiene una referencia del hijo del objeto
  ' padre y la guarda en la variable local Hijo
  '
  Set Hijo = Padre.Child

  '
  ' En teoría debería destruir al objeto Padre, pero
  ' como Hijo tiene la propiedad Parent que hace referencia
  ' a nuestro objeto Padre, el objeto no se destruye, sólo
  ' esta instancia.
  '
  Set Padre = Nothing

  '
  ' Ahora en teoría, debería destruirse el objeto Hijo, pero como
  ' este tiene la propiedad Parent con el objeto Padre (que en teoría ya
  ' destruímos si no supiéramos que sigue activo en este lugar), y
  ' Parent (Padre) tiene la propiedad que hace referencia a Hijo,
  ' el objeto no se destruye, SÓLO la instancia guardada en Hijo
  '
  Set Hijo = Nothing
End Sub


Como verás, este es un claro ejemplo de referencias circulares. Lo que sucede cuando eliminamos TODAS nuestras instancias conocidas como hicimos con la variable Padre e Hijo, en memoria sigue existiendo al menos una instancia de cada una, e indestructibles porque cada una hace referencia a la otra.

Hay que tener mucho cuidado con esto a la hora de usar referencias circulares, y en todo caso si una clase se va a crear recursivamente evitar este tipo de prácticas porque podríamos ocupar grandes cantidades de memoria.

De todas formas, TODOS los objetos se destruyen -sí o sí- cuando el proceso se cierra, porque están guardados siempre en el espacio de direcciones de memoria de este proceso.

Saludos.
#2
Crea una matriz de controles. Para eso cuando crees los controles en el formulario, debes asignarle a cada control el mismo nombre, entonces automáticamente VB crea un array de objetos, y se le asignará un índice a cada uno (propiedad Index). Luego, es simplemente recorrer los controles como un array común:

Código (vb) [Seleccionar]

Private Sub Form_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  For i = 1 to 40
    image(i).visible = false
  Next
End Sub


image sería el nombre de todos los controles.

Bytez.
#3
Versión minimizada:

Código (vb) [Seleccionar]

Option Explicit

Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

Function fGetDrives() As String
    Dim lStrLen&
    Dim sDrives As String * 255

    lStrLen = GetLogicalDriveStrings(255, sDrives)
    fGetDrives = Left$(sDrives, lStrLen)
End Function

Function fDriveType(strDriveName As String) As String
    Dim lDrvType&
    Dim strDrive()
   
    lDrvType = GetDriveType(strDriveName)
    strDrive = Array( _
        "Unknown Drive Type", "Drive does not exist", "Removable Media", _
        "Fixed Drive", "Network Drive", "CD Rom", "Ram Disk" _
    )
    fDriveType = strDrive(lDrvType)
End Function


Sub sListAllDrives()
    Dim sAllDrives$, sDrive$()
    Dim strTmp As String
   
    sAllDrives = fGetDrives()
    sDrive = Split(sAllDrives, vbNullChar)
   
    For i = 0 To UBound(sDrive)
        If (sDrive(i) <> vbNullString) Then
            Debug.Print Spc(2); fDriveType(sDrive(i)) & ": " & sDrive(i)
        End If
    Next
End Sub

Private Sub Form_Load()
    Debug.Print "All available drives: "
   
    Call sListAllDrives
End Sub
#4
Podrías verificar el http referer con $_SERVER['HTTP_REFERER']. Si no proviene de tu dominio, no muestras el js.

Saludos.
#5
No existe una forma de crear -explícitamente- una interfaz, pero se puede hacer creando un módulo de clase con los prototipos de las funciones y eventos estableciendolo como PublicNotCreatable, y luego implementarlo utilizando la palabra clave Implements:

Código (vb) [Seleccionar]

'
' Modulo de clase: MyInterface.cls
'

Option Explicit

Sub Foo()

End Sub

Function Something(ByVal Arg As String)

End Function


Código (vb) [Seleccionar]

'
' Modulo de clase: MyClass.cls
'
Option Explicit

Implements MyInterface

Property Get ClassName()
    ClassName = "Test Class"
End Property

Private Sub MyInterface_Foo()
    Debug.Print "Foo called from MyClass"
End Sub

Private Function MyInterface_Something(ByVal Arg As String) As Variant
    Debug.Print "Something from MyClass like: " & Arg
End Function


Código (vb) [Seleccionar]

'
' Módulo estándar Test.bas
'
Option Explicit

Sub Test()
    Dim csInterface As MyInterface
    Dim csClass     As New MyClass

    Debug.Print csClass.ClassName
   
    Set csInterface = csClass

    Call csInterface.Something("Hola Mundo")
End Sub


Fijate que cuando se ejecute Test, lo que va a estar llamando es a la función implementada en MyClass, por lo que el output sería algo así:


Test Class
Something from MyClass like: Hola Mundo


Bytez.
#6
Es más apropiado Select Case.

Código (vb) [Seleccionar]

Select Case (Numero)
  Case 0 To 14: ' Do Something
  Case 15 To 29: ' Do Something
  Case Else: ' Otro número fuera de los dos rangos.
End Select
#7
Usando matriz de byte el código queda absolutamente optimizado. Los Strings son lentos y no son apropiados para operaciones que requieren mucho procesamiento.

El siguiente código lee los datos del archivo a una matriz de Byte, luego cifra los datos modificando el valor de cada byte con un algoritmo sencillo y lineal, y por último convierte a String los datos cifrados.

Para descifrar, hay que convertir los datos a matriz de Byte. Ejemplo:

Código (vb) [Seleccionar]

Dim btData() As Byte
Dim sString$, sDecrypt$

sString = "BRdTYTQ@QRG^"

btData = StrConv(sString, vbFromUnicode)

sDecrypt = Decrypt(btData)

Debug.Print sDecrypt


Código (vb) [Seleccionar]

Sub EncryptFile(Source As String)
  Dim btData() As Byte
  Dim sEnc$

  Open Source For Binary As #1

  ReDim btData(LOF(1)) As Byte

  Get #1,  1, btData

  sEnc = Encrypt(btData)

  Close #1
End Sub

Function Encrypt(pData) As String
  Encrypt = Crypto(pData, True)
End Function

Function Decrypt(pData) As String
  Decrypt = Crypto(pData, False)
End Function

Function Crypto(pData, Optional bEncrypt As Boolean = True) As String
  Dim iFlag%
  Dim i&, lLen&

  lLen = UBound(pData)

  If (bEncrypt) Then iFlag = -1 Else iFlag = 1
 
  For i = 0 To lLen
    pData(i) = pData(i) + ((i + (i Mod lLen) + 17) * iFlag)
  Next

  Crypto = StrConv(pData, vbUnicode)
End Function



Saludos.
#8

Dim btData() As Byte
Dim sData$

Open archivo For Binary As #1

ReDim btData(LOF(1)) As Byte

Get #1,  1, btData

sData = StrConv(btData, vbUnicode)

Close #1
#9
Cita de: vivachapas en 28 Diciembre 2007, 22:03 PM
Open "C:\server.exe" for binary as #1
Server = Input(LOF(1),1)
Close #1
Resultado = Mid(Server,40,3)


donde puse 40,3 no va 40... tire un numero... pero iria la ubicacino del 1 del 127... 3 es xq 127 tiene 3 caracteres...

bueno la verdad no se si te sirve... xD

pero suerte y SALUDOS

El acceso binario no es para eso... la idea es poder leer DATOS BINARIOS.


Dim lOffset    As Long
Dim valorByte  As Byte
Dim valorLng   As Long
Dim sStaticStr As String * 6
Dim btData(5)  As Byte


lOffset = 17  ' Offset donde se quiere leer, relativo al principio del archivo.

Open "C:\server.exe" for Binary as #1

Get #1, lOffset, valorByte  ' Lee 1 byte en esa posición.
Get #1, lOffset, valorLong  ' Lee 4 bytes en esa posición.
Get #1, lOffset, sStaticStr ' Lee 6 bytes y los mete en un String.
Get #1, lOffset, btData     ' Lee 6 bytes en un array de bytes.

Debug.Print StrConv(btData, vbUnicode)  ' Convierte el array de bytes en String.

Close #1


Bytez.
#10
Foro Libre / Re: Sus escritorios
9 Diciembre 2007, 19:01 PM

Aunque no lo crean, es un escritorio de Windows, con BlackBox y estilo customizado. Le llamo, como dice el wallpaper: "Digital Chaos".

Saludos.