 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Dom 05 Ago, 2007 9:32 am Asunto: Lista de Formularios de la Aplicación |
|
|
Tengo una duda que no he podido resolver.
he estado buscando en la ayuda de Builder bcb60 y bds2006, pero solo viene la clase TAplication, la cual no contiene información de los Forms que componen a la la misma.
Explicación:
Tengo una aplicacion, en las opciones del proyecto (Project - Options - Forms), tengo declarados dos forms que son los que me interesan, (Form - Principal y Form-Modulo de Datos), los demas formularios, los he puesto en la parte de creación dinamica (derecha).
la pregunta es, a travez de un form que sirve para habilitar y deshabilitar las opciones del Form principal (Application->MainForm) puedo saber que opciones tiene el menu principal y de ahi en base a un nivel de seguridad, al usuario se le habilitan o deshabilitan según sea el caso, esto no es problema, pues funciona correctamente bien.
la duda que tengo es si existe alguna función especial, que me permita saber cuantos formularios tiene mi aplicación y en base a ella, poder tener la lista de 2 componentes espesificos (TMenu y los derivados de TButton)
Esto me permitira, poder definir un sistema de activación y desactivación de componentes, por ejemplo en un formulario de productos tengo los clasicos botones de: Agregar, Editar, Borrar, Grabar y Cancelar) asi como los botones de navegacion (primero, anterior, siguiente, ultimo y buscar)
Sabiendo los componentes, puedo determinar su estado de Activación.
como indico, estos componentes no los conozco, hasta que el form no hay sido creado.
el problema que tengo es que NO encuentro una funcion que me determine los componentes que existen en ese Formulario hasta que no haya sido habierto, y la idea es NO abrir los formularios si no que buscarlos dentro de la aplicación y poder usar la información sin que al usuario le tenga que aparecer los formularios de la parte dinámica
al parecer en Delphi existe una funcion denominada FormList, pero creo que es una función de usuario.
Lo unico que necesito es la lista de Formularios que contiene mi aplicacion, pues al tener el nombre puedo usar la funcion FindWindow para recuperar el handle y con estas misma saber que componentes tengo.
Al Saber el nombre y el tipo de componente, puedo almacenar en una tabla esta configuración, (puede ser en un archivo ini, pero como queda al descubierto, es demasiado facil, modificar las propieades)
asi, cada vez que "algún"usario se identifique, y a travez de su nivel, con una sencilla funcion dentro del constructor que lea la configuración almacenada, puedo activar o desactivar los componentes.
Saludos!! espero que alguien tenga información al respecto... _________________
 |
|
| Volver arriba |
|
 |
ercea Ens

Registrado: 07 May 2007Mensajes: 48
|
Publicado: Lun 06 Ago, 2007 3:57 pm Asunto: |
|
|
Hola César, no sé si habrás resuelto ya tu duda, pero ojeando por otros foros, puede que te sirva la propiedad Screen->Forms[i] que te dice los formularios que tienes... pero solo en memoria. Es decir, yo por ejemplo, tengo puesto en las opciones de proycto que solo me cargue en memoria el formurario principal y conforme pulsa un botón u otro voy creando y destruyendo el resto de forms, así no tengo el programa ocupando mucho espacio en memoria, por lo que me mostraría solo aquellos formularios que tenga en memoria.
Si no haces esto y al cargar el programa, cargas todos los formularios, pues creo que te puede resultar util.
De momento es lo que he encontrado xD
saludos! |
|
| Volver arriba |
|
 |
dobermannmx Master


Registrado: 30 Ago 2006Mensajes: 191Ubicación: Zapopan, Jal. - México
|
Publicado: Lun 06 Ago, 2007 11:18 pm Asunto: Saludos Paisano |
|
|
César, entiendo perfecto lo que buscas más no entiendo para que te complicas tanto la vida?, te cuento como hago yo lo mismo que tu sin tanto embrollo.
1º Defino en mi base de datos los módulos que contendrá mi aplicación y una tabla de permisos, donde iria el ID del usuario + ID del modulo + opercacion1 + operacion2 etc etc que es un booleano. De tal manera que para TODAS mis aplicaciones de base de datos solo puedo aplicar 4 operaciones AGREGAR, ELIMINAR, EDITAR e IMPRIMIR, de tal manera que la tabla de permisos es una matriz.
2º Para que puedan accesar cualquier parte del menu deben estar FIRMADOS, una vez firmados lleno una estructura con esa matriz y se la paso en el constructor a cada FORMA que va a requerir esa información.
3º En el evento del FORM SHOW activo o desactivo los controles relacionados con esas operaciones de acuerdo a los permisos para cada usuario.
De esta manera no se me complica saber de antemano cuantas FORMAS tendrá mi programa ni nada por el estilo, al contrario, solo SOBRE DEMANDA lo voy haciendo.
Espero haberte ayudado un poco aunque no respondiera exactamente a tu pregunta.
Salu2 _________________ ISC
Dobermannmx |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 08 Ago, 2007 6:25 am Asunto: |
|
|
Para dar una idea mejor, la siguiente imagen representa el sistema de
privilegios de los usuarios definidos, lo que basicamente hago, es dejar al
administrador del sistema, crear (n) numero de niveles, esto me evita a
mi el estar recompilando a cada rato por que se les ocurrio que el nivel
de usuaro "X" le falta o le sobran derechos para operar el programa
lo que tu me comentas, esta implementado en la parte de privilegios
(Agregar, Editar, Borrar y el acceso al sistema con o sin pasword)
de echo asi como esta funciona perfectamente, el unico detalle que me
salió fue cuando el usuario "X", con nivel de privilegios "Z", tiene un
menu dentro del formulario. ejemplo supon el Formulario "Venta
Mostrador", que contiene los siguientes elementos
(barra de Menú)
Venta:
* Cambiar usuario
* Salir
Herramientas
* Corte de Caja
- Corte por cajero
- Corte por Fechas
- Semanal
- Mes
- Año
Ayuda
* Nota de Venta
* Acerca de...
y me interesa restringir la parte de "Corte por Fechas", o cualquiera que
a mi se me antoje. Este Formulario es Creado dinámicamente, no se
conoce el contenido del menú, ya que la funcion, usada en el formulario
de privilegios, usa un algoritmo inteligente (de cosecha propia... jeje),
para determinar que opciones contiene el menu y actualizarce
automaticamente por si hago alguna actualizacion de Software o de
Modulo.
es por ello que requiero saber que componentes existen en una Ventana
sin que ésta haya sido creada (visible) al usuario, por que si debo crearla
SIN que el usuario se entere, no es problema pues que se cree, al fin que
el usuario ni cuenta se va a dar.
pero si me interesa saber que Formularios tiene mi aplicación para que
de manera inteligente mi Algoritmo realice el proceso de Activacion o
desactivacion de Elementos del menú o botones, el proceso es realizar un
software Inteligente que sea capaz de Interactuar con las diferentes
actualizaciones. (si viene en DLL, BPL o inmerso en el mismo EXE, no
importa, solo quiero saber cuantos FORMS tiene mi aplicacion)
Saludos... Espero que ahora si quede explicado, lo que intento realizar _________________

Ultima edición por Cesar C. Salazar Gonzalez el Sab 18 Ago, 2007 10:58 pm, editado 2 veces |
|
| Volver arriba |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Mie 08 Ago, 2007 7:06 am Asunto: |
|
|
hola César. fijate si es esto lo que buscas
por ejemplo un formulario con controles TComboBox para el puerto serie.. declaro un array
const AnsiString ControlesPort[6]={
"edPuertoCom" , "edBaudios" ,
"edBitDatos" , "edParidad" ,
"edBitStop" , "edControlFlow" };
luego en la funcion de form->Show();
{
TRegistry* Reg;
Reg = new TRegistry;
Reg->OpenKey("Software\\Bascula",true);
for (int Contador=0; Contador < 6 ; Contador++)
(dynamic_cast<TComboBox>(FindComponent(ControlesPort[Contador])))->ItemIndex = Reg->ReadInteger(ControlesPort[Contador]);
Reg->CloseKey();
delete Reg;
}
lo del registro no hace falta pero es para que se entienda.
asi puedo restaurar la config. eso si, tienes que saber q tipos de controles estas buscando debes conoser los controles existentes o los que te quieres leer, luego tabien puedes usar el mismo metodo para encontrar formularios solo tienes que cambiar el puentero de dinamic_cast<"Tcontrol de interes" *>
espero te sea util creo que es eso lo que buscas.
saludos |
|
| Volver arriba |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Mie 08 Ago, 2007 7:20 am Asunto: |
|
|
donde dice
dynamic_cast<TComboBox>
debe decir
dynamic_cast<TComboBox> //falta el asterisco puntero |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 09 Ago, 2007 5:51 am Asunto: |
|
|
Tentado a no contestar para no hacer mas grande el post.
1.- la forma de saber los componentes contenidos dentro de un form
NO es el problema.
2.- La Forma de Activar o desactivar los Componentes dentro del Form
Tampoco es el problema
3.- El proceso que me indicas, esta implementado dentro del Modulo de
Derechos de usuario, para que de manera "inteligente" sea el quien
muestre dentro de un Tree view las opciones de un menu asi como las
opciones basicas que pueden bloquearse
Ninguna de las 3 opciones antes mencionadas es mi problema, vamos ni
si quiera se acercan al o que estoy consultando por que la idea no es
saber que controles existen, ESO lo realiza el modulo de privilegios (img
derecha con el Tree view)
| Tor escribió: | | por ejemplo un formulario con controles TComboBox para el puerto serie.. declaro un array |
la frase "...un formulario..." ahi es donde tengo el problema, a que
formulario te refieres?, si tienes 30 formularios establecidos en la
parte "No auto create" de la opcion Menu Proyect - Options - Forms ya
que el programa los crea dinamicamente, no son estaticos, ni mucho
menos cuando mi aplicacion se ejecuta estos se crean.
para usar uno de los 30 formularios, se utiliza la siguiente declaracion
| Código: | TFormVenta *pFormVenta = new TFormVenta(this); //creacion
pFormVenta->Show(); // son ventanas MDI no son forms normales |
pero claro aqui ya lo he creado y ya se el nombre, asi como el contenido
de los componentes.
vamos lo pongo mas facil, realiza un programa para deshabilitar o
habilitar opciones de Word, y habres word con 30 documentos y si cada
vez que habres word, habres los mismo 30 archivos pero en diferente
orden, como sabes en que ventana has habierto el documento de Ventas
para que deshabilites la parte del menu Edicion e Impresion?
si siempre que los habras, NUNCA tendran el mismo HANDLE, quieres
decir que si habres los 30 documentos SIEMPRE van a estar
deshabilitadas esas opciones?
se supone que solo deben funcionar SOLO cuando se habra la ventana de
Ventas.
lo unico que conoces es el nombre del documento, (nombre del form),
pero no sabes cuando existe hasta que no lo crees espero ahora
haberme explicado correctamente, pero entiendo que debe existir una
funcion que determine el numero de Forms que contiene una apliacion,
aun cuando estos forms sean Estaticos o Dinamicos, o cada que habres un proyecto de c++ Builder, tienes que agregar los forms que usa tu
aplicacion?
Muchas Gracias, por el interes pero al parecer no son las soluciones, que
se requieren. ahora bien _Leo, entre las curiosidades del API existe la
funcion que regresa el numero de forms (estaticos o dinamicos) que
contiene una aplicacion en tiempo de Ejecución? _________________
 |
|
| Volver arriba |
|
 |
dobermannmx Master


Registrado: 30 Ago 2006Mensajes: 191Ubicación: Zapopan, Jal. - México
|
Publicado: Vie 10 Ago, 2007 12:55 am Asunto: |
|
|
César, ya probaste recorriendo el arreglo "Components" que tiene el objeto Application?, no lo he probado pero creo que igual y por ahi puedes encontrar los FORMS hijos que pueda tener abiertos ya que al final los forms también son COMPONENTES HIJOS de la aplicación no?
Me avisas si tuviste suerte con esto
Salu2 _________________ ISC
Dobermannmx |
|
| Volver arriba |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
Publicado: Vie 10 Ago, 2007 9:58 pm Asunto: |
|
|
fijate esta rutina te da cuantos componentes tiene tu aplicacion en el if se comprueba si es un formualrio no importa si es estatico o dinamico. se ejecuta ShowMessage
for (int i = this->ComponentCount - 1; i >= 0; i--) {
if (dynamic_cast<TForm>(this->Components[i]) != NULL)
ShowMessage("Fromulario");
}
tiene que ejecutarse en el formulario main por eso el this, luego ves que metodo o propiedad es de tu interes en cada formulario recuperado.
saludos |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|