• Viernes 15 de Noviembre de 2024, 11:55

Autor Tema:  Detectar Click o doble click en cualquier objeto  (Leído 2146 veces)

eldelpuerto

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Detectar Click o doble click en cualquier objeto
« en: Sábado 7 de Marzo de 2009, 20:36 »
0
Hola a todos!
Necesito ayuda.
Alguien puede decirme como puedo hacer lo siguiente:

Me gustaria darle un click con el boton del medio (o rueda) en cualquier objeto de cualquier form de un proyecto y que me saliera un mensaje dicendome como se llama el objeto, tipo de objeto que es, form al que pertenece..etc.. o sea poder saber sus propiedades.


No sé si me he explicado bien.
muchas gracias por todo.

Nota.- Claro está que no qjuiero poner una funcion por cada objeto que existe en los forms, sería una funcion comun para todos los objetos.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Detectar Click o doble click en cualquier objeto
« Respuesta #1 en: Domingo 8 de Marzo de 2009, 03:26 »
0
Cita de: "eldelpuerto"
...Me gustaria darle un click con el boton del medio (o rueda) en cualquier objeto de cualquier form de un proyecto y que me saliera un mensaje dicendome como se llama el objeto, tipo de objeto que es, form al que pertenece..etc.. o sea poder saber sus propiedades...
Esto es imposible...
Si yo creo un control Activex, que tiene pongamos 3 cajas de texto, 2 picturebox 2 label y 3 shapes, lo más que podrás encontrar es el nombre del control, ya no sabrás si yo he usado un label o si hice un 'print' directamente, tampoco sabrás si son realmente shapes o si son métodos gráficos y las cajas de texto o lo picturebox, pasa lo mismo, podrás sospechar que es esto o aquello pero nada más.
De igual forma todos los objetos que no tienen un controlador de ventana, tampoco podrás obtener info directamente.
Siempre puede haber controles no visibles, ocultos o suplantando a otros de modo que se puede afirmar que es imposible en la práctica, en teoría posible es posible, otra cosa es lo que necesites hacer para descubrirlo y se merece la pena el tiempo invertido. Esto es, si eres capaz de desemsamblar cualquier código y entenderlo perfectamente es en ese caso que digo que es teóricamente posible.

La razón de esto es que el código es privado, no es código libre por tanto no se han construído las herramientas específicamente para eso, sino que en lo posible contribuyen a que un autor aísle y pueda ocultar sus objetos. Además cualquier técnica con dicho fin es un delito en toda regla hoy por hoy. con esto quiero indicarte que te andes con ojo, limítate a controlar tu software o cualquiera que sea libre, no serías el primero que tiene problemas ni el último...

Para los demás podrás usar las API, por ejemplo FindWindows... y familia.
«Ma non troppo»
----> ModoVacaciones = False<----

eldelpuerto

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Detectar Click o doble click en cualquier objeto
« Respuesta #2 en: Domingo 8 de Marzo de 2009, 09:30 »
0
Holaa
ante todo muchismas gracias.
MIra, creo que no me entendiste bien del todo.

Yo lo que quiero es entrar en una aplicacion mia.
Si entro con usuario administrador, poder clicar en cualquier control de mi aplicacion con el boton del medio del raton, y poder habilitar o desabilitar dicho control (enable= false o visible= false), para que luego el usuario normal, solo le pueda aparecer los controles que yo quiera.
Yo al entrar en la aplicacion en una de las opciones del programa, leo todos los controles de mi aplicacion y los meto dentro de una base de datos.

Mi intencion es cuando le de al objeto, pues..le doy con el boton del medio del raton y le digo.. este control invisible, y esa modificacion la meto en la base de datos, y asi al usuario cuabndo entre con su nombre y contraseña no le aparecería dichos controles.

O sea, es como cuando deshabilitas los menus, para que solo pueda entrar el administrador en algunos menus y el usuario no pueda. Pero todo eso a nivel de controles, jugando con el "enable" y el "visible". "Enable" si solo le dejas ver y no pueda tocar, y el "visible" si quiere que no lo vea.


Claro, esto podria poner el evento "double_click" a cada control de cada form, pero eso seria una paliza, y creo que no sería buena practica. Imaginate, por ejemplo que en un solo forms, tengas 70 controles, tendrías que poner un evento "double_click" por cada control. Y eso por cada forms.

No se si me entendiste bien ahora.

Muchas gracias por toda la ayuda.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Detectar Click o doble click en cualquier objeto
« Respuesta #3 en: Domingo 8 de Marzo de 2009, 12:13 »
0
Tenía la duda de que pudieras ir por exactamente esa direcci´n, pero como no concretaste, generalcé.
No obstante hay una cosa que tienes que tener clara. Una vez que compiles tu programa en cierto modo es como si 'ya no fuera tuyo', es decir el programa no sabe que tu eres su autor aunque a ti te guste pensarlo, digamos que para eso es necesario que tú 'se lo digas'.

Esto es, lo más adecuado es que incluyas EN EL PROGRAMA la funcionalidad deseada para cada grupo de usuarios (perfil, configuracion, permisos), en conjunto con una base de datos donde cada uno hace login para acceder al programa. Dicho de otro modo al iniciar el programa te solicita login, si eres el administrador te muestra un formulario extra, o un menú extra del que se accede a un formulario extra, en ese formulario extra, estarían las funcionalidades de administración (consola, panel de administrador), donde tu señalas que cosas están activas y cuales no para cada grupo de usuarios (perfil, configuración,permisos). Esos cambios se deberían guardar a la base de datos, luego cuando se loguee cualquier otro usuario el programa determina a que grupo de usuarios pertenece y en base a ello habilitará o no las funcionalidades que tu le adjudicaste.

Tal como lo quieres hacer tiene varios inconvenientes:
   El programa una vez publicado no contempla que tu eres quien lo creó, tampoco contempla el caso de ser un administrador o otro tipo de usuario si el programa no fué diseñado así, es decir te dejará usarlo o no, pero no activará tal o cual funcionalidad... si te peleas contra el 'ActiveDirectory' si podrías hacerlo (también requiere ser diseñado para usarse conjunto a ello), pero el cacao mental para controlarlo es muy superior frente a lo descrito en el párrafo anterior.
   Aunque 'leas' que un control es de un tipo u otro, la funcionalidad de un programa no está prevista para que se activen o desactiven controles alegremente, sino funcionalidades, una funcionalidad son un puñado de métodos unido a unos controles, eso significa que aunque un control esté deshabilitado podría seguirse usando por una función, o al revés aunque el control esté desactivado una función es accesible ya que las funciones no tienen una interfaz gráfica (sólo es código), lo que requiere que se diseñe una opción gráfica para acceder o no a dicha función.

Con un sencillo ejemplo lo entenderás mejor, supongamos una calculadora, y supongamos 3 usuarios, un niño pequeño que sólo tendrá acceso a las 4 operaciones fundamentales, un usuario normal que tiene acceso a la 'calculadora' estándar y un usuario experto que tiene acceso a la 'calculadora científica'. En este caso, la calculadora puede estár perfectamente definida cada una de sus funcionalidades con los botones que sirven para cada utilidad, pero porque ya se ha previsto durante el diseño de esa manera, no obstante en vez de tener 120 botones y 93 deshabilitados por razones de 'usuario' es mejor reordenar los botones en 3 interfaces distintas (perfiles, configuraciones) una para cada tipo de usuario, cada interfaz gráfica sólo requiere mostrar los botones deseados y reubicarlos de forma 'armoniosa' y útil, los no mostrados son además deshabilitados, sino aunque no se vean todavía serían accesibles con la tecla de tabulación... No queda nada elegante mostrar 120 botones de los cuales nunca tendré acceso a a 80, es mejor que ni siquiera aparezcan se desvanecen las dudas y se evitan ciertas 'intrigas' por ver si se puede 'piratear'...

Ahora observa como aunque entre el usuario niño, si estoy usando la funcionalidad de numeración decimal, las teclas 'A,B,C,D,E' de la numeración hexadecimal están deshabilitadas, todas esas teclas junto a las teclas '0-9' , forman parte de la funcionanildad numérica hexadecimal, por tanto no sería muy útil por ejemplo desactivar una a una cada tecla, o desactivar sólo la 'A', porque aunque no pudiera pulsar la A, siempre podría poner 10 en decimal y luego pulsar al cambio hexadecimal con lo que aparecería la 'A' sin haberla pulsado. Estonces puedes comprender que acceso a una funcionalidad, no implica necesariamente deshabilitar un control. Supongamos que deshabilitas la tecla de cambio de numeración y lo fijas para que no sea posible otra excepto la decimal. ...anular la funcionalidad hexadecimal requerírá también desactivar las teclas ligadas a ello, es decir las teclas antedichas 'A...E', de lo contrario aunque no tenga acceso a uno numérico hexadecimal, se producirían errores si el acceso decimal me dejara usar los botnes 'A,B...E'. Cada funcionelidad está ligada a métodos y controles y un control puede participar en más de una funcionalidad.

En el caso de una calculadora sería más o menos fácil entender que teclas van con una funcionalidad y cuales no, pero además sucede que una misma tecla forma parte de diferente funcuionalidad, si deshabilitamos la tecla lo estamos deshabilitando para que no se use para aquello que queremos evitar pero también para el resto de funciones.... además el caso podría a ser extremadamente complejo según el diseño del programa.

Entonces el modo adecuado de proceder es como te indicaba con CONFIGURACIONES (perfiles, permisos), para establecer configuraciones lo mejor es proveer un formulario aparte (de administración) a la que sólo tiene acceso para ver y modificar el administrador y para ver quizás otro administrador con menos privilegios. en dicho formulario estableces que grupos de usuarios hay y cuales son las funcionalidades a las que tiene acceso. Cuando el usuario se loguea se recoge de la base de datos una estructura (en realidad una tabla) con los permisos que tiene, antes de que aparezca el formulario deseado, durante la carga del mismo se deshabilitan y/u ocultan los botones  de acuerdo a la configuración del perfil de permisos, sin embargo ahora se supone que el diseño de permisos está establecido de de forma coherente, y no caóticamente habilitando y deshabilitando botones sin ton ni son.... Esto sólo en la 'consola del administrador'...
Y definitivamente como te indico el programa ya debe estar diseñado específicamente para atender cada caso.

Piensa que aunque tengas 700 controles no necesitas deshabilitar uno a uno, sino meterlos todos los deseados en colecciones, por ejemplo: controles disponibles para todos los perfiles en una colección, controles para un perfil concreto en otra colección, controles para un permiso concreto en otra colección, entonces habilitar un perfil es tener una función a la que se le pasa una estructura de permisos, en esa función se invoca a otra función que recibe como parámetro ua colección y el permiso (habilitar deshabilitar), la función lo que hace es recorrer toda la colección y poner cada control al estado que indica el parámetro. Esto es rápido y sencillo. El panel del administrador lo que hace es indicar cuales son las colecciones que tienes (cada formulario y cada contenedor tiene una colección controls), crear y eliminar nuevas colecciones con referencia a un nuevo permiso que crees y habilites y asignar los controles a una u otra colección, finalmente debes guardar la colección y los permisos en una base de datos, pero además debes exponer las funciones y métodos que deben ser controladas, de tal modo que si un control está vinculado a una función activar o desactivar el control hace lo propio con la función y viceversa.

Si por ejemplo reúnes diferentes controles en colecciones en base a permisos, crear y utilizar un perfil, indica el estado para ese permiso activado, desactivado, el procedimiento siempre será el mismo loguear al usuario extraer la tabla de permisos del usuario y filtrar los controles cuando se carga un formulario de acuerdo a los permisos (recorriendo las colecciones de controles que están asignada con cada permiso y activando o activando según indica el estado del permiso),

Si has captado la idea trata de resumirlo aquí mismo y exponer claramente los pasos, luego repaso y corrijo tus dudas... punto por punto. Después de esto haría una pequeña aplicación exponiendo un ejemplo que podrías leer a nivel de código para finiquitar tus dudas.
«Ma non troppo»
----> ModoVacaciones = False<----

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Detectar Click o doble click en cualquier objeto
« Respuesta #4 en: Lunes 9 de Marzo de 2009, 13:13 »
0
Todo lo que ha comentado Nebire es correcto...

Cita de: "Nebire"
No queda nada elegante mostrar 120 botones de los cuales nunca tendré acceso a a 80, es mejor que ni siquiera aparezcan se desvanecen las dudas y se evitan ciertas 'intrigas' por ver si se puede 'piratear'...

Definitivamente, la mejor seguridad, si no se ve puede darse por entendido que "no existe"


Aqui una idea con etiquetas a ver si te sirve... Tienes que clickear sobre el marco Rojo tal vez te ayude en algo

Saludos
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================