Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: al3 en 5 Enero 2006, 04:17 am



Título: Manejar los objetos de un activeX
Publicado por: al3 en 5 Enero 2006, 04:17 am
Hola. Estoy haciendo un ActiveX que tiene que hacer y tener lo siguiente.
Lo unico que tiene que tener es un array de labels, inicialmente comienzo con uno solo, Label1(0), y despues los voy cargando dinamicamente con Load Label1(x), etc, etc, etc.
El problema esta en como trabajar con cada label individualmente.
Por ej: En un formulario pongo este ActiveX llamado ALabels.
y puedo hacer lo siguiente. ALabels.Add "NewLabel" y despues hacer, ALabels.Label(0).Caption = "1", ALabels.Label(1).Caption = "1",etc.

codigo de ejemplo:
Código:
'En un formulario con un label (Label1)
Dim Etiqueta(1) As VB.Label
Private Sub Form_Load()
    Set Etiqueta(0) = Label1(0)
        Etiqueta(0).Caption = "Label 1"
       
        Load Label1(1)
    Set Etiqueta(1) = Label1(1)
        Etiqueta(1).Caption = "Label 1"
End Sub
El codigo de arriba sirve para un Formulario comun, cuando lo llevo a un ActiveX tambien funciona. Por ahora todo bien, el problema es cuando desde un formulario quiero llamar al objeto
Etiqueta(1) del ActiveX o sea: UserControl.Etiqueta(1).Caption. De echo esa instancia ni existe, lo cual esta bien porque esta declarada como Dim = Private, esa instancia es solamente vista por el activeX. Entonces lo que hice fue ponerla publica, pero ahi es donde falla. En cambio si no la pongo como un vector si que funciona.
En fin resumiendo: En un activeX tengo un arrays de labels. ¿como puedo hacer para poder manejarlos desde un formulario?

Código:
'Formulario
Private Sub Form_Load()
 UserControl.Label1(0).Caption = "Label 1"
 UserControl.Label1(1).Caption = "Label 2"
 UserControl.Label1(2).Caption = "Label 3"
End Sub

'ActiveX
Private Sub UserControl_Initialize()
    Load Label1(0)
    Load Label1(1)
    Load Label1(2)
End Sub























Título: Re: Manejar los objetos de un activeX
Publicado por: al3 en 5 Enero 2006, 05:35 am
Bueno, ya encontre como hacerlo aca pongo el codigo:
Código:
'En un Formulario con:
'2 CommandsButtons
'1 TextBox
'1 UserControl (el activeX)
'Uso:
'1) Apretar un par de veces el boton "Agregar Label"
'2) Poner en el textbox un numero que no supere la cantidad 'de 'labels cargados.
'3) Apretar el boton "Cambiar de fondo"

Private Sub Command1_Click()
    UserControl1.AgregarLabel
End Sub
Private Sub Command2_Click()
    UserControl1.CambiarPropiedad Text1.Text, "BackColor", VbLet, vbBlue
End Sub
Private Sub Form_Load()
    Command1.Caption = "Agregar Label"
    Command2.Caption = "Cambiar Color"
    Text1.Text = 0
End Sub

'En un UserControl con:
'1 Label que tenga como index = 0
Dim i As Integer
Public Sub AgregarLabel()
    i = i + 1
    Load Label1(i)
        Label1(i).Top = Label1(i - 1).Top + Label1(0).Height + 2
        Label1(i).Visible = True
End Sub
Public Sub CambiarPropiedad(nCtl As Integer, ProcName As String, CallType As VbCallType, args As String)
    CallByName Label1(nCtl), ProcName, CallType, args
End Sub

Con la funcion CallByName puedo llamar a un metodo y/o propiedad, pero como un String.
Por ej:
Esto: CallByName Label1, "Caption", vbLet, "Hola Mundo"
Es lo mismo que: Label1.Caption = "Hola Mundo"