Como habgo para ejecutar un String dentro de un windows form, lo he
intentado de mil maneral pero no lo he logrado:
Mas detalles sobre mi probles es lo siguiente:
dim a as string
a="form1.show"
Como hago para ejecutar el contenido de la cadena?
Sería una buena idea que nos explicases qué estás intentando hacer y
tal vez te puediésemos ayudar mejor, ya que lo que pretendes no es muy
habitual.
A ver, para conseguir lo que quieres vas a necesitar dar un buen
repaso a tus conocimientos de Reflexión en .Net. No tengo un Visual
Studio a mano así que te digo a grandes rasgos lo q has de hacer.
1. Parsear la cadena para dividirla en trozos: namespace, clase,
objeto, método, propiedad,....
2. Como entiendo que lo que quieres es acceder a objetos ya creados
(como en el ejemplo que expones), lo siguiente que debes hacer es
recuperar la instancia del objeto a la que el String hace referencia.
En el caso de los formularios, creo recordar que dentro de Application
tienes una propiedad que te devuelve todos los formularios creados.
3. Ahora es el turno de invocar el método o la propiedad. Para ello es
necesario que recuperes el tipo del objeto, con typeof o con
System.Type.GetType. Una vez recuperado el tipo, lo usas para saber si
Show es una propiedad, un método o qué.
4. Con está información, utilizas el método InvokeMember para ejecutar
lo que quieres. A InvokeMember se le pasa el nombre del método o
propiedad, un flag indicando que es lo que quieres hacer (ejecutar,
asignar, leer,...), el objeto sobre el que lo quieres hacer y los
argumentos (si se trata de un método y los hay).
Un saludo y recuerda comentar que es lo que tratas de hacer, quizá te
podamos dar otro punto de vista para conseguirlo sin tener que pasar
por esto.
Dentro de un formulario llamado "Form2" tengo creada una variable
llamada "Empleados" que fue creada a partir de una "Clase Propietaria"
es decir que yo la cree en otro archivo y deriva de este.
Entonces dicha instancia "Empleados" tiene unos métodos a los cuales
yo quiero accederlos, desde un "String". Hago alusión a estos métodos
desde una variable tipo estring porque su asignación es dinámica y
puede llamar al "Método1" ó al "Método2" dependiendo del contenido de
la Variable.
El problema se complica más aún, porque para ejecutar dicha variable
"String" yo hago la llamada desde un control que inserto en el
Formulario "Form2".
Entonces la llamada a este método sin una variable "String" sería de
esta forma:
---------------------
Private Formx As Form
CType(Formx, Pictures.Form2).Empleados.InsertCommand(Data_Row)
-------------------
En donde yo creo una variable "Formx" desde el control para poder
acceder a las variables contenidas en el formulario original osea
"Form2" del proyecto "Pictures". esa es la parte de "CType(Formx,
Pictures.Form2)". Luego accedo a la variable "Empleados" que forma
parte del formulario original "Form2"; es allí donde yo quiero
utilizar una variable "String" porque así como tengo la variable
"Empleados" tengo otra que se llama "Departamentos" y una variable de
este tipo podría citar a la una "Empleados" u a la otra
"Departamentos"
Entonces explico que es lo que no se me permite:
---------------
Private Formx As Form
Private TableName As String >>Suponiendo que valga "Empleados" como
texto
CType(Formx, Pictures.Form2).TableName.InsertCommand(Data_Row)
------------
Esto me provoca un error ya que VB.Net me responde con: "TableName" no
es un miembro de "Pictures.Form2"
Bueno chicos no se si ahora lo complique todo, pero yo necesito
ejecutar ese string y llevo tres dias intenteando pero nada, ustedes
me han dado una pista con "Reflection2 pero nunca lo he utilizado ...
Les agradezco por alguna ayuda y adelante con la Célula de .Net
Por lo que comentas sólo tienes dos variables (Empleados y
Departamentos) a las que quieres acceder. Si es así, facilita mucho
las cosas.
Además, la clase de acceso que quieres no es una práctica recomendable
en Ingenirería del SW: acceder directamente a las variables de otro
objeto. Por eso te aconsejo que crees un método público en Form2 al
que le pases como argumento el nombre de la variable a la que quieres
acceder, el método al que quieres llamar y los parámetros que le
quieres pasar al método (3 strings).
Dentro de ese método público tan sólo tendrás que:
1. guardar en una variable local la tabla a la que vayas a acceder:
DateTable tabla;
if(tablename=="Empleados") then tabla=Empleados;
else tabla=Departamentos;
2. Ahora bien podrías usar reflexión para invocar el método o usar un
switch..case (no sé en VB el equivalente) con la instrucción adecuada:
switch(metodo)
{
case "InsertCommand": tabla.InsertCommand(datos);
break;
case "UpdateCommand": tabla.UpdateCommand(datos);
break;
default: break;
}
Con reflexión serían muchas menos líneas de código, pero con el switch
te resultará más fácil.
Un saludo.
------------------
Estando dentro del "Contro de Usuario" (que tiene su propio archivo)
yo hago lo siguiente:
Private Formx As Form
Formx = Me.ParentForm
De este modo yo obtengo acceso al formulario y todos sus controles
-------------------------------------
Ya que el acceder de la siguiente forma no me resulta conveniente:
Dim Formx as Form2
porque al hacer esto yo instancio una nueva variable, que en efecto si
hereda de "Form2" pero es una nueva instacia por tanto no obtengo los
últimos cambios que tuvo el formualrio.
-----------------------------------------
Existe otra forma de acceder a los formualrios y todas las
propiedades, metodos y eventos y sin luego tener que hacer
esto??????????????
CType(Formx, Pictures.Form2).Empleados
--------------------------------
Por otro lado, en cuanto a la Clase de Acceso a las variables de otro
objeto (el hacerlo de la forma correcta en Ing dse Software) lo que yo
trato de respetar es Variables de Modulo ----> Visibles a todo el
Proyecto
Variables de Formulario ----> Las hago de tipo Friend (Visible dentro
de si mismo)
Pero la cuestión esta en que las variables "Empleados" y
"Departamentos" son dos clases que residen el módulo, más nó el el
formulario, en el Formulario "Form2" lo que yo hago es instanciar dos
variables para utilizarlas.
¿Porfavor corrigeme ante cualquier tipo de infracción, en cuanto al
respecto y el tipo de acceso en Ing de Software, pues no quiero ser
chapucero :P ?
Mil gracias
Me explico:
Para acceder a un formulario "Form2" que contiene sus propas variables
internas (Variable1, Variable2) desde un control que se encuentra
dentro del formulario
On 5 feb, 11:33, "JAMA" <jomo...@gmail.com> wrote:
> Bueno, muy claro no ha quedado :P pero creo que suficiente para
> recomendarte otra solución a la que intentas.
>
> Por lo que comentas sólo tienes dos variables (Empleados y
> Departamentos) a las que quieres acceder. Si es así, facilita mucho
> las cosas.
> Además, la clase de acceso que quieres no es una práctica recomendable
> en Ingenirería del SW: acceder directamente a las variables de otro
> objeto. Por eso te aconsejo que crees un método público en Form2 al
> que le pases como argumento el nombre de la variable a la que quieres
> acceder, el método al que quieres llamar y los parámetros que le
> quieres pasar al método (3 strings).
> Dentro de ese método público tan sólo tendrás que:
>
> 1. guardar en una variable local la tabla a la que vayas a acceder:
>
> DateTable tabla;
> if(tablename=="Empleados") then tabla=Empleados;
> else tabla=Departamentos;
>
> 2. Ahora bien podrías usar reflexión para invocar el método o usar un
> switch..case (no sé enVBel equivalente) con la instrucción adecuada:
Por último si esta en linea, podemos charlar en el msn....
On 5 feb, 20:38, "VictorBustos" <victor_bustos2...@hotmail.com> wrote:
> Otra cosa JAMA, es que la solución con el "Switch CASE" no sería la
> conveniente, pues como te explico lo que yo quiero es hacer las
> invocaciones desde el control, y el hacerlo con "Switch Case" haría
> algo muy incorrecto como mezclar dentro del "Control de Usuario"
> código de la "lógica de Negocio".
Y las invocaciones seguirás haciéndolas desde el control, pero dónde
se ejecutarán realmente será en el Form2 ya que en el control estarás
llamando a un método de Form2 pasándole la tabla, el método y los
datos.
>
> Por último si esta en linea, podemos charlar en el msn....
>
> On 5 feb, 14:32, "VictorBustos" <victor_bustos2...@hotmail.com> wrote:
>
> > Creo que no me explique muy bien....
> > Tienes razón en algo y es que (Se debe respetar la forma de Acceso en
> > cuanto a Ing de Software), pero talvez la cuestion no esta en como
> > ejecutar la variable "String" sino en la forma como yo accedo al
> > formulario desde un "Control de Usuario" este control aun cuando esta
> > dentro del formulario, es un archivo independiente (Osea otra clase
> > aparte del "Form2") y para yo poder ver las variables del formulario
> > que lo contiene yo hago lo siguiente:
Tienes razón, la cuestión está en cómo debes acceder a los atributos y
métodos del formulario desde otro objeto, y te aseguro que no es
relevante que sean archivos separados. Es más, separar las
definiciones es lo correcto.
> > ------------------
> > Estando dentro del "Contro de Usuario" (que tiene su propio archivo)
> > yo hago lo siguiente:
>
> > Private Formx As Form
> > Formx = Me.ParentForm
>
> > De este modo yo obtengo acceso al formulario y todos sus controles
> > -------------------------------------
> > Ya que el acceder de la siguiente forma no me resulta conveniente:
> > Dim Formx as Form2
> > porque al hacer esto yo instancio una nueva variable, que en efecto si
> > hereda de "Form2" pero es una nueva instacia por tanto no obtengo los
> > últimos cambios que tuvo el formualrio.
> > -----------------------------------------
Bueno, al definir una variable de un tipo concreto, puede suceder que
la variable se instancie sin llegar a haber llamado a su constructor
si entre sus atributos hay alguno definido de determinada forma. Esto
no es un problema. Lo que deberías hacer a continuación es hacer
exactamente la misma asignación que has puesto arriba, o sea:
Dim Formx as Form2 'o Private Formx As Form2 como prefieras
Formx = Me.ParentForm
De esta forma ya no es necesario que hagas la conversión de tipos que
muestras aquí abajo.
>
> > Existe otra forma de acceder a los formualrios y todas las
> > propiedades, metodos y eventos y sin luego tener que hacer
> > esto??????????????
> > CType(Formx, Pictures.Form2).Empleados
> > --------------------------------
> > Por otro lado, en cuanto a la Clase de Acceso a las variables de otro
> > objeto (el hacerlo de la forma correcta en Ing dse Software) lo que yo
> > trato de respetar es Variables de Modulo ----> Visibles a todo el
> > Proyecto
> > Variables de Formulario ----> Las hago de tipo Friend (Visible dentro
> > de si mismo)
>
> > Pero la cuestión esta en que las variables "Empleados" y
> > "Departamentos" son dos clases que residen el módulo, más nó el el
> > formulario, en el Formulario "Form2" lo que yo hago es instanciar dos
> > variables para utilizarlas.
>
> > ¿Porfavor corrigeme ante cualquier tipo de infracción, en cuanto al
> > respecto y el tipo de acceso en Ing de Software, pues no quiero ser
> > chapucero :P ?
Si quién ha de trabajar con Empleados y Departamentos es el Form2, e
imagino que sí porque es quién las instancia, sólo el Form2 debería
tener acceso a ellas. El resto de formularios y controles deberían
invocar a métodos del Form2 si quieren hacer algo con Empleados y
Departamentos. Es por eso que te decía en el post anterior que creases
el método público con el switch..case DENTRO de Form2 (no en el
control de usuario). De esta forma consigues la encapsulación de
objetos que promueve la orientación a objetos.
>
> > Mil gracias
>
> > Me explico:
>
> > Para acceder a un formulario "Form2" que contiene sus propas variables
> > internas (Variable1, Variable2) desde un control que se encuentra
> > dentro del formulario
Acceder directamente a las variables de otro objeto no es una buena
práctica y rompe la encapsulación de los objetos.
> > > Un saludo.
Un abrazo.
Dim Formx as Pictures.Form2 'o Private Formx As Pictures.Form2 como
prefieras
Formx = Me.ParentForm
Se me olvido poner el espacio de nombres.