Programación General > Visual Basic para principiantes

 Err "ActiveX no crea objeto" y "No tipo definido x usuario"

<< < (2/2)

Nebire:

--- Cita de: "DeathWatch" --- Hola de nuevo, ya ando por aqui otra vez  :P

--- Citar ---Nebire escribio:
Eres tú quien pregunta y tienes dudas... yo lo tengo muy claro.
--- Fin de la cita ---
:huh:
Yo se que tu lo tienes claro, puesto que me explicaste y me ayudaste a resolver mi problema.
Me referia a si no habia enredado mucho comentando lo que estaba haciendo, de forma que solo yo me estuviera entendiendo, y si habia explicado esta vez la raiz del problema que tenia.
--- Fin de la cita ---
Esto te lo decía en broma... entendí que al intentar explicarte, te pareció no desenvolverte bien y enbarullarlo más...


--- Cita de: "DeathWatch" ---

--- Código: Visual Basic --- dim fso, carpset fso=GetObject("", "Scripting.FileSystemObject")set carp=fso.GetFolder("C:Documents and SettingsDeathWatchMis documentosScripts")x=carp.Namemsgbox xset fso=Nothingset carp=Nothing 
--- Fin de la cita ---
Es correcto, pero siempre que puedas usa referencias,  piensa que además de lo referente a la tabla, si en tiempo de diseño se declara el tipo de objeto, cuando se compila no necesita comprobar los tipos, por lo que resulta más rápido


--- Cita de: "DeathWatch" ---En mi ejemplo, al  registrar el Exe ActiveX con /RegServer, debo usar GetObject en lugar de CreateObject?

--- Fin de la cita ---
Son similares, pero se usa Create object para obtener la 1º referencia y luego getObject para las siguientes...


--- Cita de: "DeathWatch" ---Si no lo registro, usando Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.exe", "XProyEjec.XClsEjec"), funcionaría?
Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.dll", "XProyEjec.XClsEjec")

--- Fin de la cita ---
Esto está equivocado... no me leiste bien al final del post anterior

autocitándome:

--- Cita de: "Nebire" ---Luego, si por ejemplo tu aplicación opera con un tipo de archivo cuya extensión fuera pongamos ".banco" , podrías utilizar la función getobject para crear el objeto cargando ya el archivo indicado...

--- Código: Visual Basic ---dim miObjeto as objectSet miObjeto= GetObject("C:archivo.banco", "MiproyectoActivexexe.Suclase")  Y por tanto como podrás ver, nada tiene que ver esta ruta con la ruta donde se localiza el exe activeX
--- Fin de la cita ---


--- Cita de: "DeathWatch" ---(Esto lo voy a probar personalmente, pero si no funciona, si me pudieras comentar la razon, porfas)

--- Fin de la cita ---
No te molestes, ya te he indicado que eso no es correcto... y te he indicado la razón.


--- Cita de: "DeathWatch" ---Una ultima pregunta  :P
Usando el ejemplo que puse, si en lugar de un Exe ActiveX fuera un Dll ActiveX, tal cual con los objetos form y timer y demas, he indicando en las propiedades del proyecto, Subprocesos independientes, si escribo
podria funcionar? respetando el multi-threading?

--- Fin de la cita ---
Échale un vistazo al 'patrón Singleton', bucea por 'gúgel'...

DeathWatch:
Hola que hay  :D

Ps antes que nada, gracias otra vez Nebire por tu tiempo y tus respuestas.
Me has aclarado varias cosas nuevamente, las cuales me serviran de mucho.

Dejame decirte tambien que esto de las clases es practicamente nuevo para mi  :(
Estuve buscando lo que me sugeriste del patron Singleton (instancia unica) y lo que alcance a entender es que se usa para evitar mas de una instancia a un objeto, pero que se pueden hacer varias referencias a ese objeto, usando esa unica instancia, lo que me hace pensar que usando un dll igual se podria crear una clase, y hacer varias referencias a un objeto por medio de tal clase, y que funcione como el ejemplo de multi-threading que escribi, pero no me queda nada claro... por que si? por que no?...  :angry:  :hitcomp:
Simplemente sobrepasa mi nivel de conocimiento  :argh:

Pero bueno...

Por otro lado, seguire buscando el metodo GetObject, pues no me queda claro para que sirve entonces el primer parametro...

--- Citar ---DeathWatch escribió:
Si no lo registro, usando Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.exe", "XProyEjec.XClsEjec"), funcionaría?
Set Ejec_1 = GetObject("C:Documents and SettingsDeathWatchMis documentosXEjecutor.dll", "XProyEjec.XClsEjec")
--- Fin de la cita ---


--- Citar ---Nebire escribió:
Luego, si por ejemplo tu aplicación opera con un tipo de archivo cuya extensión fuera pongamos ".banco" , podrías utilizar la función getobject para crear el objeto cargando ya el archivo indicado...

--- Código: Visual Basic ---dim miObjeto as objectSet miObjeto= GetObject("C:archivo.banco", "MiproyectoActivexexe.Suclase") 
Y por tanto como podrás ver, nada tiene que ver esta ruta con la ruta donde se localiza el exe activeX
--- Fin de la cita ---
"MiproyectoActivexexe.Suclase" hace referencia al proyecto y clase del ActiveX, pero "C:archivo.banco", donde se carga, que carga (las clases del archivo .banco?), para que sirve el 1er parametro si el 2do no hace referencia a él, si es para que al ya estar cargado, posteriormente se pueda instanciar por ejemplo ("MiPoryectoArchivoBanco.Subclase"), etc?

 :brickwall:  :brickwall:

En fin... seguire investigando...

Te agradezco mucho tus aportaciones. Me han servido de mucho.
Ya le agregaré tales mejoras a mis progamas.

Un saludo  :)

Nebire:

--- Cita de: "DeathWatch" ---Hola que hay  :D
 pero "C:archivo.banco", donde se carga, que carga (las clases del archivo .banco?), para que sirve el 1er parametro si el 2do no hace referencia a él
Un saludo  :)
--- Fin de la cita ---
Creo que me he explicado bien, sin embargo es normal que a pesar de ello a veces alguien no acabe de entender una cosa que nos parece (al que lo explica) bastante clara..

...así que intentaré explicártelo mejor con otro ejemplo.

Supongamos que tu eres el creador de  winrar, el programa para comprimir archivos. bien, como parte de tu programa tu has creado unas librerías pero también un tipo de fichero que se asocia con el programa, los archivos *.rar .... entonces se puede usar getobject, para que al mismo tiempo que crear el objeto ya reciba como parámetro de entrada un archivo de tipo rar.
Para qué quieres cargar un archivo rar ?.... pués porque eso es lo que se supone que hace tu programa trabajar con artivos de ese tipo... por tanto usas getobject y si lo necesitas le pasas la ruta de un archivo rar (por ejmplo: c:mis secretos.rar), entonces cuando se cargue el objeto ya abre el archivo de acuerdo a como opera el programa. Naturalmente no esás obligado a usar dicho parámetro, por ejemplo si vas a comprimir, no te hará falta, perosi vas a descomprimir un archivo (y esa es la razón por la que necesitas crear el objeto), pués selo pasas directamente...

Un modo de entenderlo mejor es llevándolo a la práctica... y un excelento ejemplo para llevarlo a la práctica esutilizar excel (por ejemplo),


--- Código: Visual Basic --- dim xcel as object set xcel = getobject("c:mis gastos.xls","Excel.Application") Debes notar YA sin dificultad que 'C:mis gastos.xls es un archivo que excel reconoce, que excel crea y que excel entiende. si yo le  digo "Excel.Application", ya sabe que objeto es (si está en la ROT o por lo menos regisrado en el equipo), por tanto carece de sentido indicar la ruta de donde se encuantra excel.exe, a nosotros no nos importa. La ruta del exe, sólo debe usarse para registrar la librería y ni getobject, ni createobject registran ninguna librería, tan sólo proporcionan una instancia a un objeto ya registrado, al igual que NEW, la diferencia con New, es que createobject y getobject se aplican a objetos no referenciados al crear la aplicación.

La programación en realidad no tiene nada de misterioso, son cosas muy sensatas y muy meditadas, a menudo cuando alguien pretende enseñarte algo, en realidad no te enseña nada que no supieras ya (de algún modo), sino que lo que hace es decirte con otro nombres y jerga 'extraña' algo que ya sabías tú por tí mismo. si en la vida piensas de forma coherente, verás que la programación es fácil y la parte difícil es aquella en la que tienes que entender que tal nombre largo y extraño es tal cosa.

Imgina el S.O. como tu casa, imagina los objetos como 'comida'... cuando usamos new, es como ir a la nevera (frigorífico), si hay cerveza, pués coges una pero y si no hay ???  (esto es una referencia en el proyecto, asegurarse de poner en la nevera las cervezas para cuando por la tarde empiece el partido y lo vayas a ver con los amigotes, estén a mno y fresquitas), pero si olvidaste reponerlo, puedes ir a la despensa, ese pequeño almacén donde guardas las compras dirias o semanales, claro que las cervezas estar´ñan calientes y seguramente estará más alejado de la tv. que la nevera, pero es lo que hay... bien este almacén, alacena, despensa o como lo quieras llamar, es el registro de 'güindous', para acceder aquí ya no se usa new, ahora debe usarse createobject  o getobject ... finalmente si ni en tu alamacén hay cervezas, lo que queda es mandar a alguien a comprarlas a la tienda más cercana... esto es instalar la librería, para que así esté diponible en tu almacén, y si lo quieres fresquito pués lo metes en la nevera (una referencia en tu proyecto)... Ahora entiende que tomar una cerveza de la nevera, o del almacén implica que debe existir , que ya lo has comprado y comprarlo (el paquete de cervezas) es lo que llamamos registrar la librería.... son 2 cosas ditintas.... new=trae la cervezade la nevera, Createobject= trae la cerveza del almacén (es más lento, debe comprobar si existe, y como es bastante más grandote que la nevera tardará mucho más) y  regsvr32= ve a comprar un paquete de cervezas (que son depositadas  en el almacén, disponibles si es whisky a lo mejor está reservado y no cualquiere puede echarse un vasito,  :beer: ).

No puedo explicarlo más claro, si te quedan dudas quizás debas mirar en otro sitio y ver si te lo explican de un modo que puedas entenderlo, aunque como te digo, a mi me parece que hablo muy sencillo y claro, de hecho casi nunca uso jerga, precisamente porque sólo sirve para entorpecer al que no sabe.

p.d.: Me olvidaba de una cosa importante respecto a GetObject...
Al usar el primer parámetro, ya no es obligatorio el segundo (en según qué objetos), usando el ejemplo que puse como código...:
set xcel = getobject("c:mis gastos.xls","Excel.Application"), puesto que he proporcionado una ruta, el ya localiza que librería le pertenece, por tanto asigna una referencia al objeto que lo manipula, por tanto esta otra línea es igualmente correcta (fíjate que utilizo otro objeto de excel distinto del anterior):

--- Código: Visual Basic --- dim xBook  as excel.workbookset xBook  = getobject("c:mis gastos.xls")  Puede (eso si), ocurrir algún problema si otra librería que no es la esperada se ha asignado(la ha desbancado al pulsar doble click sobre un xls, se abre otra aplicación y no excel) , la extensión xls para si y sucede que los métodos (con sus parámetros) y propiedades  para manejar ese 'otro' objeto, no son los que utiliza excel.exe que son los que tu usas en tu código...

Con éste último ejemplo, espero que ahora si, podrás entender porqué este parámetro (que te parece extraño), es útil... porque resulta válido para localizar,  crear y devlver una instancia válida al objeto que lo maneja, que en este caso es excel... Y por último debes saber que esto último sólo funciona si el objeto es lo que se conoce como un 'documento compuesto', es decir tiene referencias a varios objetos (fíjate como el objeto lo he designado para que lo veas claramente: as excel.workbook, no como excel.application).

DeathWatch:
Perfecto!!! Mas que entendido  :good:  :good:  :good:

Muchas gracias Nebire, por tus aclaraciones.
Igual, gracias por tu tiempo.

Por aqui andaremos, consultando, y aportando (dentro de lo que se sepa y se pueda  :P)

Un saludo
Excelente semana :beer:

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa