Autor Tema: [help] Como pasar un objeto referenciandolo?  (Leído 2426 veces)

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

coco

  • Administrador
  • Terabyte
  • *****
  • Mensajes: 548
  • Reputación: +63/-3
    • Ver Perfil
[help] Como pasar un objeto referenciandolo?
« en: Abril 03, 2010, 02:48:16 pm »
Supongamos que necesito coleccionar varios objetos en un array dentro de una clase. Cada objeto se va agregando desde afuera (en este caso un form). Ahora mismo lo estoy pasando mas o menos asi:
Código: (vb) [Seleccionar]
Public Function PushObj (ByRef objNew As Long, ByVal strColName As String, ByVal lngKind As enmObjType, ByVal lngContent As enmColContent, Optional ByVal blnRequeired As Boolean = True, Optional ByVal blnComboUseIndex As Boolean = False) As Long

[...]
Set c_objArr(lngIndex).oObject = objNew
[...]
El tema es que cuando quiero acceder al objeto pasan 2 cosas, en algun caso (mas que nada con combo box) me dice "Se requiere un objeto" (pero haciendole mousehover a la variable del *objeto* me devuelve su valor); o en el mejor de los casos, el objeto esta, pero si yo cambio algun valor y luego quiero volver a leer su contenido, me devuelve el valor original.

En algun que otro codigo viejo (que ahora no recuerdo cual) habia visto que referenciaban a los objetos pasando su puntero y copiandolo a otro objeto (local), algo asi:
Código: (vb) [Seleccionar]
Public Function PushObj (ByVal lngPtr As Long) As Long
Dim objTemp As Object

Set objTemp = New 'pero aca no se que iba
CopyMemory ByVal ObjPtr(objTemp), ByVal lngPtr, 4
End Function

En fin, el que sepa algo que tire el chifle :D

saludos y felices pascuas!
'-     coco
(No me cabe: Java, Python ni Pascal)
SQLite - PIC 16F y 18F - ARM STM32 - ESP32 - Linux Embebido - VB6 - Electronica - Sonido y Ambientacion

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:[help] Como pasar un objeto referenciandolo?
« Respuesta #1 en: Abril 03, 2010, 06:45:35 pm »
C0C0

haciendo asi tendria que funcionar.

Código: [Seleccionar]
AddObj Combo1
Código: [Seleccionar]
Public Function AddObj(ObjSource As Object)
    Dim ObjTemp As Object
   
    Set ObjTemp = ObjSource
    Debug.Print ObjTemp.Name
    ObjTemp.AddItem "Test"
End Function

Lo que vos decis se utiliza para clases y colecciones normalmente, para controles con hacer eso tendria que ser suficiente.Ahora si que res usar el puntero y no tener el objeto referenciado permanentemente podes usar una coleccion con lo punteros y despues simplemente escanear los objectos asi

Código: [Seleccionar]
Private Sub Form_Load()
    Module1.FindObj(ObjPtr(Combo1)).AddItem "test"
End Sub
Código: [Seleccionar]
Public Function FindObj(ObjSource As Long) As Object
    Dim vItem As Variant
    Dim vForm As Variant
   
    For Each vForm In Forms
        For Each vItem In vForm.Controls
            If ObjPtr(vItem) = ObjSource Then
                Set FindObj = vItem
            End If
        Next
    Next
End Function