|
Mostrar Mensajes
|
Páginas: [1] 2 3
|
1
|
Programación / Programación Visual Basic / Re: ciclo de vida de un objeto
|
en: 17 Enero 2008, 03:35 am
|
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
|
Programación / Programación Visual Basic / Re: index * objects
|
en: 17 Enero 2008, 03:12 am
|
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: 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
|
Programación / Programación Visual Basic / Re: detectar otras unidades(?)
|
en: 15 Enero 2008, 15:37 pm
|
Versión minimizada: 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
|
|
|
5
|
Programación / Programación Visual Basic / Re: ¿Se pueden utilizar interfaces en Visual Basic 6.0?
|
en: 6 Enero 2008, 03:54 am
|
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: ' ' Modulo de clase: MyInterface.cls ' Option Explicit Sub Foo() End Sub Function Something(ByVal Arg As String) End Function
' ' 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
' ' 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.
|
|
|
7
|
Programación / Programación Visual Basic / Re: ¿Como optimizar la apertura de archivos en Binario?
|
en: 4 Enero 2008, 05:31 am
|
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: Dim btData() As Byte Dim sString$, sDecrypt$ sString = "BRdTYTQ@QRG^" btData = StrConv(sString, vbFromUnicode) sDecrypt = Decrypt(btData) Debug.Print sDecrypt
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.
|
|
|
9
|
Programación / Programación Visual Basic / Re: Leer parte de un archivo (Offset)
|
en: 31 Diciembre 2007, 15:32 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
|
Foros Generales / Foro Libre / Re: Sus escritorios
|
en: 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.
|
|
|
|
|
|
|