PDA

Ver la Versión Completa : Listar forms de la aplicación


Luis M.
20-08-2014, 14:25:01
Hola.
Como podría listar o saber en tiempo de ejecución los forms que tiene el programa?
La idea sería listarlos y guardarlos en una tabla.
Es para un control de permisos en el cual el administrador del programa le daría
los permisos necesarios a cada form.
Utilizo D2007 y firebird 2.5.
Un saludo y gracias.

luisgutierrezb
20-08-2014, 15:57:24
Si mal no recuerdo en el objeto screen vienen los forms, pero los que usan el createform, si se crean forms al vuelo, no creo que aparezcan a menos que estén creados en ese momento, algo que se me ocurre seria ver los recursos del ejecutable, como ahí se guardan los DFM, entonces podrías obtener todos...

dec
20-08-2014, 18:04:21
Hola,

Creo, con el compañero, que la variable "Screen" contiene los formularios "creados". Igual si los formularios se crean con el objeto "Application" como "Owner", digo, igual aparecen también en la variable "Screen". Sin embargo, me suena raro usar los formularios para asignar permisos a los diferentes usuarios. Quiero decir que igual hay otras formas más sencillas, más establecidas y estándar. A ver si algún otro compañero puede darte alguna pista. ;)

Luis M.
20-08-2014, 23:07:22
Gracias por responder.
Efectivamente, solo salen los formularios que están en auto-create.
Los demás formularios no salen.
Lo de los permisos, es porque este cliente es muy especial.
Tengo los componentes Tms-Security y para este caso no me valen.
En fin... los introduciré uno a uno en la tabla.
Un saludo.

ecfisa
21-08-2014, 18:51:02
Hola Luis.

Las primer idea que se me cruzó es ir registrando en una lista los forms en la creación, lo cuál se puede hacer usando TObjectList y unificando la creación en un proceso por ejemplo.

Luego mirando por alguna otra opción encontré esto, mucho mas elaborado, que tal vez te pueda servir: Create and Manage dynamic Forms at Runtime using Class References (http://users.atw.hu/delphicikk/listaz.php?id=128&oldal=10).

Con Delphi 2010 o +, pareciera que ya existe una opcion con RTTI, como comentan en el mensaje 6 de este hilo: Dynamically list all forms in a project (http://stackoverflow.com/questions/3280552/dynamically-list-all-forms-in-a-project) (imposible para mi Delphi 7 :()

Saludos :)

Al González
22-08-2014, 04:12:53
Hola Luis.

ecfisa te ha dado muy buen información.

Yo sólo añadiría esta referencia a un caso similar: http://www.clubdelphi.com/foros/showthread.php?t=20261

Ocurrió hace nueve años. Ahora lo matizaría, pero creo que en esencia es una solución factible con tu versión de Delphi. :)

Un saludo.

Luis M.
22-08-2014, 18:45:46
Gracias por responder.
Muy buenos e interesantes los post de ecfisa y del Al Gonzalez. ^\||/

Se me ha ocurrido una posible solución y me gustaría saber vuestra opinión a ver que os parece.
Hay un fichero que tiene todas las clases de formas de la aplicación o programa. Este fichero es el "programax.dpr"
Los nombres de la clase de forma está escrito entre llaves {}.
Al arrancar del programa, este podría leer el fichero e ir incorporando los nombres de las clases de formas que no existan a la tabla.
Lógicamente renombraría el fichero con otro nombre y extensión.
Es un programa a medida para un tienda, que posiblemente en un futuro pueda ser una cadena o una franquicia.
El cliente quiere ponerle la descripción que él considere oportuna a cada clase de forma (no cambiar el nombre) y
aplicar un nivel de permiso que él considere oportuno.
Como el programa con el tiempo irá creciendo en opciones, de ahí mi dilema de como ir introduciendo las nuevas clases de
forma al apartado de permisos.
Adjunto fichero de imagen.

Muchas gracias por vuestro tiempo y aporte.
Un saludo.

Al González
22-08-2014, 19:04:02
No es descabellado distribuir el archivo .dpr junto con el programa ejecutable. ^\||/

El problema que le veo es que de esa manera tu programa no puede saber cuál es la jerarquía de clases de tus formularios. En cambio, si usas herencia visual (es de suponer que la uses), al registrar tus clases puedes obtener más información sobre cuáles de ellas son formularios de captura, cuáles son formularios de búsqueda, etc.
If XClaseDeForm.InheritsFrom (TPlantillaFormCatalogo) Then
Saludos. :)

Luis M.
22-08-2014, 19:15:08
Hola Al.
Lo que dices es muy correcto, pero en este caso (por el momento hasta que no lo pida el cliente) no es necesario.
Incluso el fichero .dpr tendré que modificarlo manualmente y quitarles algunas cosas como el login, el data module, etc.
Un saludo.