Formularios de un proyectos desde el EXE

164 views
Skip to first unread message

Francisco

unread,
Jun 23, 2015, 1:37:59 PM6/23/15
to publice...@googlegroups.com
Buenas, existe alguna manera de saber los formularios (propiedad name de los mismos) que componen un proyecto desde el propio ejecutable. Me refiero a poder cargar en una matriz dichos datos?

Gracias.

francisco prieto

unread,
Jun 23, 2015, 2:02:21 PM6/23/15
to publicesvfoxpro
Tocayo,

Revisa _VFP.Forms[n].Name

Saludos,
Pancho 
Cordoba
Argentina

Fidel Charny

unread,
Jun 23, 2015, 7:30:14 PM6/23/15
to publice...@googlegroups.com, dire...@informatica-apliges.com
Sería mejor que expongas tu necesidad. La propiedad Name de un form puede que  te sirva o no, dependiendo del objetivo.

Víctor Hugo Espínola Domínguez

unread,
Jun 23, 2015, 8:21:35 PM6/23/15
to publice...@googlegroups.com
Hola Francisco

No sé si sea posible desde el ejecutable, pero podrías generar una tabla o un archivo de texto antes de generar el .exe:

Para obtener los formularios del proyecto:
SELECT Key FROM NomProyecto.pjx WHERE Type = "K"

Por cada formulario:
SELECT Properties FROM NomFormulario.scx WHERE Class == "form"
lcName = STREXTRACT(Properties, [Name = "], ["])

Saludos,
Víctor.
Lambaré - Paraguay.

Fernando D. Bozzo

unread,
Jun 24, 2015, 2:21:51 AM6/24/15
to publice...@googlegroups.com, dire...@informatica-apliges.com
Desde dentro del EXE no se puede saber qué archivos lo componen.

Francisco

unread,
Jun 24, 2015, 6:32:06 AM6/24/15
to publice...@googlegroups.com, vich...@gmail.com
El caso es que quiero montar un sistema de permisos en una tabla de tal manera que por ejemplo si en la tabla permisos tengo:
Codigo permiso, modulo. Donde el código de permiso es  por ejemplo 1=Acceder al form, 2=Eliminar del form, 3=Añadir al form, 4=Modificar del form....etc... y en modulo el nombre del formulario... cuando un usuario intentan acceder a alguna acción dentro de un form verifico que ese permiso no esté en la tabla permisos, en caso de estar es que lo tiene prohibido. Para ello y para poder llenar la tabla permisos o poder seleccionar los módulos debo de rellenar con la propidad name de los forms que ya he puesto que sea indentificativa del form... por ejemplo en el FRMClientes el name es Mantenimiento_Clientes y asi todos... pero claro debo de llenar ahora un combo en tiempo de ejecución con los forms de mi aplicación, lo podría hacer a mano o una sola vez el problema es que añado al proyecto formularios continuamente y me hubiera gustado dejar esto automatizado para que se incluyera... 


El miércoles, 24 de junio de 2015, 2:21:35 (UTC+2), Víctor Hugo escribió:
Hola Francisco

No sé si sea posible desde el ejecutable, pero podrías generar una tabla o un archivo de texto antes de generar el .exe:

Para obtener los formularios del proyecto:
SELECT Key FROM NomProyecto.pjx WHERE Type = "K"

Por cada formulario:
SELECT Properties FROM NomFormulario.scx WHERE Class == "form"
lcName = STREXTRACT(Properties, [Name = "], ["])

Saludos,
Víctor.
Lambaré - Paraguay.

Fernando D. Bozzo

unread,
Jun 24, 2015, 9:14:02 AM6/24/15
to publice...@googlegroups.com

Hola Francisco :

El control a ese nivel se suele hacer en dos partes.
Una parte implica poner todos los nombres de forms en una tabla, y vincular esa tabla a la de usuarios y permisos.
La otra parte implica no llamar a los forma directamente con do form, sino usando un método al que se le pasa el nombre del formato a cargar, y es éste método el que verifica los permisos y permite, o no, ejecutar el form.

Francisco

unread,
Jun 24, 2015, 10:02:38 AM6/24/15
to publice...@googlegroups.com, fdb...@gmail.com
Exacto lo que quería era ahorrarme eso de forms en una tabla dado que como he dicho van incrementandose y es un rollo tener que ir actualizando la tabla. Creía que habría alguna variable del sistema tipo matriz que contenía dicha información pero veo que no. Así que haré lo que indica Victor.


El miércoles, 24 de junio de 2015, 15:14:02 (UTC+2), Fernando D. Bozzo escribió:

Hola Francisco :

El control a ese nivel se suele hacer en dos partes.
Una parte implica poner todos los nombres de forms en una tabla, y vincular esa tabla a la de usuarios y permisos.
La otra parte implica no llamar a los forma directamente con do form, sino usando un método al que se le pasa el nombre del formato a cargar, y es éste método el que verifica los permisos y permite, o no, ejecutar el form.

Fidel Charny

unread,
Jun 24, 2015, 11:53:00 AM6/24/15
to publice...@googlegroups.com, dire...@informatica-apliges.com, fdb...@gmail.com
Esta es una forma de lograrlo a través de Foxbin2prg. Lo podés poner en un prg o una custom para ejecutar desde la ventana de comados.
Tenés que tener Foxbin2prg.exe en alguna carpeta. Trabaja por directorio de forms.

#DEFINE _DEFCLAS_     "DEFINE CLASS "
#DEFINE _ASFORM_    " AS form"
#DEFINE _NAME_        "Name = "+CHR(34)
#DEFINE _IGUAL_        CHR(61)
#DEFINE _COMIL_        CHR(34)

TRY
    LOCAL foxbin_dir
,;
        loEx
as Exception, ;
        loCnv
as Object, ;
        lcScx
, ;
        i
, ;
        j
, ;
        lnLines
, ;
        lWrite
,;
        lcFolder
, ;
        lnFiles
, ;
        lnNames
, ;
        lnMaxScx
,;
        lnMaxName
,;
        lnCount
    LOCAL ARRAY laLines
(1),laNames(1,2)
    lnNames
= 0
    lnMaxScx
= 0
    lnMaxName
= 0
    lnCount
= 0    
       
    foxbin_dir
= JUSTPATH(LOCFILE("foxbin2prg.exe","exe","Foxbin2prg"))
    IF FILE
(ADDBS(foxbin_dir)+"foxbin2prg.exe")
        loCnv
= NEWOBJECT("c_foxbin2prg",ADDBS(foxbin_dir)+"FOXBIN2PRG.EXE")
    ENDIF


    lcFolder
= GETDIR(FULLPATH(""),"Forms","Carpeta de Forms",48)
    IF NOT EMPTY
(lcFolder)
        lnFiles
= ADIR(laFiles,ADDBS(lcFolder)+"*.scx","",1)
        FOR i
= 1 TO m.lnFiles
            lcScx
= ADDBS(m.lcFolder)+laFiles[m.i,1]
            lcFoxbin
= FORCEEXT(lcScx,"sc2")
            loCnv
.execute(lcScx)
            IF FILE
(lcFoxbin)
                lnCount
= lnCount + 1
                lnLines
= ALINES(lalines,FILETOSTR(m.lcFoxbin),1+4,CHR(13))
                FOR j
=1 TO lnlines
                    IF AT
( _DEFCLAS_ ,lalines[m.j]) > 0 ;
                        AND AT
( _ASFORM_ ,laLines[m.j]) > 0
                        lWrite
= .t.
                        LOOP
                    ENDIF
                    IF lWrite
                        IF AT
(_NAME_ , lalines[m.j] ) > 0
                            lnNames
= m.lnNames + 1
                            DIMENSION laNames
(m.lnNames,2)
                            laNames
[m.lnNames,1]=m.lcScx
                            laNames
[m.lnNames,2]=CHRTRAN(GETWORDNUM(laLines[m.j],2,_IGUAL_ ),CHR(32)+_COMIL_,"")
                            lWrite
= .f.
                            EXIT
                        ENDIF
                    ENDIF
                NEXT
            ENDIF

               
        NEXT

        IF m
.lnNames > 0
            FOR i
=1 TO m.lnNames
                lnMaxScx
= MAX(LEN(laNames[m.i,1]),lnMaxScx)
                lnMaxName
= MAX(LEN(laNames[m.i,2]),lnMaxName)
            NEXT

           
            CREATE TABLE
MisForms FREE ("file_name" c(m.lnMaxScx) , "Prop_Name" c(m.lnMaxName))
            INSERT INTO misforms FROM ARRAY laNames
            SELECT misforms
            GO TOP
            BROWSE
        ENDIF
       
    ENDIF

CATCH TO loex
    loex
.UserValue=PROGRAM()
   
ShowError(loex)
FINALLY
    loCnv
= null
ENDTRY

Fernando D. Bozzo

unread,
Jun 24, 2015, 12:01:46 PM6/24/15
to publice...@googlegroups.com

Fran, creo que todavía no caes en que realmente no te ahorraría nada, ya que los permisos para cada formulario necesitarías definirlos igualmente.

Imaginate que tuvieras ese array con la lista de forms, ¿qué harías luego con él?

El 24/06/2015 16:02, "Francisco" <dire...@informatica-apliges.com> escribió:
Exacto lo que quería era ahorrarme eso de forms en una tabla dado que como he dicho van incrementandose y es un rollo tener que ir actualizando la tabla. Creía que habría alguna variable del sistema tipo matriz que contenía dicha información pero veo que no. Así que haré lo que indica Victor.

El miércoles, 24 de junio de 2015, 15:14:02 (UTC+2), Fernando D. Bozzo escribió:

Hola Francisco :

El control a ese nivel se suele hacer en dos partes.
Una parte implica poner todos los nombres de forms en una tabla, y vincular esa tabla a la de usuarios y permisos.
La otra parte implica no llamar a los forma directamente con do form, sino usando un método al que se le pasa el nombre del formato a cargar, y es éste método el que verifica los permisos y permite, o no, ejecutar el form.

Francisco

unread,
Jun 24, 2015, 1:36:18 PM6/24/15
to publice...@googlegroups.com, fdb...@gmail.com
Fernando la aplicación funciona de la manera que el usuario puede hacer todo y en permisos precisamente hay que incluir solo lo que tenga prohibido. Osea no necesito poner los permisos para cada formulario sino solo lo que en cada formulario tenga prohibido.. por ejemplo añadir en el formulario clientes... eso indica que ese usuario no puede añadir nada en dicho formulario de mantenimiento y así con el resto de ellos... 


El miércoles, 24 de junio de 2015, 18:01:46 (UTC+2), Fernando D. Bozzo escribió:

Fran, creo que todavía no caes en que realmente no te ahorraría nada, ya que los permisos para cada formulario necesitarías definirlos igualmente.

Imaginate que tuvieras ese array con la lista de forms, ¿qué harías luego con él?

El 24/06/2015 16:02, "Francisco" <direccion@informatica-apliges.com> escribió:
Exacto lo que quería era ahorrarme eso de forms en una tabla dado que como he dicho van incrementandose y es un rollo tener que ir actualizando la tabla. Creía que habría alguna variable del sistema tipo matriz que contenía dicha información pero veo que no. Así que haré lo que indica Victor.

El miércoles, 24 de junio de 2015, 15:14:02 (UTC+2), Fernando D. Bozzo escribió:

Hola Francisco :

El control a ese nivel se suele hacer en dos partes.
Una parte implica poner todos los nombres de forms en una tabla, y vincular esa tabla a la de usuarios y permisos.
La otra parte implica no llamar a los forma directamente con do form, sino usando un método al que se le pasa el nombre del formato a cargar, y es éste método el que verifica los permisos y permite, o no, ejecutar el form.

Fernando D. Bozzo

unread,
Jun 24, 2015, 1:41:17 PM6/24/15
to publice...@googlegroups.com
Y a eso me refiero:

Suponiendo que tengas 3 forms:
- Form1: acceso normal
- Form2: sin acceso
- Form3: acceso normal

Para controlar que el usuario USU1 no tenga acceso al formulario Form2, es necesario que lo pongas en algún sitio, como una tabla, donde figure que el usuario USU1 no tiene acceso a Form2, y todos los demás forms que haya, al no estar en la tabla de permisos (mas bien de restricciones) por defecto dejará ejecutarlos.

Al final es como el control normal, pero a la inversa, por lo que no puede en vez de por lo que puede.

Como ves, seguís necesitando anotar las restricciones en algún sitio, como también el método que abra los formularios para que consulte las restricciones.




El 24 de junio de 2015, 19:36, Francisco <dire...@informatica-apliges.com> escribió:
Fernando la aplicación funciona de la manera que el usuario puede hacer todo y en permisos precisamente hay que incluir solo lo que tenga prohibido. Osea no necesito poner los permisos para cada formulario sino solo lo que en cada formulario tenga prohibido.. por ejemplo añadir en el formulario clientes... eso indica que ese usuario no puede añadir nada en dicho formulario de mantenimiento y así con el resto de ellos... 


El miércoles, 24 de junio de 2015, 18:01:46 (UTC+2), Fernando D. Bozzo escribió:

Fran, creo que todavía no caes en que realmente no te ahorraría nada, ya que los permisos para cada formulario necesitarías definirlos igualmente.

Imaginate que tuvieras ese array con la lista de forms, ¿qué harías luego con él?

Fernando D. Bozzo

unread,
Jun 24, 2015, 1:49:21 PM6/24/15
to publice...@googlegroups.com, fjch...@gmail.com, dire...@informatica-apliges.com, fdb...@gmail.com
Muy bueno Fidel :)

Fidel Charny

unread,
Jun 24, 2015, 6:49:57 PM6/24/15
to publice...@googlegroups.com, fdb...@gmail.com
Fer:
Lo que había pensado (pero porque a mí me parece, nada más) es que el sistema ya tiene niveles asignados:
Operador Junior = 1
Operador Senior = 2
Operador Jefe = 3
Auditor = 4
Supervisor = 5
Hacker = 6

Una vez obtenida la tabla (a la que le falta este campo, ciertamente y también normalizar los name de los form), toca el trabajo de asignarle un nivel a cada form. La mayoría irá en 1 y luego se irá subiendo de nivel conforme a la tarea. De esa forma esta tabla se puede trabajar como incluida en el proyecto y no podrá ser modificada por los "expertos".
Luego, en la tabla de usuarios, tiene que estar asignado el nivel de cada uno. Si los formularios están basados en una clase form, será fácil. Si no, mejor usar foxbin2prg para solucionar este tema. Alternativamente se puede usar una función para que cargue los formularios, que no es imposible, pero puede ser algo rebuscado. Hay que atender temas como NAME y WITH que se puede hacer con un parámetro parseable: "<form>frmClientes</form><name></name><with>param1,param2,param3</with>"
lcForm = lower(strextract(tcParam,"<form>","</form>"))
SELECT Nivel from Misforms where prop_name==m.lcForm into array laLevel
if laLevel[1,1] < _screen.UserLevel
           Messagebox("Usted es un Pirincho!!")
ELSE
       IF ATC(<NAME>,tcParam) >0
              * acá hay que renegar para incluir la cláusula Name      
       ENDIF
       IF ATC(<WITH>,tcParam) > 0
              * acá hay que renegar para incluir los parámetros
              * Tiene que armar una estrategia para saber de qué tipo son los parámetros
              * Puede adquirir mis "tags calificadas" en el mercado de pulgas. El problema es si hay que pasar un array.
       ENDIF
ENDIF

Yo tengo algo parecido, pero creo una propiedad array en screen y utilizo el Skip for del menú para limitar el acceso. Eso porque no me parece adecuado que un usuario acceda a un formulario y le aparezca un cartel informándole que no tiene jerarquía Messagebox("Piantá de acá Pirincho!!!). Cuando ve el menú deshabilitado ya sabe que no puede y es suficiente. Pienso que, si el menú tiene un diseño razonable, basta con limitar el acceso al árbol de menú que corresponda.
Incluso las restricciones pueden afectar tareas de ciertos formularios que se necesitan para todos los usuarios. En esos casos trato de meter lo restringible en uno o más containers y estos containers no estarán visibles para el usuario que no tiene el nivel suficiente.

Bueno, me trastornó la RG Afip 3685 y se me dió por guitarrear un rato.

Fernando D. Bozzo

unread,
Jun 25, 2015, 2:57:22 AM6/25/15
to publice...@googlegroups.com, fjch...@gmail.com, fdb...@gmail.com
Yo prefiero siempre lo más simple, y en este caso, creo que una tabla con los nombres y las restricciones es suficiente.

Francisco

unread,
Jul 2, 2015, 7:29:22 AM7/2/15
to publice...@googlegroups.com, fjch...@gmail.com, dire...@informatica-apliges.com, fdb...@gmail.com
Este código tiene un pequeño problema con el Name = a veces devuelve la propiedad FontName = en vez de el Name del form... estoy viendo como arreglarlo sin utilizar el foxbin2prg... 


El miércoles, 24 de junio de 2015, 17:53:00 (UTC+2), Fidel Charny escribió:

Fidel Charny

unread,
Jul 2, 2015, 10:11:28 AM7/2/15
to publice...@googlegroups.com, dire...@informatica-apliges.com, dire...@informatica-apliges.com, fjch...@gmail.com
Debería solucionarse cambiando lo suguiente:

                    IF lWrite
                       
**** IF AT(_NAME_ , lalines[m.j] ) > 0
                        IF RIGHT
(CHRTRAN(laLines[m.j],chr(9),""),len(_NAME_))==_NAME_
                            lnNames
= m.lnNames + 1

                            DIMENSION laNames
(m.lnNames,2)
                            laNames
[m.lnNames,1]=m.lcScx
                            laNames
[m.lnNames,2]=CHRTRAN(GETWORDNUM(laLines[m.j],2,_IGUAL_ ),CHR(32)+_COMIL_,"")
                            lWrite
= .f.
                            EXIT
                        ENDIF
                    ENDIF

Antonio Meza

unread,
Jul 2, 2015, 12:45:24 PM7/2/15
to publice...@googlegroups.com, dire...@informatica-apliges.com, fjch...@gmail.com, dire...@informatica-apliges.com
Hola Francisco!!

Te va a tomar mas tiempo y con muchos detalles nuevos por resolver y a demás al final no vas a tener ninguna ventaja, que usar una simple tabla donde registres los nombres y asignarlos a los usuarios para los permisos.

saludos
Antonio Meza

Francisco

unread,
Jul 3, 2015, 7:14:42 AM7/3/15
to publice...@googlegroups.com, solv...@gmail.com, dire...@informatica-apliges.com, fjch...@gmail.com
Bueno Antonio de momento he creado este prg que me mete en una tabla libre los nombres y captions de los forms ... no esta depurado en absoluto y seguramente haga cosas de forma no muy practica pero como repito lo hice para salir del paso y de forma rápida... aquí lo dejo por si a alguno le interesa...


declare Integer GetFileAttributes in win32api string @

LOCAL lcFolder,nFILES,nT,cForm,cNOMBREFORM,LINEA,cCONT,cCONT1


IF !EXISTE_FILE('FORMULARIOS.DBF')
*** CREAR TABLA LIBRE FORMULARIOS
cAUX="FORMULARIOS"
CREATE TABLE (cAUX) FREE;
   (NOMBRE C(80),;
    TITULO C(120))
SELECT FORMULARIOS
ELSE
IF !USED("FORMULARIOS")
use FORMULARIOS in 0 EXCLUSIVE
ELSE
SELECT FORMULARIOS
ENDIF
GO TOP 
IF !EOF()
SET SAFETY OFF
ZAP
PACK IN FORMULARIOS
SET SAFETY ON
ENDIF
ENDIF

lcFolder = GETDIR(FULLPATH(""),"Forms","Carpeta de Forms",48)
IF NOT EMPTY(lcFolder)
nFILES= ADIR(mFILES,ADDBS(lcFolder)+"*.SCX","",1)
FOR nCONT=1 TO nFILES
cForm=ADDBS(lcFolder)+ALLTRIM(mFILES(nCONT,1))
IF existe_file(cForm) && en caso existir el FORM
USE (cForm) IN 0 EXCLUSIVE ALIAS TEMPORAL
SELECT TEMPORAL
GO TOP
SCAN ALL
IF UPPER(ALLTRIM(TEMPORAL.BASECLASS))=="FORM"
linea=ATLINE("Caption",temporal.properties)
IF LINEA<>0
cCONT1=MLINE(TEMPORAL.PROPERTIES,LINEA)
ELSE
cCONT1=""
ENDIF
nLINEAS=ALINES(cARRAY,temporal.properties)
FOR nT = 1 TO nLINEAS
IF LEFT(cARRAY(nT),4)="Name"
cCONT=cARRAY(nT)
EXIT
ELSE
cCONT=""
ENDIF
ENDFOR
cNOMBREFORM=ALLTRIM(SACAR_NOMBRE(cCont))
cCAPTION=ALLTRIM(SACAR_NOMBRE(cCONT1))
WAIT "FORMULARIO : "+cForm+CHR(13)+"Contenido: "+cNOMBREFORM WINDOWS NOWAIT

SELECT FORMULARIOS
LOCATE FOR ALLTRIM(NOMBRE)== cNOMBREFORM
IF NOT FOUND()
INSERT INTO FORMULARIOS (NOMBRE,TITULO) VALUES (cNOMBREFORM,IIF(EMPTY(cCAPTION),cNOMBREFORM,cCAPTION))
ENDIF

ENDIF
SELECT TEMPORAL
ENDSCAN
USE IN TEMPORAL
ENDIF
ENDFOR
=MESSAGEBOX("PROCESO TERMINADO")
ENDIF
USE IN FORMULARIOS

RETURN

***********************************************************************************
* ALTERNATIVA A FILE()
***********************************************************************************
Function existe_File
   LParameters tcFileName
       return (GetFileAttributes(@m.tcFileName)  <> -1)
ENDFUNC

* --------------------------------------------------------------
* --------------------------------------------------------------
FUNCTION SACAR_NOMBRE(cVARIABLENOMBRE AS Character)
LOCAL cSUBCADENA
cSUBCADENA=""
IF '"' $ cVARIABLENOMBRE
cSUBCADENA=ALLTRIM(SUBSTR(cVARIABLENOMBRE,AT('"',cVARIABLENOMBRE)+1))
cSUBCADENA=LEFT(cSUBCADENA,LEN(cSUBCADENA)-1)
ELSE
SUBCADENA=cVARIABLENOMBRE
ENDIF
RETURN (UPPER(cSUBCADENA))
ENDFUNC
Reply all
Reply to author
Forward
0 new messages