17 de octubre de 2014

Cómo añadir un generador a sus clases


Articulo original: How to add a Builder to your Class
http://weblogs.foxite.com/bernardbout/2014/09/18/how-to-add-a-builder-to-your-class
Autor: Bernard Bout
Traductor: Luis María Guayán

Es posible que haya visto que varias de mis clases vienen con un generador (builder) incorporado que hace mas fácil configurar las propiedades correctas y brinda una visión correcta de cómo se verá el objeto con las propiedades ya establecidas.

Recientemente uno de los chicos de Foxite ha creado una clase Spinner ideal para tocar con dedos grandes y yo le envié un Generador para ello. Me pidió un tutorial sobre cómo crear un generador así, y como también había estado pensando que esto sería útil, me decidí a documentar el proceso aquí. Nosotros vamos a usar la clase Spinner creada por Tony Vignone para esto (todo está incluido en la descarga) o Ud. puede utilizar cualquier otra clase que desee.

Una clase visual personalizada puede tener una serie de propiedades que necesitan configurarse, y es útil que el usuario final tenga todo esto en un solo lugar, en vez de una larga lista. Así que lo primero que hay que hacer es agregar las propiedades que el usuario puede cambiar, en la solapa Favoritos. De esta manera las propiedades que cambian, son independientes de las propiedades internas y que no cambian.

Para esto la clase necesita tener MemberData. Así que este es el primer paso en la creación de la clase.

1. Abra la clase y agregue una propiedad personalizada _memberdata [guión bajo - memberdata]




1.2. En la hoja de propiedades, seleccione cada propiedad para ser agregada a la solapa Favoritos, haga clic derecho sobre ella y en el menú emergente seleccione "Agregar a favoritos"

2. Añada otra propiedad personalizada a su clase y nómbrela _BigSpinnerBuilder. Darle un valor inicial de 0 [cero]. Haga clic derecho sobre ella, y añadirla a la solapa de Favoritos.

3. Haga clic derecho sobre esta nueva propiedad _BigSpinnerBuilder y seleccione "Editor MemberData" en la ventana emergente, y se abre el Editor MemberData. Configurarlo como en la siguiente imagen, haga clic en el icono de lupa y en la ventana de código que se abre, pegar el siguiente código:

nControls = ASelObj(aObjects)
If nControls # 0
   oObject = aObjects(1)
   Set Classlib To (oObject.ClassLibrary)
    IF VARTYPE(_screen.oWiz) = "U"
       _screen.addproperty("oWiz","")
    ENDIF
   _screen.oWiz = Createobject("BigSpinnerBuilder", oObject)
   _screen.oWiz.Show()
EndIf


Vea la imagen de abajo:



Haga clic en Aceptar (Ok) para cerrar el editor y guardar los cambios.

Ahora puede cerrar la clase personalizada.

Es hora de crear nuestro generador

Para la mayoría de los generadores necesitamos un sencillo formulario donde podamos configurar las propiedades según sea necesario. Así que basta con crear un nuevo formulario de VFP: Archivo -> Nuevo -> Formulario. Este será nuestro generador. Así que con el formulario seleccionado, en el menú archivo:

Archivo -> Guardar como clase y guarde el formulario como una clase en la misma biblioteca de clases visuales donde se almacena nuestra clase anterior. Darle el mismo nombre que en el código ingresado arriba: BigSpinnerBuilder.



Ahora podemos cerrar el formulario sin guardar y abrir la clase Formulario: BigSpinnerBuilder desde el Explorador de Clases.

Agregue una instancia de la clase, en este caso: bigspinner, al formulario, arrastrando y soltando desde el explorador de clases. Decidir sobre qué propiedades desea agregar al generador y añadir los controles apropiados. Aquí he añadido solo 3 propiedades, pero para esta clase hay una serie de otras propiedades que podrían añadirse al generador. Eso se lo dejo a ustedes.

He elegido para permitir cambiar al usuario, los colores de la ruleta y el título del Spinner.



Cuando la clase "bigspinner" se coloca en un nuevo formulario y la propiedad _bigspinnerbuilder se selecciona y se hace clic en el botón, de crea una instancia de este formulario. Así que como siempre, lo primero que hacemos es añadir la propiedad _memberdata. También requiere lo  siguiente:

Crear 3 métodos nuevos:

LoadClassProps()
SaveChanges()
UpdatePreview()

2 Propiedades

_memberdata

   oSource - para mantener una instancia de la clase en su formulario.

Init() - almacena una instancia de la clase en el formulario y llama al LoadClassProp()

Parameters oSource
If Vartype(oSource) = "O"
      This.oSource = oSource
      This.LoadClassProps()
Endif

LoadClassProps() - esto establece simplemente el generador de objetos igual que la clase que se está editando

With This As Form
      .shpLightColour.BackColor = .oSource.shape2.FillColor
      .shpDarkColour.BackColor = .oSource.shape1.FillColor
      .txtButtonCaption.Value = .oSource.lblTitle.Caption
ENDWITH
 * update the preview
ThisForm.updatepreview()

UpdatePreview() - Este código simplemente actualiza la clase en el generador con la configuración actual.

* update the preview
WITH This.Bigspinner1
      .shape2.FillColor = ThisForm.shpLightColour.BackColor
      .Arrows.shape4.FillColor = ThisForm.shpLightColour.BackColor
      .lblTitle.Caption = ALLTRIM(ThisForm.txtButtonCaption.Value)
      .lblTitle.Forecolor = ThisForm.shpDarkColour.BackColor
      .shape1.FillColor = ThisForm.shpDarkColour.BackColor
      .Arrows.Shape3.FillColor = ThisForm.shpDarkColour.BackColor
ENDWITH

SaveChanges() - esto simplemente actualiza el control que se está editando mediante la instancia almacenada

With This as Form
      * light
      .oSource.shape2.FillColor = .shpLightColour.BackColor
      .oSource.Arrows.shape4.FillColor = .shpLightColour.BackColor
      * dark
      .oSource.shape1.FillColor = .shpDarkColour.BackColor
      .oSource.lblTitle.Caption = ALLTRIM(.txtButtonCaption.Value)
      .oSource.lblTitle.Forecolor = .shpDarkColour.BackColor
      .oSource.Arrows.shape3.FillColor = .shpDarkColour.BackColor
Endwith
 

* update the preview
ThisForm.updatepreview()

Los objetos también tienen su propio código:

shpLightColour.Click() / shpDargColour.Click()

LOCAL nCol 
nCol = GETCOLOR (This.BackColor) 
SI nCol> -1 
       This.BackColor = nCol 
ENDIF 

cmdApply.Click() - aplicar los cambios

With ThisForm
     .SaveChanges()
EndWith 

cmdCancel.Click()

ThisForm.Release 

Y eso es todo lo que hay para la creación de su generador.

Agregando otra propiedad al generador

Ahora suponga que desea agregar a la propiedad de la clase - arrowspersist al generador. Esta es una propiedad lógica de que si establece en .T. siempre mostrara la Flecha y .F. si la flecha está oculta hasta que el control es tocado. Así que podemos utilizar una casilla de verificación.

En el formulario generador agregar una casilla de verificación como se muestra y establezca su valor inicial = .F.



Los cambios de código necesarios serán:

LoadClassProps()

* Establecer el valor del control generador para nuestro valor de control 
.chkPersist.Value = .oSource.arrowspersist

SaveChanges()

* Actualizar el control que se está editando con el valor que fijamos en el formulario generador 
.arrowspersist = ThisForm.chkPersist.Value 

UpdatePreview()

* Actualizar la previsualización en pantalla. Este es un ejemplo "LIVE" ya que la forma está funcionando 
.arrowspersist = ThisForm.chkPersist.Value

Eso es todo lo que se necesita.

Espero que esto le ayuda a crear generadores para sus clases.

Descargas

BigTouchCtrlsFull.zip - La última versión completa de las clases de Tony.

BigTouchCtrlsTutorial.zip - Los archivos que se usan en el tutorial anterior.

Descargar ambas y utilice el Tutorial Zip para seguir este envío, pero use el archivo BigTouchCtrlsFull que ya ha sido actualizado.

Los archivos originales y enlace al hilo de  Foxite es:  http://www.foxite.com/archives/another-big-control-revision-3-0000411778.htm

No hay comentarios. :

Publicar un comentario