enlazar codigo a controles personalizados

08/02/2008 - 22:08 por Ivan | Informe spam
hola a todos,

tengo varios controles personalizados, que a su vez contienen varios
controles.

el tema es si es posible 'ligar' codigo a esos controles de una forma
llamemosle 'automatica'.

en concreto con el que estoy practicando ahora es un frame que
contiene aproximadamente 35 labels, 16 textbox y 15 spinbutton

se trata de una especie de contador de dinero en efectivo (para euros
en este caso), en el cual los controles van 'asociados' asi =>

un label para el valor de cada valor de bilellete o moneda

a este label van 'unidos' =>

.-un textbox para introducir la cantidad de billetes/monedas contadas
.-un spinbutton para poder trabajar con el teclado o el raton
.-otro label que recoge el subtotal

asi para cada moneda/billete

el control lo completan otro textbox para cantidades mixtas y un label
que recoge el total

para evitar tener que repetir en cada textbox las llamadas a los
procedimientos/funciones que realizan los calculos, y que se supone
que seran intrinsecos del control, pues esa al fin y al cabo es su
unica finalidad, he creado una clase que +/- va realizando todo lo que
quiero con apenas unas lineas de codigo

el tema esta en si existe la posibilidad de guardar de alguna forma el
control para que automaticamente tenga asociada la clase, es decir si
es posible que con solo incluir el control en el formulario (u hoja)
este ya de por si funcione con el codigo asociado

bueno no se si me he expiicado muy bien. en realidad es sobre todo por
practicar un poco con las clases y los controles, pero cualquier
comentario sera bien recibido

supongo que en VB si existe la posibilidad (¿crear ocx, dll, etc...?)
pero no lo tengo nada claro en vba [ni por supuesto en VB, je,
je, ...].

de hecho me imagino que no. Al menos tal cual esta planteado.

aunque seguro que algun truco existe por ahi de la mano de algun
'monstruo' de la materia ...

un saludo
Ivan

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
09/02/2008 - 03:16 | Informe spam
hola, Ivan !

__ (fraccion de) la consulta original __
he creado una clase que +/- va realizando todo lo que quiero con apenas unas lineas de codigo
el tema esta en si existe la posibilidad de guardar de alguna forma el control para que automaticamente tenga asociada la clase
es decir si es posible que con solo incluir el control en el formulario (u hoja) este ya de por si funcione con el codigo asociado
bueno no se si me he expiicado muy bien. en realidad es sobre todo por practicar un poco con las clases y los controles
pero cualquier comentario sera bien recibido. supongo que en VB si existe la posibilidad (crear ocx, dll, etc...?)
pero no lo tengo nada claro... de hecho me imagino que no. Al menos tal cual esta planteado...



1) (presumiblemente) la clase que desarrollaste...
a) trata al control segun su clase/tipo al estilo de: -> Public WithEvents <objeto> As MSForms.<tipo de objeto>
b) trabaja con una matriz (o coleccion) de objetos que se asigna al inicializar el formulario (o activar una hoja)
c) utiliza un solo procedimiento_evento para (todos) los objetos "reconocidos" (o incluidos) en dicha matriz

2) (entonces) mientras el control este incuido en dicha matriz, debiera funcionar como "la clase" lo tiene establecido, o sea...
con el unico procedimiento_evento asociado a "su clase/tipo" de control (a menos que lo agregues "al vuelo" o "a posterioi" del diseno)

si el codigo (real) que usas requiere distinguir si "algunos/ciertos/determinados" controles no debieran actual "igual a los demas"...
o se trata de varias clases_tipos de control (en condiciones similares a lo anterior) que no haya sido (aun) expuesto en la consulta... -?-

si tienes informacion adicional... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
#2 Ivan
09/02/2008 - 04:27 | Informe spam
hola Hector, gracias por la respuesta

te expongo lo que tengo hecho, que aunuqe no es muy corto, tampoco es muy largo, y despues te comento un poco a lo que
me refiero con enlazar el codigo al control (de controles ...)

'estas son unas constantes con los valores y nombre de loscontroles. No estoy usando todas ni se las que acabare usando
pero ahi van (son en su mayoria para trabajar con split)

'--en un modulo normal

Public Const SepS As String = "|" ' separador para split (Alt+124)
Public Const ValoresEUROS As String = _
"500|200|100|50|20|10|5|2|1|0,50|0,20|0,10|0,05|0,02|0,01"
Public Const SufijosCTS As String = _
"500|200|100|50|20|10|5|2|1|050|020|010|005|002|001"
Public Const NombresLBL As String = _
"lbl500|lbl200|lbl100|lbl50|lbl20|lbl10|lbl5|lbl2|" & _
"lbl1|lbl050|lbl020|lbl010|lbl005|lbl002|lbl001"
Public Const NombresTXT As String = _
"txt500|txt200|txt100|txt50|txt20|txt10|txt5|txt2|" & _
"txt1|txt050|txt020|txt010|txt005|txt002|txt001"
Public Const NombresLBLTT As String = _
"lblTT500|lblTT200|lblTT100|lblTT50|lblTT20|" & _
"lblTT10|lblTT5|lblTT2|lblTT1|lblTT050|lblTT020|" & _
"lblTT010|lblTT005|lblTT002|lblTT001"
Public Const NombresSPB As String = _
"spb500|spb200|spb100|spb50|spb20|spb10|spb5|spb2|" & _
"spb1|spb050|spb020|spb010|spb005|spb002|spb001"
Public Const TxtVarios As String = "txtOtros"
Public Const LblTotal As String = "lblTTEfectivoCajon"

' -- clase cCaja--

Public WithEvents form_Cambio As MSForms.UserForm
Public WithEvents Caja As MSForms.TextBox
Public WithEvents BotonNro As MSForms.SpinButton

Private Sub BotonNro_Change()
Call UserForm1.IgualarSpin(True)
End Sub

Private Sub Caja_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 57
Case Else: KeyAscii = 0
End Select
End Sub

Private Sub Caja_Change()
Call UserForm1.CalcularCambio
Call UserForm1.IgualarSpin(False)
End Sub

Public Property Get Valor() As Currency
Valor = Total_Efectivo
End Property

Private Function Total_Efectivo() As Currency
Dim n As Byte, SBT As Currency, TT As Currency, _
Val_Euros, TxtCant, LblSubT
Val_Euros = Split(ValoresEUROS, SepS)
TxtCant = Split(NombresTXT, SepS)
LblSubT = Split(NombresLBLTT, SepS)
With form_Cambio
For n = LBound(Val_Euros) To UBound(Val_Euros)
With .Controls(TxtCant(n))
If Not IsNumeric(.Text) Then
.Text = 0: .SelStart = 0: .SelLength = 1
End If
SBT = CCur(Val_Euros(n)) * CCur(.Text)
If SBT = 0 Then .Font.Bold = False Else .Font.Bold = True
End With
With .Controls(LblSubT(n))
.Caption = Format(SBT, "0.00")
If SBT = 0 Then .Font.Bold = False Else .Font.Bold = True
End With
TT = TT + SBT
Next
TT = TT + CCur(.Controls(TxtVarios).Text)
.Controls(LblTotal).Caption = Format(TT, "0.00")
End With
Total_Efectivo = TT
End Function

'en el modulo del form-

Dim FormC As New cCaja
Dim Cajon() As New cCaja
Dim SpinN() As New cCaja

Sub IgualarSpin(spin As Boolean)
Dim n As Byte, i As Byte, nTXT, nSPB
nSPB = Split(NombresSPB, SepS)
nTXT = Split(NombresTXT, SepS)
For n = LBound(nSPB) To UBound(nSPB)
If spin Then Controls(nTXT(n)).Text = _
Controls(nSPB(n)).Value Else _
Controls(nSPB(n)).Value = _
IIf(Val(Controls(nTXT(n)).Text) < 101, _
Val(Controls(nTXT(n)).Text), 100)
Next
End Sub

Sub CalcularCambio()
' label7 es un control ajeno al 'control'
Label7.Caption = Format(FormC.Valor, "0.00")
End Sub

Private Sub UserForm_Initialize()
Dim n As Byte, i As Byte, nTXT, nSPB
nSPB = Split(NombresSPB, SepS)
nTXT = Split(NombresTXT, SepS)
For n = LBound(nTXT) To UBound(nTXT)
With Me.Controls(Split(NombresLBL, SepS)(n))
.TextAlign = 3: .Font.Size = 8
End With
With Me.Controls(nSPB(n))
.Max = 100: .Min = 0: .Value = 0
End With
With Me.Controls(nTXT(n))
.Text = 0: .TextAlign = 3: .Font.Size = 9
.SelStart = 0: .SelLength = 1
End With
With Me.Controls(Split(NombresLBLTT, SepS)(n))
.Caption = "0,00": .TextAlign = 3: .Font.Size = 8
End With
' aqui cargo los controles
i = n + 1
ReDim Preserve Cajon(i)
Set Cajon(i).Caja = Me.Controls(nTXT(n))
ReDim Preserve SpinN(i)
Set SpinN(i).BotonNro = Me.Controls(nSPB(n))
Next
With Me.txtOtros
.TextAlign = 3: .Text = "0,00"
.Font.Size = 8
End With
With Me.lblTTEfectivoCajon
.TextAlign = 3: .Caption = "0,00"
.Font.Size = 10: .ForeColor = vbBlue
End With
Set FormC.form_Cambio = Me
End Sub

'-

esto, aunque seguramente esta lleno de 'burradas', funciona bastante bien, pero ..

en realidad la idea es por un lado, =>

a) meter dentro de la clase todo, limitando a ser posible a la declaracion de una sola variable de la clase ccaja que
corresponderia al propio formulario, realizando todo el proceso dentro de la clase a traves de los eventos.

aunque por mis pruebas me da la impresion de que las variables withevents tienen que ser cargadas desde el propio modulo
del formulario, pues en mis intentos desde dentro de la clase no lo he conseguido

b) por donde iba mi consulta es mas bien si se puede adjuntar al control el codigo inherente a su funcionamiento sin
tener que hacer mencion explicita a este, es decir como si fueran las propiedades y/o metodos predeterminados del
control y que con solo arrastralo desde el cuadro de herramientas hasta su ubicacion, en el archivo que sea, todo el
mecanismo de calculo/formateo/etc funcionase sin tener que preocupaarse de donde este el codigo

como decia me da la impresion de que no debe de ser muy facil (si es que es posible), Pero por indagarlo que no quede

ahora voy un poquito con prisa (hacia el sobre/cama, je, je ...) y no se si vuelve a que dar claro, pero si no mañana lo
intento aclarar

en cualquier caso muchas gracias y un saludo
Ivan
Respuesta Responder a este mensaje
#3 Héctor Miguel
09/02/2008 - 06:18 | Informe spam
hola, Ivan !

... expongo lo que tengo hecho... y despues... comento un poco a lo que me refiero con enlazar el codigo al control (de controles ...)



1) del codigo que expones... "esta" parte es la que hace que la coleccion/matriz de objetos (encontrados) "responda" a la clase:
'en el modulo del form-
...
For n = LBound(nTXT) To UBound(nTXT)
...
' aqui cargo los controles
i = n + 1
ReDim Preserve Cajon(i)
Set Cajon(i).Caja = Me.Controls(nTXT(n))
ReDim Preserve SpinN(i)
Set SpinN(i).BotonNro = Me.Controls(nSPB(n))
Next



y por esto te comentaba que...
"1) (presumiblemente) la clase que desarrollaste..."
" a) trata al control segun su clase/tipo al estilo de: -> Public WithEvents <objeto> As MSForms.<tipo de objeto>"
" b) trabaja con una matriz (o coleccion) de objetos que se asigna al inicializar el formulario (o activar una hoja)"
" c) utiliza un solo procedimiento_evento para (todos) los objetos "reconocidos" (o incluidos) en dicha matriz"

2) con relacion a si la declaracion de With Events debiera ir en un tipo de modulo u otro... (seguro ya la conoces)...
la pagina de Chip Pearson es muy completa en cuanto a la informacion relativa a los modulos de clase...
-> Events And Event Procedures In VBA
http://www.cpearson.com/Excel/Events.aspx
-> revisa +/- a la mitad de la pagina en adelante las siguientes secciones (entre otras):
Declaring WithEvents Variables
Which Is Better, ThisWorkbook Or CExcelEvents?
Multiple Events Being Called
Creating Your Own Events In Class Modules

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

' estas son unas constantes con los valores y nombre de loscontroles.
No estoy usando todas ni se las que acabare usando pero ahi van (son en su mayoria para trabajar con split)
'--en un modulo normal

Public Const SepS As String = "|" ' separador para split (Alt+124)
Public Const ValoresEUROS As String = _
"500|200|100|50|20|10|5|2|1|0,50|0,20|0,10|0,05|0,02|0,01"
Public Const SufijosCTS As String = _
"500|200|100|50|20|10|5|2|1|050|020|010|005|002|001"
Public Const NombresLBL As String = _
"lbl500|lbl200|lbl100|lbl50|lbl20|lbl10|lbl5|lbl2|" & _
"lbl1|lbl050|lbl020|lbl010|lbl005|lbl002|lbl001"
Public Const NombresTXT As String = _
"txt500|txt200|txt100|txt50|txt20|txt10|txt5|txt2|" & _
"txt1|txt050|txt020|txt010|txt005|txt002|txt001"
Public Const NombresLBLTT As String = _
"lblTT500|lblTT200|lblTT100|lblTT50|lblTT20|" & _
"lblTT10|lblTT5|lblTT2|lblTT1|lblTT050|lblTT020|" & _
"lblTT010|lblTT005|lblTT002|lblTT001"
Public Const NombresSPB As String = _
"spb500|spb200|spb100|spb50|spb20|spb10|spb5|spb2|" & _
"spb1|spb050|spb020|spb010|spb005|spb002|spb001"
Public Const TxtVarios As String = "txtOtros"
Public Const LblTotal As String = "lblTTEfectivoCajon"
' -- clase cCaja--
Public WithEvents form_Cambio As MSForms.UserForm
Public WithEvents Caja As MSForms.TextBox
Public WithEvents BotonNro As MSForms.SpinButton
Private Sub BotonNro_Change()
Call UserForm1.IgualarSpin(True)
End Sub
Private Sub Caja_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Select Case KeyAscii
Case 48 To 57
Case Else: KeyAscii = 0
End Select
End Sub
Private Sub Caja_Change()
Call UserForm1.CalcularCambio
Call UserForm1.IgualarSpin(False)
End Sub
Public Property Get Valor() As Currency
Valor = Total_Efectivo
End Property
Private Function Total_Efectivo() As Currency
Dim n As Byte, SBT As Currency, TT As Currency, _
Val_Euros, TxtCant, LblSubT
Val_Euros = Split(ValoresEUROS, SepS)
TxtCant = Split(NombresTXT, SepS)
LblSubT = Split(NombresLBLTT, SepS)
With form_Cambio
For n = LBound(Val_Euros) To UBound(Val_Euros)
With .Controls(TxtCant(n))
If Not IsNumeric(.Text) Then
.Text = 0: .SelStart = 0: .SelLength = 1
End If
SBT = CCur(Val_Euros(n)) * CCur(.Text)
If SBT = 0 Then .Font.Bold = False Else .Font.Bold = True
End With
With .Controls(LblSubT(n))
.Caption = Format(SBT, "0.00")
If SBT = 0 Then .Font.Bold = False Else .Font.Bold = True
End With
TT = TT + SBT
Next
TT = TT + CCur(.Controls(TxtVarios).Text)
.Controls(LblTotal).Caption = Format(TT, "0.00")
End With
Total_Efectivo = TT
End Function
'en el modulo del form-
Dim FormC As New cCaja
Dim Cajon() As New cCaja
Dim SpinN() As New cCaja
Sub IgualarSpin(spin As Boolean)
Dim n As Byte, i As Byte, nTXT, nSPB
nSPB = Split(NombresSPB, SepS)
nTXT = Split(NombresTXT, SepS)
For n = LBound(nSPB) To UBound(nSPB)
If spin Then Controls(nTXT(n)).Text = _
Controls(nSPB(n)).Value Else _
Controls(nSPB(n)).Value = _
IIf(Val(Controls(nTXT(n)).Text) < 101, _
Val(Controls(nTXT(n)).Text), 100)
Next
End Sub
Sub CalcularCambio()
' label7 es un control ajeno al 'control'
Label7.Caption = Format(FormC.Valor, "0.00")
End Sub
Private Sub UserForm_Initialize()
Dim n As Byte, i As Byte, nTXT, nSPB
nSPB = Split(NombresSPB, SepS)
nTXT = Split(NombresTXT, SepS)
For n = LBound(nTXT) To UBound(nTXT)
With Me.Controls(Split(NombresLBL, SepS)(n))
.TextAlign = 3: .Font.Size = 8
End With
With Me.Controls(nSPB(n))
.Max = 100: .Min = 0: .Value = 0
End With
With Me.Controls(nTXT(n))
.Text = 0: .TextAlign = 3: .Font.Size = 9
.SelStart = 0: .SelLength = 1
End With
With Me.Controls(Split(NombresLBLTT, SepS)(n))
.Caption = "0,00": .TextAlign = 3: .Font.Size = 8
End With
' aqui cargo los controles
i = n + 1
ReDim Preserve Cajon(i)
Set Cajon(i).Caja = Me.Controls(nTXT(n))
ReDim Preserve SpinN(i)
Set SpinN(i).BotonNro = Me.Controls(nSPB(n))
Next
With Me.txtOtros
.TextAlign = 3: .Text = "0,00"
.Font.Size = 8
End With
With Me.lblTTEfectivoCajon
.TextAlign = 3: .Caption = "0,00"
.Font.Size = 10: .ForeColor = vbBlue
End With
Set FormC.form_Cambio = Me
End Sub
'-
esto, aunque seguramente esta lleno de 'burradas', funciona bastante bien, pero .. en realidad la idea es por un lado, =>
a) meter dentro de la clase todo, limitando a ser posible a la declaracion de una sola variable de la clase ccaja
que corresponderia al propio formulario, realizando todo el proceso dentro de la clase a traves de los eventos.
aunque por mis pruebas me da la impresion de que las variables withevents tienen que ser cargadas desde el propio modulo del formulario
pues en mis intentos desde dentro de la clase no lo he conseguido
b) por donde iba mi consulta es mas bien si se puede adjuntar al control el codigo inherente a su funcionamiento
sin tener que hacer mencion explicita a este, es decir como si fueran las propiedades y/o metodos predeterminados del control
y que con solo arrastralo desde el cuadro de herramientas hasta su ubicacion, en el archivo que sea
todo el mecanismo de calculo/formateo/etc funcionase sin tener que preocupaarse de donde este el codigo

como decia me da la impresion de que no debe de ser muy facil (si es que es posible), Pero por indagarlo que no quede ...
Respuesta Responder a este mensaje
#4 Ivan
10/02/2008 - 01:04 | Informe spam
hola Hector, muchas gracias una vez mas

disculpa la tardanza, pero he estado haciendo algunas pruebas para
intentar 'definir' un poco mas alguna de las cosas que te comentaba,
pero me temo que he acabado mas liado todavia

de todas formas te comento algunas dudas que me siguen surjiendo
(dejando a un lado ya el tema del [pseudo]ocx, que me da la impresion
de que en VBA no es posible o al menos sencillo)

Empiezo por el final de tu ultimo mensaje=>

2) con relacion a si la declaracion de With Events debiera ir en un tipo de modulo u otro... (seguro ya la conoces)...<<<







[lo 1º gracias por el enlace, causa tambien de mi retraso ... por lo
que respecta a tareas de traduccion y todavia pendiente de concluir]

en realidad mas que a la declaracion (que si no me equivoco debe ir en
el modulo de la clase) me referia a la 'instanciacion' (no se si este
seria el termino adecuado) de los diversos controles como miembros de
la clase

NOTA: disculpame los posibles patinazos en lo que diga, pues todavia
tengo multitud de lagunas y cacao mental en lo que a las clases se
refiere, tanto sobre su [forma de] uso como sobre los diversos
conceptos que se manejan

como tu apuntas parece que lo normal es declarar una matriz o
coleccion ** del tipo ClaseTal en el modulo [en este caso] del
formulario y cargar [en initialice, pej.] los controles que queramos
controlar en dicha variable, los cuales habremos declarado con
withevents dentro de la clase como una/s instancia/s de la misma

ahora, una de mis dudas es si es posible declarar en el form solo una
variable del tipo clase que realmente se correspondiera con el
userform real y poder asi acceder y cargar sus controles desde dentro
de la propia clase, es decir, basicamente lo unico que apareceria en
el formulario [aparte de otros posibles usos de la clase] seria la
declaracion/instanciacion de la clase con algo en el area de
declaraciones tipo =>

Dim MiForm as New cCajaRegistradora

y en el initialice =>

Set MiForm.Contenedor = Me

para luego, dentro del modulo de la clase, una vez obtenido el
formulario, y dado que los controles y su funcionamiento interno entre
ellos siempre serian los mismos, recorrer sus controles y cargarlos
en una matriz/coleccion (o varias), (supongo que habiendo declarado
una variable con with events para cada tipo dentro de la clase) para
poder manipular sus eventos

en definitiva, realizar la carga de los controles dentro del modulo de
la clase y no del formulario.

ni siquiera se hasta que punto tendria sentido ni si seria utl y/o
practico, pero es otra de las cosas que me van surjiendo y que
despiertan mi curiosodad, aunque me da la impresion, que al menos con
los userform tiene su miga .

" b) trabaja con una matriz (o coleccion) de objetos que se asigna al inicializar el formulario (o activar una hoja)" <<<









aqui sobre todo me ha surjido esta duda:=>

en la forma de cargar los objetos, que +/- esta copiada de un ej. de
JW y que funciona muy bien (o a mi me lo parece)

¿que se supone que son Cajon() y SpinN()? ¿matrices, que es lo que
parece por la declaracion? ¿o colecciones, que es lo que parece dar a
entender el tener que empezar a cargarlas en 'base 1'? ¿o simplemente
estoy desvariando y hay algo que no veo?








Dim Cajon() As New cCaja
Dim SpinN() As New cCaja

' aqui cargo los controles
i = n + 1
ReDim Preserve Cajon(i)
Set Cajon(i).Caja = Me.Controls(nTXT(n))
ReDim Preserve SpinN(i)
<<<

y por otro lado =>

" c) utiliza un solo procedimiento_evento para (todos) los objetos "reconocidos" (o incluidos) en dicha matriz" <<<









en este caso ¿ seria valido cargar una sola matriz/coleccion con ambos
tipos de controles?. Es decir algo asi =>

i = n + 1
ReDim Preserve UnaSolaMatriz(i)
Set UnaSolaMatriz(i).Caja = Me.Controls(nTXT(n))
i = n + 2
ReDim Preserve UnaSolaMatriz(i)
Set UnaSolaMatriz(i).BotonNro = Me.Controls(nSPB(n))

o conviene separarlos al menos por tipo de controles??

bueno, como ves, no solo tengo 'unas cuantas dudas' [..son muchas mas
las que me dejo en el tintero ..] sino que ademas tampoco tengo muy
claro como exponerlas. Supongo/espero que de todas formas algo se me
habra entendido

en cualquier caso muchas gracias [y cualquier 'cable' es bienvenido]

un saludo
Ivan
Respuesta Responder a este mensaje
#5 Héctor Miguel
10/02/2008 - 02:17 | Informe spam
hola, Ivan !

__ 1 __
... algunas dudas que me siguen surjiendo (dejando a un lado ya el tema del [pseudo]ocx
que me da la impresionque en VBA no es posible o al menos sencillo)



1) la "fabricacion" de librerias (ocx, dll, etc.) es tema de lenguajes de programacion (delphi, c, vb, etc.)
o podrias usar la edicion "developer" de office que (segun recuerdo) solo estuvo disponible en la version 2000

__ 2 __
... mas que a la declaracion (que si no me equivoco debe ir en el modulo de la clase)
me referia a la 'instanciacion'... de los diversos controles como miembros de la clase...
... parece que lo normal es declarar una matriz o coleccion ** del tipo ClaseTal en el modulo [en este caso] del formulario
y cargar [en initialice, pej.] los controles que queramos controlar en dicha variable
los cuales habremos declarado con withevents dentro de la clase como una/s instancia/s de la misma
... una de mis dudas es si es posible declarar en el form solo una variable del tipo clase que... se correspondiera con el userform real
y poder asi acceder y cargar sus controles desde dentro de la propia clase, es decir, basicamente lo unico que apareceria en el formulario
[aparte de otros posibles usos de la clase] seria la declaracion/instanciacion de la clase con algo en el area de declaraciones tipo =>
Dim MiForm as New cCajaRegistradora
y en el initialice =>
Set MiForm.Contenedor = Me
para luego, dentro del modulo de la clase, una vez obtenido el formulario, y dado que los controles y su funcionamiento interno
... siempre serian los mismos, recorrer sus controles y cargarlos en una matriz/coleccion (o varias)
(supongo que habiendo declarado una variable con with events para cada tipo dentro de la clase) para poder manipular sus eventos
en definitiva, realizar la carga de los controles dentro del modulo de a clase y no del formulario.
ni siquiera se hasta que punto tendria sentido ni si seria util y/o practico pero es otra de las cosas que me van surjiendo
y que despiertan mi curiosodad, aunque me da la impresion, que al menos con los userform tiene su miga ...



2) observa los puntos "clave" de los comentarios anteriores:
a) "declarar Y LLENAR la matriz/coleccion de objetos (p.e.) en el evento de inicializacion del objeto (formulario/hoja/libro)"
b) "seran los objetos que queramos controlar (habiendo declarado la instruccion "WithEvents" en el modulo de clase")

2.1) lo anterior significa que los objetos a controlar (matriz/coleccion) requieren ser identificados y estar disponibles (entonces)
a) habria que hacer que la clase monitoree si tal-o-cual objeto (formulario/hoja/libro) ya esta en el ambiente (o cargado en memoria)
b) hablando de formularios, podrias recorrer la coleccion VBA.UserForms para ver si el que necesitas "ya anda por ahi"...
c) una vez "localizado" el objeto en cuestion, hacer un nuevo "escaneo" por sus controles y llenar las matrices correspondientes

2.2) seguira siendo mas "economico" que cada objeto (formulario/hoja/libro) inicialize los objetos (matriz/coleccion) que requiera :))

OJO: no estoy diciendo que no se puede, simplemente (y como tu apuntas): "hasta que punto tendria sentido... seria util y/o practico"

__ 3 __
" b) trabaja con una matriz (o coleccion) de objetos que se asigna al inicializar el formulario (o activar una hoja)" <<<






aqui sobre todo me ha surjido esta duda:=>
en la forma de cargar los objetos, que +/- esta copiada de un ej. de JW y que funciona muy bien (o a mi me lo parece)
que se supone que son Cajon() y SpinN()? matrices, que es lo que parece por la declaracion?
o colecciones, que es lo que parece dar a entender el tener que empezar a cargarlas en 'base 1'?
o simplemente estoy desvariando y hay algo que no veo?





Dim Cajon() As New cCaja
Dim SpinN() As New cCaja

' aqui cargo los controles
i = n + 1
ReDim Preserve Cajon(i)
Set Cajon(i).Caja = Me.Controls(nTXT(n))
ReDim Preserve SpinN(i)



3) "dicho secamente":
a) Dim Variable() es una declaracion de variables (en este caso, de una matriz de dimension variable)
b) asignarle un tipo: As New <objeto> <= New es una palabra clave que permite la creacion de objetos del tipo <objeto>
(dicho sea de paso, no se puede "mezclar" con WithEvents, por eso es que se requieren llamadas separadas)

__ 4 __
y por otro lado =>
" c) utiliza un solo procedimiento_evento para (todos) los objetos "reconocidos" (o incluidos) en dicha matriz" <<<






en este caso seria valido cargar una sola matriz/coleccion con ambos tipos de controles?. Es decir algo asi =>

i = n + 1
ReDim Preserve UnaSolaMatriz(i)
Set UnaSolaMatriz(i).Caja = Me.Controls(nTXT(n))
i = n + 2
ReDim Preserve UnaSolaMatriz(i)
Set UnaSolaMatriz(i).BotonNro = Me.Controls(nSPB(n))

o conviene separarlos al menos por tipo de controles?



4) (probablemente) podrias usar matrices de mas de una dimension (no haciendo "saltos" entre sus elementos)...
aunque estas son convenientes cuando cada elemento puede administrar varias categorias/propiedades/valores...
si cada elemento es de tipo diferente, (creo que) lo mejor es usar matrices unidimensionales (y una por cada tipo) -?-

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida