Cambiar propiedades de objetos de un Form desde un prg

511 views
Skip to first unread message

Carlos Hidalgo

unread,
Oct 8, 2016, 5:51:07 PM10/8/16
to Comunidad de Visual Foxpro en Español
Hola a todos

Quisiera su orientación con respecto a cambiar las propiedades de un objeto que esta en un form.
Mediante un procedimiento. (prg)
Lo que quiero hacer es esto
WITH this.Parent
.ranterior.Enabled=.f.
.rprimeo.Enabled=.f.
.rsiguiente.Enabled=.f.
.rultimo.Enabled=.f.
.nuevo.Enabled=.f.
.eliminar.enabled=.f.
ENDWITH
 
pero no en el form. sino llamando a un procedure que esta dentro de un prg para que lo haga

No se si me explique bien... soy nuevo en esto.
Saludos

Germán Fabricio Valdez

unread,
Oct 8, 2016, 6:31:57 PM10/8/16
to Comunidad de Visual Foxpro en Español
y el formulario esta al frente y es el que esta activo

_screen.activeform

Carlos Hidalgo

unread,
Oct 8, 2016, 6:40:06 PM10/8/16
to publice...@googlegroups.com
Ya probé y funciona... 
gracias

Como podria hacerle si tengo varios formularios y quiero llamar a un evento clic, por ejemplo, de un objeto de formulario no activo o cambiarle una propiedad si no esta al frente

Germán Fabricio Valdez

unread,
Oct 8, 2016, 6:56:09 PM10/8/16
to Comunidad de Visual Foxpro en Español, car...@grupocotesco.com
for i = 1 to _screen.formcount()
   if _screen.forms(i).caption=mititulo
        _screen.forms(i).metodo()
   endif
endfor

Luiz Alexandre Ruiz

unread,
Oct 8, 2016, 8:26:44 PM10/8/16
to Comunidad de Visual Foxpro en Español
Um exemplo bem simples.

Form
Init
SET PROCEDURE Muda ADDITIVE

cmdTeste.Click
MudaProd(THISFORM)


muda.prg

PROCEDURE MudaProd(loForm as Form)
WITH oForm
.ranterior.Enabled=.f.
.rprimeo.Enabled=.f.
.rsiguiente.Enabled=.f.
.rultimo.Enabled=.f.
.nuevo.Enabled=.f.
.eliminar.enabled=.f.
ENDWITH
 ENDPROC

Carlos Hidalgo

unread,
Oct 8, 2016, 10:53:40 PM10/8/16
to publice...@googlegroups.com
Gracias German y Luis Alexander

Era lo que necesitaba.
Funciono a la perfección

Una duda como libero de la memoria las variables publicas y locales que cargo en mis form.

Saludos

Fidel Charny

unread,
Oct 9, 2016, 10:15:25 AM10/9/16
to Comunidad de Visual Foxpro en Español, car...@grupocotesco.com
Puedes liberar cualquier variable con RELEASE (lista de variables, separdas por coma).
Las variables declaradas con LOCAL se liberan al terminar el procedimiento que las declara.
No uses variables públicas en los formularios. Crea propiedades de usuario en el formulario.

Fidel Charny

unread,
Oct 9, 2016, 10:49:03 AM10/9/16
to Comunidad de Visual Foxpro en Español
Esto de tener un procedure en un prg para modificar el estado de una botonera del formulario me parece una idea mala.
Mínimamente deberías comprobar en el prg si los botones existen antes de asignarle un valor a un propiedad.

PROCEDURE MudaProd
LPARAMETERS loForm
,tlEnabled
IF VARTYPE
(loForm) = "O"
    IF PEMSTATUS
(loForm,"ranterior",5)
        loForm
.ranterior.Enabled = m.tlEnabled
    ENDIF
    IF PEMSTATUS
(loForm,"primero",5)
        loForm
.primero.Enabled = m.tlEnabled
    ENDIF    
    IF PEMSTATUS
(loForm,"rsiguiente",5)
        loForm
.rsiguiente.Enabled = m.tlEnabled
    ENDIF    
    IF PEMSTATUS
(loForm,"rultimo",5)
        loForm
.rultimo.Enabled = m.tlEnabled
    ENDIF        
    IF PEMSTATUS
(loForm,"nuevo",5)
        loForm
.nuevo.Enabled = m.tlEnabled
    ENDIF    
    IF PEMSTATUS
(loForm,"eliminar",5)
        loForm
.eliminar.Enabled = m.tlEnabled
    ENDIF        
ENDWITH
ENDPROC

Me parece que esa botonera debería estar en una clase container, y que la clase contenedora debe contener todos los métodos y propiedades de ususario necesarios para su funcionalidad.
Y entonces, en lugar de llamar a un procedure de prg, llamas a un método de la clase contenedora.
La clase contenedora puede ser Container con commands individuales o Commandgroup donde en el evento click debes resolver lo que se hace, o una combinación de ambas.

Por ejemplo, el código del evento click de un commandgroup que tiene los botones de movimiento del puntero y un botón más para refresco y enfoque del control grid: (Versión de código Foxbin2prg)
    PROCEDURE Click
        TRY
            LOCAL lcmetodo
,loex as Exception
            IF VARTYPE
(this.objgrid)="O"
                SELECT
(This.objGrid.RecordSource )
               
do case
                   
case this.value=1
                       
* Primer Registro
                        go top
                   
case this.value=2
                       
* Ultimo Registro
                        go bott
                   
case this.value=3
                       
* Registro Anterior
                        IF
!BOF()
                            SKIP
-1
                        ENDIF
                   
case this.value=4
                       
* REgistro Siguiente
                        IF
!EOF()
                            SKIP
                            IF EOF
()
                                GO bott
                            ENDIF
                           
                        ENDIF
       
                   
case this.value=5
                       
* Forzar Refresh
                       
This.objGrid.REfresh
                ENDCASE
               
* Permite que se ejecute cierto método del formulario
               
* para el raro caso en que sea necesario
                IF
!EMPTY(this.metodo) AND PEMSTATUS(thisform,this.metodo,5)
                    RAISEEVENT
(thisform,this.Metodo)
                ENDIF
       
               
This.objGrid.SetFocus
            ENDIF
        CATCH TO loex
            loex
.UserValue = PROGRAM()
           
ShowError(Loex)
        FINALLY
       
        ENDTRY
    ENDPROC

    PROCEDURE
Destroy
       
this.objgrid = null
    ENDPROC

Como se puede ver, la clase tiene una propiedad ("ObjGrid") que contiene la referencia de objeto al control grid al que se refiere.
También hay una propiedad llamada "Metodo" que puede contener el nombre de un método del formulario que necesita ejecutarse.


Carlos Hidalgo

unread,
Oct 9, 2016, 11:48:31 AM10/9/16
to publice...@googlegroups.com
Gracias

Voy a implementarlo. Cabal, mis botones estan en un Container


Saludos

Reply all
Reply to author
Forward
0 new messages