Como crear una Clase VCX que haga lo siguiente

687 views
Skip to first unread message

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 1, 2015, 12:40:19 PM7/1/15
to publice...@googlegroups.com
Me gustaría aprender a crear una Clase que me permita cambios algunas propiedades en un formulario, por ejemplo
Que cuando ponga la clase, que automáticamente le agregue una imagen en la posición 0,0 y que cambie el color del formulario a azul.
Pero que eso se haga desde una clase.
Es posible hacer eso, y si pudieran orientarme como hacerlo.
Desde ya agradezco sus conocimientos s los TIGRES.

Nueva version de Foxpro debera llamarse TIGGERPRO, ya que son mas Tigres que Zorros.

Irwin Rodriguez

unread,
Jul 1, 2015, 12:46:00 PM7/1/15
to publice...@googlegroups.com
Me sumo a la duda de Jean Pierre y con su permiso agrego otra. He visto clases cuyos códigos estan ocultos o compilados; cuando exploras en el fuente de la clase no hay nada pero la librería funciona muy bien. Como hacen eso?

Saludos!
--
DISTRIBUIDORA IRSESU, C.A
J-29947174-7
Irwin Rodríguez
- Director
Analista Programador - Freelance
+584125210679

Barquisimeto - Venezuela
Desarrollos online dentro y fuera del país

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 1, 2015, 12:50:50 PM7/1/15
to publice...@googlegroups.com, rodrigu...@gmail.com
Si, existe un proceso para ocultar el contenido de una clase para evitar que lo pirateen, pero ese no es el caso realmente ahora, sino tratar de crear una clase primeramente, de ahi paso a paso seguir haciendo algunas mejoras.
Me gustaria aprender hacer esto y de ahi para tratar de dejar algunos aporte que quisiera compartir cn la comunidad.

Irwin Rodriguez

unread,
Jul 1, 2015, 12:55:20 PM7/1/15
to publice...@googlegroups.com
Ya que es para un bien común entonces haré mi tarea de investigar acerca del caso...

Estaré al pendiente ante cualquier avance.

Saludos!

El 1 de julio de 2015, 12:50, Jean Pierre Adonis De La Cruz Garcia <elconsultor...@gmail.com> escribió:
Si, existe un proceso para ocultar el contenido de una clase para evitar que lo pirateen, pero ese no es el caso realmente ahora, sino tratar de crear una clase primeramente, de ahi paso a paso seguir haciendo algunas mejoras.
Me gustaria aprender hacer esto y de ahi para tratar de dejar algunos aporte que quisiera compartir cn la comunidad.



Antonio Meza

unread,
Jul 1, 2015, 1:25:43 PM7/1/15
to publice...@googlegroups.com, elconsultor...@gmail.com
Hola!!

En el 2011 Walter Ojeda publico un buen manual de como usar clases en VFP,

lo pueden descargar de aquí

En mi caso antes había estudiado este para clases no visuales.

saludos
Antonio Meza

Antonio Meza

unread,
Jul 1, 2015, 1:46:46 PM7/1/15
to publice...@googlegroups.com, rodrigu...@gmail.com
Hola Irwin lo que comentas lo explican en el siguiente articulo


saludos
Antonio Meza

Fernando D. Bozzo

unread,
Jul 1, 2015, 3:17:31 PM7/1/15
to publice...@googlegroups.com, rodrigu...@gmail.com
Esto leí en algún lado (creo que de Luis María) que se hace borrando el campo "methods" de la librería, abriendola como tabla:

USE libreria.vcx
BLANK ALL FIELDS methods
USE


Pero cuidado: Si no tenés copia, nunca más recuperás tu librería.

Saludos.-

Fernando D. Bozzo

unread,
Jul 1, 2015, 3:24:17 PM7/1/15
to publice...@googlegroups.com, elconsultor...@gmail.com
Hola Jean Pierre:

Se me ocurre que eso se puede hacer creando la librería (ej: libreria.vcx), poniéndole una clase (ej: form_controller), creandole un método (ej: inicializar) y poniendo en el INIT esto:

BINDEVENT( THISFORM, "Init", THIS, "Inicializar" )


Luego, si pegás esa clase en el form (mediante arrastrar/soltar desde el proyecto), desde el método Inicializar de tu clase podés hacer lo que quieras mediante la referencia THISFORM.

Por ejemplo:

*-- librería: "libreria.vcx", clase: "form_controller"
*-- contenido del metodo INIT
BINDEVENT( THISFORM, "Init", THIS, "Inicializar" )


Contenido del método INICIALIZAR
THISFORM.backcolor = RGB(0,0,255)
* otros THISFORM.....


Te puse todo de memoria, no pude probarlo.


Saludos.-

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 1, 2015, 4:48:15 PM7/1/15
to publice...@googlegroups.com, fdb...@gmail.com, elconsultor...@gmail.com
Excelente Amigo Fernando, me animo a poder iniciar la clase y lo inicie con un Custom, y ya comenzo a salir lo que mensaba, voy a comenzar algunas cosas para poder postriormente publicar lo que estoy desarrollando.

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 1, 2015, 5:56:46 PM7/1/15
to publice...@googlegroups.com, elconsultor...@gmail.com, fdb...@gmail.com
He logrado crear mi Clase que permita hacer cambios a mis formularios principales, cada vez que se agrega mi clase a cualquier formulario, 
Solo me gustaria saber como hacer para a mi clase se le pueda agregar un proceso, que permita agregar  algunos proceso al metodo del formulario.
Es decir, que la clase añada por decir algunos parametros para el resize,, pero que todo esto se haga desde la clase, que no se toque para nada el formulario.

Espero que se haiga entendido.

Fidel Charny

unread,
Jul 1, 2015, 6:33:24 PM7/1/15
to publice...@googlegroups.com, fdb...@gmail.com, elconsultor...@gmail.com
Cuál sería la utilidad del BindEvent() en ese caso?.
Por ejemplo, si frm_controller es una custom, bastaría con poner en su init This.Inicializar(). La podés pegar al form, o agregarla como NewObject() en el init del form.

O también, me parece, funcionaría lo siguiente, para el caso en que no se quiera pegar la clase al form:
*<Metodo INicializar>
LPARAMETERS toForm
toForm.BackColor=rgb(255,255,255)
etc.
*</Metodo INicializar>

*<Init del form>
oo = newobject("frm_Controller","Libreria.vcx")
oo.Inicializar( this )
oo = null
* otros
*</Init del form>

Fernando D. Bozzo

unread,
Jul 1, 2015, 6:37:51 PM7/1/15
to publice...@googlegroups.com, elconsultor...@gmail.com
Pues eso depende de lo que se quiera hacer. Si te querés asegurar de que cuando se ejecute el código de esta clase, estén todos los objetos del form cargados, lo mejor es bindear el Init del form y eso permite poder incluso hacer algo sobre el resto de los controles, como aplicar algún efecto, aunque no lo recomiendo porque se puede poner un poco pesado.

Lo que comentás es otra forma de hacerlo, que en vez de arrastrar y soltar la clase sobre el form, lo hace por código.

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 1, 2015, 6:49:57 PM7/1/15
to publice...@googlegroups.com, fdb...@gmail.com, elconsultor...@gmail.com
Fernando, Te voy a enviar por privado a tu email que es lo que estoy tratando de hacer, para ver si me das una ayuda para poder seguir avanzando con el resto que tengo

Víctor Hugo Espínola Domínguez

unread,
Jul 1, 2015, 9:56:45 PM7/1/15
to publice...@googlegroups.com
Hola Jean Pierre Adonis De La Cruz

En el evento INIT de una clase CUSTOM:

With ThisForm
    .AddObject("miLogo", "Image")

    .miLogo.Top       = 0
    .miLogo.Left      = 0
    .miLogo.Height    = 100
    .miLogo.Width     = 200
    .miLogo.Stretch   = 1
    .miLogo.BackStyle = 1
    .miLogo.Picture   = "\Tmp\Logo.jpg"
    .miLogo.Visible   = .T.

    .BackColor        = Rgb(0, 0, 255)
Endwith

Esto funciona OK, pero sería más elegante si Picture y BackColor se asignaran mediante propiedades de la clase.

With ThisForm
    .AddObject("miLogo", "Image")

    .miLogo.Top       = 0
    .miLogo.Left      = 0
    .miLogo.Height    = 100
    .miLogo.Width     = 200
    .miLogo.Stretch   = 1
    .miLogo.BackStyle = 1
    .miLogo.Picture   = This.cPictureLogo
    .miLogo.Visible   = .T.

    .BackColor        = Evaluate("Rgb(" + This.cBackColorForm + ")")
Endwith

Lo que no logro entender es: qué utilidad tendría esta clase?

Porqué no definir esas características en la clase base del formulario?

Saludos,
Víctor.
Lambaré - Paraguay.

elkin dario uribe torres

unread,
Jul 2, 2015, 8:32:08 AM7/2/15
to publice...@googlegroups.com
Victor pregunta de un ignorante, ¿no sera que se desea adicionar por codigo la clase a los numerosos formularios ya creados y de ahí que cojan las caracteristicas de la clase?

Saludos

Fidel Charny

unread,
Jul 2, 2015, 10:38:50 AM7/2/15
to publice...@googlegroups.com, eduri...@gmail.com
Para que los formularios ya creados utilicen una clase form, hay que utilizar Foxbin2prg (Fernando D. Bozzo) y un poquito de ingenio.

(Suponiendo que necesitamos cambiar la clase de base de un form llamado selcuenta.scx/sct/sc2, que tenemos una carpeta "libs" con una "thmoves.vcx" que tiene una clase form llamada "frmmove")

Primero habrá que hacer una evaluación de impacto. O sea, la clase form debe estar optimizada.

Luego generar el texto (sc2) con Foxbin2prg.
Editamos el texto sc2 y
* donde dice
DEFINE CLASS selcuenta AS form
* se reemplaza por:
DEFINE CLASS selcuenta AS frmmove OF "..\libs\thmoves.vcx"

Luego hay que regenerar los binarios. Como foxbin2prg generar sus propios bak, no hay mucho de qué preocuparse. Eso sí, si algo nos salió mal, mejor rescatar de inmediato los .bak y recomenzar el proceso.

Luego, si son muchos forms, podemos escribir una pequeña rutina que haga estos cambios de modo automatizado.

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 2, 2015, 11:06:45 AM7/2/15
to publice...@googlegroups.com, vich...@gmail.com
Victor Hugo, gracias por tu respuesta, con el caso de propiedades no tengo ningun problema, el caso esta en los metodos.
es decir, que mi Clase CUSTOM, pueda agregar a cualquier formulario un metodo en este caso al metodo RESIZE, para que cada vez que cambien el tamaño de la ventana se cambien con el resize del formulario principal, haciendo uso de la clase, espero que me puedan haber entendido.

Víctor Hugo Espínola Domínguez

unread,
Jul 2, 2015, 12:17:59 PM7/2/15
to publice...@googlegroups.com
Sigo creyendo que la solución es modificar la clase base porque todo código que pongas en la clase custom lo puedes usar directamente en la clase base, y si los formuilarios no están subclasados entonces usar foxbin2prg para reasignar la clase del form.

Además le veo un aspecto "filosófico", una ruptura de jerarquía, el que un objeto modifique el aspecto y/o comportamiento de su contenedor. Como que un empleado decida por sí mismo la decoración de la oficina de su jefe (por supuesto que a algunas secretarias eso y mucho más se le permite ;-)

Si estoy equivocado o no estoy viendo claramente el alcance de lo que pretrendes, pido disculpas.

Saludos,
Víctor.
Lambaré - Paraguay.
 

Fernando D. Bozzo

unread,
Jul 3, 2015, 10:13:50 AM7/3/15
to publice...@googlegroups.com, vich...@gmail.com
Hola Víctor:

Esto que te parece como una intromisión de una clase en otra, es un patrón de diseño muy conocido y útil en informática, llamado patrón decorador, que básicamente consiste en encapsular una funcionalidad especifica en una clase y que luego esa clase se pueda usar para complementar o modificar el comportamiento de otras.

Esto es muy útil cuando se quiere desacoplar una funcionalidad para poder actualizarla por separado, sin tocar las demás clases.

Saludos

Fernando D. Bozzo

unread,
Jul 3, 2015, 10:19:39 AM7/3/15
to publice...@googlegroups.com, fdb...@gmail.com
Ah, Víctor, y olvidé comentar sobre tu ejemplo comparativo de la oficina.

La comparación, realmente, es con un jefe que no le interesa meterse en todo el tema de decoración y que prefiere contratar mano de obra especializada. Vamos, como en la vida real! :-)

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2015, 11:21:48 AM7/3/15
to publice...@googlegroups.com, fdb...@gmail.com
jejeje, buena la reflexiones, pero bueno, ya en las busquedas he encontrado algunas cosas, voy a seguir investigando mas.
Con respecto Fernando a lo que mencionastes del Binevent, tendras algunos ejemplos mas profundo para poder usar ese procedimiento, lo estuve usando pero el problema qye veo lo hace a formularios creados en la misma clase, mi idea era que le haga efecto a un formulario creado, no se si sera posible, si se pudiera o alguien que me de algun alcance.

Fernando D. Bozzo

unread,
Jul 3, 2015, 11:39:58 AM7/3/15
to publice...@googlegroups.com

Hola Jean Piere :

El ejemplo de clase que te comenté no tiene porqué estar en la misma librería, puede estar en otra.

Me parece que que querés hacer otra cosa, pero que no lo estás aclarando bien, o por ahí no te quedó claro el ejemplo.

No voy a tener un PC cerca hasta que vuelva de vacaciones, así que solo puedo responder con el móvil y ejemplos muy simples.

¿Pero probaste el ejemplo que te puse? Porque la base es esa, y la complejidad está en lo que hagas con esa clase.

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2015, 11:42:33 AM7/3/15
to publice...@googlegroups.com, fdb...@gmail.com
si use lo que me enviastes, pero la verdad que no se como hacer para que una clase pueda afectar a mi Formulario, es a un formulario ya creado, no que cree un formulario con la clase, a mi parecer 2 cosas distintas.

Espero toda clase de ayuda.

Fernando D. Bozzo

unread,
Jul 3, 2015, 11:46:29 AM7/3/15
to publice...@googlegroups.com

Jean Piere, si lo de mi ejemplo lo hiciste directamente en tu formulario, entonces no entendiste el ejemplo.

¿Como se llama tu formulario (el scx)?

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2015, 11:51:58 AM7/3/15
to publice...@googlegroups.com, fdb...@gmail.com
el nombre de mi SCX es "SKIN", y el Caption es "Form1"


Fernando D. Bozzo

unread,
Jul 3, 2015, 11:58:22 AM7/3/15
to publice...@googlegroups.com

Ok, y lo que te dije de poner en un método Init y en el Inicializar, ¿donde lo pusiste? ¿En el Form?

Víctor Hugo Espínola Domínguez

unread,
Jul 3, 2015, 12:00:01 PM7/3/15
to publice...@googlegroups.com
Hola Fernando

Conozco el patrón y varios ejemplos magníficos pueden encontrarse en el proyecto ssClases http://vfpx.codeplex.com/wikipage?title=ssClasses&referringTitle=Home.

Por eso aclaraba que no estabamos viendo el objetivo de su proyecto, porque el problema que describía inicialmente era muy trivial.

Saludos,
Víctor.
Lambaré - Paraguay.

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2015, 12:05:00 PM7/3/15
to publice...@googlegroups.com, fdb...@gmail.com
la verdad lo puse dentro de la misma clase, es lo que no entendi, o realmente donde debo ponerlo.


Fernando D. Bozzo

unread,
Jul 3, 2015, 12:05:33 PM7/3/15
to publice...@googlegroups.com

Hola Víctor :

Se me ocurrió ese ejemplo porque Jean Porte dice explícitamente que quiere controlar ciertas propiedades y funcionalidades desde una clase externa "que se ponga en el form".

Copio textual :

" Que cuando ponga la clase, que automáticamente le agregue una imagen en la posición 0,0 y que cambie el color del formulario a azul. Pero que eso se haga desde una clase."

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2015, 12:16:05 PM7/3/15
to publice...@googlegroups.com, fdb...@gmail.com
Fernando, esa parte ya lo resolvi, lo pude hacer con la clase, hacer cambios de las propiedades, el problema esta en los metodos. por decir que de mi clase, le haga cambios a un metodo del formulario principal, por decir en el caso del resize, que cada vez que cambien el tamaño del formulario, la clase le haya heredado o algo asi el procedimeinto del cambio del resize.

Víctor Hugo Espínola Domínguez

unread,
Jul 3, 2015, 12:18:52 PM7/3/15
to publice...@googlegroups.com
Bueno, yo interpreté que deseaba solamente poner un logo y cambiar el color de fondo. Pero su proyecto es mucho más ambicioso ;-)

 

Fernando D. Bozzo

unread,
Jul 3, 2015, 12:21:20 PM7/3/15
to publice...@googlegroups.com

Pero Jean Piere, esa parte es justamente mas fácil todavía. Simplemente en el mismo inicializar de la clase, le agregás un BindEvent del resize del form a un nuevo método resize (o como quieras llamarlo) de tu clase, y ahí ponés el código que querés que se ejecute cuando ese evento ocurra!

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2015, 12:23:26 PM7/3/15
to publice...@googlegroups.com, vich...@gmail.com
Bueno victor, la verdad es que no sea ambicioso, si no que siempre se me hizo la pregunta de poder un estilo distitno, soo con una o mas clases, pero sin tratar de afectar mucho metiendo la mano al formulario. y he visto muchas personas que han pedido eso, y tratar de hacer uno para uso libre de todo aquel que quiera usarlo posteriormente.

He usando ejemplos de otros creadores, pero la verdad un poco no me convence lo que yo y otros desearian, espero que se pueda lograr o alcanzar la idea de este proyecto y se pueda ayudar a otras personas que lo necesiten.
 

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2015, 12:24:59 PM7/3/15
to publice...@googlegroups.com, fdb...@gmail.com
lo hice fernando, pero me vota unos errores, cada vez distinos, no se como hacerlo de verdad.

Antonio Meza

unread,
Jul 3, 2015, 12:28:36 PM7/3/15
to publice...@googlegroups.com, elconsultor...@gmail.com, vich...@gmail.com
Si lo piensas poner libre, porque no mandas el proyecto para que te podamos ayudar haciendo pruebas y ver donde tienes el error y gente que maneja mas clases pueda darte mas ideas?

saludos
Antonio Meza

Fernando D. Bozzo

unread,
Jul 3, 2015, 12:29:00 PM7/3/15
to publice...@googlegroups.com

¿Y podés comentar que errores te da, y en qué momento o al hacer qué ?

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2015, 12:30:44 PM7/3/15
to publice...@googlegroups.com, elconsultor...@gmail.com, fdb...@gmail.com
Por decir dentro de mi clase, en el Init le hice asi
********
BINDEVENT( THISFORM, "resize", THIS, "cambiar" )

Procedure Cambiar
  ThisForm.img03.width = (thisform.width-221)-ThisForm.img03.left + 2  && Superior Centro
  ThisForm.img04.left = thisform.width-221  && Superior Derecha


***** Me vota error  el sgte mensage
Los metodos y eventos no pueden contener procedimientos o definiciones de clases anidadas
****

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 3, 2015, 12:34:31 PM7/3/15
to publice...@googlegroups.com, solv...@gmail.com, vich...@gmail.com
Antonio, lo puse aca en otro comentario, pero antes de ese habia realizado este comentario de aqui, lla cual estaba siguiendolo con fernando, pero me imagino que en cualquiera de los 2 se puede hacer el seguimiento.

Fidel Charny

unread,
Jul 3, 2015, 5:20:40 PM7/3/15
to publice...@googlegroups.com, elconsultor...@gmail.com, fdb...@gmail.com
"Cambiar" debe ser un método de tu clase.
De paso, te comento que me resulta mejor usar una nomeclatura para el método delegado que haga referencia al Evento apuntado.
Por ejemplo
BINDEVENT( THISFORM, "resize", THIS, "dlg_Resize" )
Por la referencia (this) debe existir un método en la clase llamado "dlg_resize" que tenga el código que se ejecuta al activarse el evento apuntado.
En algunos casos (este no parece) es necesario tener en cuenta el nFlags de BindEvent().

Si trabajas con VFP9 mira detenidamente la propiedad Anchor antes de continuar. Tal vez no necesites este BindEvent y si trabajar con las propiedades Anchor del objeto.

Fidel Charny

unread,
Jul 3, 2015, 5:21:44 PM7/3/15
to publice...@googlegroups.com, fjch...@gmail.com, fdb...@gmail.com, elconsultor...@gmail.com
Fe de erratas. "Propiedades anchos de los objetos"

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 4, 2015, 11:43:59 AM7/4/15
to publice...@googlegroups.com, fjch...@gmail.com, fdb...@gmail.com, elconsultor...@gmail.com
Amigo fidel, todas las ideas son buenas, pero realmente ninguna de las que dan funciona como se dice, voy a seguir investigando como solucionar ese problema, aunque hable con Pablo Molina  el ya no sigue el proyecto de Skin que habia empezado y lo ha dejado del todo, me va aapoyar en algunos conocmientos, espero despues poderlos aportar a los demas.

elkin dario uribe torres

unread,
Jul 4, 2015, 9:32:43 PM7/4/15
to publice...@googlegroups.com
Jean si hablas con el, porque no le preguntas si puede liberar el VfpSkin


Hugo C.

unread,
Jul 4, 2015, 10:14:46 PM7/4/15
to publice...@googlegroups.com, eduri...@gmail.com
Buen punto elkin, recuerdo haber revisado el código y la mega se hace con el Api de Windows 32 .

Saludos.

Fernando D. Bozzo

unread,
Jul 5, 2015, 5:31:53 AM7/5/15
to publice...@googlegroups.com

Elkin, VFPSkin era un desarrollo Open Source. El único problema es que estaba en una página que ya no se si existe.

elkin dario uribe torres

unread,
Jul 5, 2015, 11:42:07 AM7/5/15
to publice...@googlegroups.com

Fernando no lo creo porque en una oportunidad me advirtieron de pasar la 3.01 por licenciamiento, pero si se puede en los actuales momentos se podría enviar esta version con quien se puede averiguar

Jean Pierre Adonis De La Cruz Garcia

unread,
Jul 6, 2015, 11:14:23 AM7/6/15
to publice...@googlegroups.com, eduri...@gmail.com
Recien me conecto despues de varios dias de pensar sin conexion en la red.
La verdad que pensando con el Internet para desarrollar un trabajo, me hacia muy flojo, ya que buscaba herramientas para solucionar de la red, a diferencia que cuando no tengo intenret se me ve la necesidad de resolverlo con lo que tenga a la mano nomas.
Pero bueno, ya logre solucionar mi problema que tenia con respecto a Heredear los metodos s un formulario, a la manera que yo pensaba, ahora le estoy dando algunos pormenores mas, para que se pueda ver el trabajo.
Con respecto a Pablo Molina, me menciono que ya no desea ver nada con el VFPSkin, que dejo morir por completo ese proyecto y que no le importa poco o nada, muy, pero muy raro, la verda no se que le haya pasado con respecto a eso, pero respeto su decision.
Asi que me puse a pensar un poc de nuevo y decia, si alguien llo pudo hacer por que no uno no lo podra hacer.

Gracias a DIOS que estos 2 dias sin Internet pude descifrar el problema, pronto subire lo avanzado.
Reply all
Reply to author
Forward
0 new messages