Evaluar una expresión que crea un objeto.... cómo?

30/06/2003 - 11:34 por RonnyLab | Informe spam
Que tal, ñuseros:

Los calores del verano afectan a mi mente, y llevo dándole vueltas a esta
cuestión todo el fín de semana sin resultados positivos, a ver si alguien
tuvo el mismo problema con mejores resultados que yo.

La cuestión es que quiero crear un objeto definido por un módulo de clase
Access, pero la clase de este objeto es variable. Para ello se me ocurrieron
dos alternativas:

1. Mediante la función Eval: Set miObjTmp = eval("New " & cNbClase), pero
esta y otras alternativas con eval que he probado me da el error "Microsoft
Access no puede encontrar el nombre 'New' que introdujo en la expresión."

2. Mediante la función CreateObject: Set miObjTmp = Createobject(cNbClase),
pero esta alternativa me dice que "El componente ActiveX no puede crear el
objeto".

Me suena que existe otra función de evaluación, pero no recuerdo el nombre,
he estado buscando en la ayuda sin éxito.

Cualquier sugerencia es acogida de muy buen grado.

Un saludo y gracias.

Preguntas similare

Leer las respuestas

#1 marjan
30/06/2003 - 13:05 | Informe spam
Perdona mi ignorancia... ¿cuando y como declaras la variable objeto?

Saludos,
marjan

"RonnyLab" escribió en el mensaje
news:bdp023$c0n$
Que tal, ñuseros:

Los calores del verano afectan a mi mente, y llevo dándole vueltas a esta
cuestión todo el fín de semana sin resultados positivos, a ver si alguien
tuvo el mismo problema con mejores resultados que yo.

La cuestión es que quiero crear un objeto definido por un módulo de clase
Access, pero la clase de este objeto es variable. Para ello se me


ocurrieron
dos alternativas:

1. Mediante la función Eval: Set miObjTmp = eval("New " & cNbClase), pero
esta y otras alternativas con eval que he probado me da el error


"Microsoft
Access no puede encontrar el nombre 'New' que introdujo en la expresión."

2. Mediante la función CreateObject: Set miObjTmp Createobject(cNbClase),
pero esta alternativa me dice que "El componente ActiveX no puede crear el
objeto".

Me suena que existe otra función de evaluación, pero no recuerdo el


nombre,
he estado buscando en la ayuda sin éxito.

Cualquier sugerencia es acogida de muy buen grado.

Un saludo y gracias.


Respuesta Responder a este mensaje
#2 marjan
30/06/2003 - 16:26 | Informe spam
...pues mientras no viene Chea...

... aunque no acabo de entender lo que quieres (y tampoco creo que te
sirva...) ¿has mirado la colección Modules ? y si puedes referenciar el
objeto desde allí.

Saludos,
marjan

"RonnyLab" escribió en el mensaje
news:bdpb60$j2q$
No hay nada que perdonar, porque el ignorante soy yo ;)

Imagínate un formulario con un textbox (texto0) y un commandbutton
(Comando2)


<tmpForm>
Option Compare Database
Option Explicit

Dim miObjeto As uctTextBox
Dim miObjeto2 As uctTextBox

Private Sub Form_Load()
Set miObjeto = New uctTextBox
Set miObjeto.uctTxt = Me.Texto0 'Aquí si funciona la asignación
correctamente, que por otra parte
'es lo que se espera
End Sub


Private Sub Comando2_Click()
If Not Trim(Me.Texto0.Value) = "" Then
Set miObjeto2 = New uctTextBox
Set miObjeto2.uctTxt = Eval("Me." & Me.Texto0.Value) '(*)
End If
End Sub
</tmpForm>

(*) Ahí falla porque Eval sólo puede evaluar para devolver cadenas de


texto
y valores numéricos. Por otra parte la idea sería crear en una sóla línea
esta y la línea anterior, es decir, dentro de una gama de clases, poder
crear dinámicamente la que me diera la gana.

Te expongo mi clase uctTextbox
<uctTextbox>
Option Compare Database
Option Explicit

Implements iControl

Private m_txtBox As TextBox

Public Property Set uctTxt(Txt As TextBox)
Set m_txtBox = Txt
End Property


Private Property Let iControl_Left(ByVal RHS As Long)
m_txtBox.Left = RHS
End Property

Private Property Get iControl_Left() As Long
iControl_Left = m_txtBox.Left
End Property


Private Property Let iControl_Width(ByVal RHS As Long)
m_txtBox.Width = RHS
End Property

Private Property Get iControl_Width() As Long
iControl_Width = m_txtBox.Width
End Property

Private Property Let iControl_Top(ByVal RHS As Long)
m_txtBox.Top = RHS
End Property

Private Property Get iControl_Top() As Long
iControl_Width = m_txtBox.Top
End Property

Private Property Let iControl_Height(ByVal RHS As Long)
m_txtBox.Height = RHS
End Property

Private Property Get iControl_Height() As Long
iControl_Height = m_txtBox.Height
End Property
</uctTextbox>

y el interface que implementa, iControl

<iControl>
Option Compare Database
Option Explicit

Public Left As Long
Public Top As Long
Public Width As Long
Public Height As Long
</iControl>

En fín ahí queda eso

Un saludote, marjan

"marjan" escribió en el mensaje
news:
> Perdona mi ignorancia... ¿cuando y como declaras la variable objeto?
>
> Saludos,
> marjan
>
> "RonnyLab" escribió en el mensaje
> news:bdp023$c0n$
> > Que tal, ñuseros:
> >
> > Los calores del verano afectan a mi mente, y llevo dándole vueltas a
esta
> > cuestión todo el fín de semana sin resultados positivos, a ver si
alguien
> > tuvo el mismo problema con mejores resultados que yo.
> >
> > La cuestión es que quiero crear un objeto definido por un módulo de
clase
> > Access, pero la clase de este objeto es variable. Para ello se me
> ocurrieron
> > dos alternativas:
> >
> > 1. Mediante la función Eval: Set miObjTmp = eval("New " & cNbClase),
pero
> > esta y otras alternativas con eval que he probado me da el error
> "Microsoft
> > Access no puede encontrar el nombre 'New' que introdujo en la
expresión."
> >
> > 2. Mediante la función CreateObject: Set miObjTmp > > Createobject(cNbClase),
> > pero esta alternativa me dice que "El componente ActiveX no puede


crear
el
> > objeto".
> >
> > Me suena que existe otra función de evaluación, pero no recuerdo el
> nombre,
> > he estado buscando en la ayuda sin éxito.
> >
> > Cualquier sugerencia es acogida de muy buen grado.
> >
> > Un saludo y gracias.
> >
> >
>
>


Respuesta Responder a este mensaje
#3 Juan M Afan
30/06/2003 - 19:43 | Informe spam
Hola,

no estoy muy seguro de si es lo que preguntas, pero dices
que aquí

Set miObjeto2.uctTxt = Eval("Me." & Me.Texto0.Value)

es donde te falla el código (efectivamente, falla por lo
que tú comentas). Si mi suposición es correcta el valor de
Texto0 contendrá el nombre de otro cuadro de texto, ¿no?.
Si fuera así, creo que lo que te serviría sería este otro
tipo de asignación:

Set miObjeto2.uctTxt = Me.Controls(Me.Texto0.Value)

A ver si es eso.

Saludos,
happy


No hay nada que perdonar, porque el ignorante soy yo ;)

Imagínate un formulario con un textbox (texto0) y un


commandbutton
(Comando2)


<tmpForm>
Option Compare Database
Option Explicit

Dim miObjeto As uctTextBox
Dim miObjeto2 As uctTextBox

Private Sub Form_Load()
Set miObjeto = New uctTextBox
Set miObjeto.uctTxt = Me.Texto0 'Aquí si funciona


la asignación
correctamente, que por otra parte
'es lo que se espera
End Sub


Private Sub Comando2_Click()
If Not Trim(Me.Texto0.Value) = "" Then
Set miObjeto2 = New uctTextBox
Set miObjeto2.uctTxt = Eval("Me." &


Me.Texto0.Value) '(*)
End If
End Sub
</tmpForm>

(*) Ahí falla porque Eval sólo puede evaluar para


devolver cadenas de texto
y valores numéricos. Por otra parte la idea sería crear


en una sóla línea
esta y la línea anterior, es decir, dentro de una gama de


clases, poder
crear dinámicamente la que me diera la gana.

Te expongo mi clase uctTextbox
<uctTextbox>
Option Compare Database
Option Explicit

Implements iControl

Private m_txtBox As TextBox

Public Property Set uctTxt(Txt As TextBox)
Set m_txtBox = Txt
End Property


Private Property Let iControl_Left(ByVal RHS As Long)
m_txtBox.Left = RHS
End Property

Private Property Get iControl_Left() As Long
iControl_Left = m_txtBox.Left
End Property


Private Property Let iControl_Width(ByVal RHS As Long)
m_txtBox.Width = RHS
End Property

Private Property Get iControl_Width() As Long
iControl_Width = m_txtBox.Width
End Property

Private Property Let iControl_Top(ByVal RHS As Long)
m_txtBox.Top = RHS
End Property

Private Property Get iControl_Top() As Long
iControl_Width = m_txtBox.Top
End Property

Private Property Let iControl_Height(ByVal RHS As Long)
m_txtBox.Height = RHS
End Property

Private Property Get iControl_Height() As Long
iControl_Height = m_txtBox.Height
End Property
</uctTextbox>

y el interface que implementa, iControl

<iControl>
Option Compare Database
Option Explicit

Public Left As Long
Public Top As Long
Public Width As Long
Public Height As Long
</iControl>

En fín ahí queda eso

Un saludote, marjan

"marjan" escribió en el mensaje
news:
Perdona mi ignorancia... ¿cuando y como declaras la




variable objeto?

Saludos,
marjan

"RonnyLab" escribió en el




mensaje
news:bdp023$c0n$




data.net...
> Que tal, ñuseros:
>
> Los calores del verano afectan a mi mente, y llevo




dándole vueltas a
esta
> cuestión todo el fín de semana sin resultados




positivos, a ver si
alguien
> tuvo el mismo problema con mejores resultados que yo.
>
> La cuestión es que quiero crear un objeto definido




por un módulo de
clase
> Access, pero la clase de este objeto es variable.




Para ello se me
ocurrieron
> dos alternativas:
>
> 1. Mediante la función Eval: Set miObjTmp = eval




("New " & cNbClase),
pero
> esta y otras alternativas con eval que he probado me




da el error
"Microsoft
> Access no puede encontrar el nombre 'New' que




introdujo en la
expresión."
>
> 2. Mediante la función CreateObject: Set miObjTmp >> Createobject(cNbClase),
> pero esta alternativa me dice que "El componente




ActiveX no puede crear
el
> objeto".
>
> Me suena que existe otra función de evaluación, pero




no recuerdo el
nombre,
> he estado buscando en la ayuda sin éxito.
>
> Cualquier sugerencia es acogida de muy buen grado.
>
> Un saludo y gracias.
>
>






.

Respuesta Responder a este mensaje
#4 RonnyLab
30/06/2003 - 20:02 | Informe spam
Es correcto Juan y muchas gracias

Pero el objeto es que en Texto0.Value figure cualquier típo de módulo de
clase que tenga mi proyecto access por ejemplo cClientes.

Un saludo
"Juan M Afan" escribió en el mensaje
news:006b01c33f2f$2fbb4240$
Hola,

no estoy muy seguro de si es lo que preguntas, pero dices
que aquí

Set miObjeto2.uctTxt = Eval("Me." & Me.Texto0.Value)

es donde te falla el código (efectivamente, falla por lo
que tú comentas). Si mi suposición es correcta el valor de
Texto0 contendrá el nombre de otro cuadro de texto, ¿no?.
Si fuera así, creo que lo que te serviría sería este otro
tipo de asignación:

Set miObjeto2.uctTxt = Me.Controls(Me.Texto0.Value)

A ver si es eso.

Saludos,
happy


No hay nada que perdonar, porque el ignorante soy yo ;)

Imagínate un formulario con un textbox (texto0) y un


commandbutton
(Comando2)


<tmpForm>
Option Compare Database
Option Explicit

Dim miObjeto As uctTextBox
Dim miObjeto2 As uctTextBox

Private Sub Form_Load()
Set miObjeto = New uctTextBox
Set miObjeto.uctTxt = Me.Texto0 'Aquí si funciona


la asignación
correctamente, que por otra parte
'es lo que se espera
End Sub


Private Sub Comando2_Click()
If Not Trim(Me.Texto0.Value) = "" Then
Set miObjeto2 = New uctTextBox
Set miObjeto2.uctTxt = Eval("Me." &


Me.Texto0.Value) '(*)
End If
End Sub
</tmpForm>

(*) Ahí falla porque Eval sólo puede evaluar para


devolver cadenas de texto
y valores numéricos. Por otra parte la idea sería crear


en una sóla línea
esta y la línea anterior, es decir, dentro de una gama de


clases, poder
crear dinámicamente la que me diera la gana.

Te expongo mi clase uctTextbox
<uctTextbox>
Option Compare Database
Option Explicit

Implements iControl

Private m_txtBox As TextBox

Public Property Set uctTxt(Txt As TextBox)
Set m_txtBox = Txt
End Property


Private Property Let iControl_Left(ByVal RHS As Long)
m_txtBox.Left = RHS
End Property

Private Property Get iControl_Left() As Long
iControl_Left = m_txtBox.Left
End Property


Private Property Let iControl_Width(ByVal RHS As Long)
m_txtBox.Width = RHS
End Property

Private Property Get iControl_Width() As Long
iControl_Width = m_txtBox.Width
End Property

Private Property Let iControl_Top(ByVal RHS As Long)
m_txtBox.Top = RHS
End Property

Private Property Get iControl_Top() As Long
iControl_Width = m_txtBox.Top
End Property

Private Property Let iControl_Height(ByVal RHS As Long)
m_txtBox.Height = RHS
End Property

Private Property Get iControl_Height() As Long
iControl_Height = m_txtBox.Height
End Property
</uctTextbox>

y el interface que implementa, iControl

<iControl>
Option Compare Database
Option Explicit

Public Left As Long
Public Top As Long
Public Width As Long
Public Height As Long
</iControl>

En fín ahí queda eso

Un saludote, marjan

"marjan" escribió en el mensaje
news:
Perdona mi ignorancia... ¿cuando y como declaras la




variable objeto?

Saludos,
marjan

"RonnyLab" escribió en el




mensaje
news:bdp023$c0n$




data.net...
> Que tal, ñuseros:
>
> Los calores del verano afectan a mi mente, y llevo




dándole vueltas a
esta
> cuestión todo el fín de semana sin resultados




positivos, a ver si
alguien
> tuvo el mismo problema con mejores resultados que yo.
>
> La cuestión es que quiero crear un objeto definido




por un módulo de
clase
> Access, pero la clase de este objeto es variable.




Para ello se me
ocurrieron
> dos alternativas:
>
> 1. Mediante la función Eval: Set miObjTmp = eval




("New " & cNbClase),
pero
> esta y otras alternativas con eval que he probado me




da el error
"Microsoft
> Access no puede encontrar el nombre 'New' que




introdujo en la
expresión."
>
> 2. Mediante la función CreateObject: Set miObjTmp >> Createobject(cNbClase),
> pero esta alternativa me dice que "El componente




ActiveX no puede crear
el
> objeto".
>
> Me suena que existe otra función de evaluación, pero




no recuerdo el
nombre,
> he estado buscando en la ayuda sin éxito.
>
> Cualquier sugerencia es acogida de muy buen grado.
>
> Un saludo y gracias.
>
>






.

Respuesta Responder a este mensaje
#5 RonnyLab
01/07/2003 - 00:34 | Informe spam
Que tal, Juan.

La verdad es que estoy flipando con lo que os estoy quebrando la cabeza
jjejejejejejej, y el mérito es doble con el calor que hace

La solución que propones es correcta, soluciona el problema pero me gustaría
ir un poco más allá, el tema es que imaginate que para actualizar a un
cliente bastara con enviarle un módulo de clase y actualizar un registro en
una tabla con el nombre de ese módulo de clase a lo mejor con ese
ejemplo me explico un poco mejor.

Creo que el problema de todo esto es encontrar una función similar a Eval,
sé que existe, porque un día, hace muuuuuucho tiempo me pareció verla en la
ayuda o por Internet, no recuerdo, pero ahora no la encuentro o estaba
soñando aquel día

Sigo navegando en la ayuda y en Internet a ver si lo localizo... si lo
encuentro lo postearé en las News..

De todos modos, y lo digo de corazón, muchísimas gracias por vuestra
paciencia.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida