25 de junio de 2021

Arrastrar, soltar y restringir

Artículo original: Drag, Drop and Restrict
http://sandstorm36.blogspot.com/2020/06/drag-drop-and-restrict.html
Autor: Jun Tangunan
Traducido por: Luis María Guayán


Acabo de leer un problema dentro de Foxite.com en el que cuando un usuario mueve accidentalmente el mouse más allá de los límites del formulario, la función de arrastrar y soltar falla porque los objetos desaparecen en las áreas más allá del formulario.

La solución a eso es restringir los movimientos de arrastrar y soltar dentro de su formulario, o la dimensión dentro de los objetos en su formulario. Aquí hay dos ejemplos que muestran cómo lograrlo:

Ejemplo 1:

* Restricting drag and drop within the form

Local oForm As Form
oForm = Createobject('TestForm')
oForm.Show(1)
Return

Define Class TestForm As Form
      AutoCenter = .T.
      Width = 900
      Height = 440
      Caption = 'Drag, Drop & Restrict Inside Form'
      Add Object container1 As Mycontainer With Top = 30, Left = 50
Enddefine

Define Class Mycontainer As Container
      Height = 100
      Width = 100
      Procedure MouseMove
      Lparameters nButton, nShift, nXCoord, nYCoord
      If m.nButton = 1 And Between(m.nYCoord,0,Thisform.Height-This.Height) And ;
                  BETWEEN(m.nXCoord,0,Thisform.Width-This.Width)
            This.Move(m.nXCoord, m.nYCoord)
      Endif
      Endproc
Enddefine

Ejemplo 2:

* Restricing within objects on form, in this case above or below the lines
Local oForm As Form
oForm = Createobject('TestForm')
oForm.Show(1)
Return

Define Class TestForm As Form
      AutoCenter = .T.
      Width = 900
      Height = 440
      Caption = 'Drag, Drop & Restrict'
      Add Object Shape1 As shape With Top = 30, Left = 0, Width = 900, height = 1
      Add Object Shape2 As shape With Top = 200, Left = 0, Width = 900, height = 1
      Add Object Command1 As MyButton With Caption='Move Me outside of the lines', Top = 35, Left = 5, width = 200, height = 30
Enddefine

Define Class MyButton As CommandButton
      Procedure MouseMove
            Lparameters nButton, nShift, nXCoord, nYCoord
            If m.nButton = 1 AND BETWEEN(m.nYCoord,30,171)
                  This.Move(m.nXCoord, m.nYCoord)
                  WAIT WINDOW m.nYCoord nowait
            Endif
      Endproc
Enddefine

Por si lo necesitas. Saludos!

16 de junio de 2021

Rotar y voltear imágenes con GdiPlusX

Artículo original: Rotate and Flip images with GdiPlusX
https://vfpimaging.blogspot.com/2007/06/vfppaint-flexible-drawing-and-paint.html
Autor: Cesar Ch.
Traducido por: Ana María Bisbé York


Alguna gente ha estado preguntando sobre Rotar/ Voltear imágenes con GdiPlusX.

He aquí un código adaptado de un artículo anterior que utilizaba _GdiPlus.vcx; pero esta vez utilizando GdiPlusX.

Rotar y/o voltear imágenes es una tarea muy sencilla para Gdi+. Para ver los diferentes resultados posibles, cambie el valor de la constante en la variable lnEnumRotateFlip del código que se muestra a continuación.

IMPORTANTE

Requiere VFP9 y GdiPlusX para ejecutarse

Asegúrese por favor de que tiene la última versión

https://github.com/VFPX/GDIPlusX

* Iniciar GdiPlusX
_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx")))
LOCAL loBMP as xfcBitmap
LOCAL lnEnumRotateFlip
WITH _SCREEN.System.Drawing
  loBMP = .Bitmap.FromFile(GETPICT())
  * Pruebe cambiando este valor por los que se muestran debajo 
  lnEnumRotateFlip = .RotateFlipType.Rotate90FlipNone 
  loBmp.RotateFlip(lnEnumRotateFlip)
  * Guardar la imagen como PNG 
  loBMP.Save("C:\RotateFlip.png", .Imaging.ImageFormat.Png)
ENDWITH 
RUN /N explorer.EXE RotateFlip.png 

RotateNoneFlipNone 0

RotateNoneFlipNone 1

RotateNoneFlipNone 2

RotateNoneFlipNone 3

RotateNoneFlipNone 4

RotateNoneFlipNone 5

RotateNoneFlipNone 6

RotateNoneFlipNone 7


3 de junio de 2021

Alcance (rango) de propiedades

Titulo: Ver o no ver
Original: To See or Not To See
Autor: Jim Booth
Traducido por: Roberto Alfredo Moré


En esta columna investigaremos la visibilidad de propiedades y métodos. Visual FoxPro nos da tres: Pública, Protegida y Oculta. ¿Que son exactamente cada una de estas y dónde deberíamos usar una en lugar de la otra?.

Una pequeña clase.

Uno de los objetivos del desarrollo orientado a Objetos es aislar los datos y el comportamiento requerido en una clase particular a esa clase misma, para reducir el nivel de dependencia que esa clase particular tiene sobre otras clases no relacionadas. Estas dependencias incluso pueden ser un problema dentro del mismo árbol de la clase, afectando como la superclase (parent) y las subclases interactúan.

Para examinar la visibilidad de propiedades y métodos usaremos un pequeño ejemplo de una estructura de clases. El siguiente diagrama describe el ejemplo.

En este ejemplo hay dos definiciones de clase txtBase y txtSubClass. TxtSubClass es una subclase de txtBase. Hay allí un formulario con una instancia de txtSubClass, txtSubClass1, en él. La clase txtBase tiene una propiedad, Prop1, agregada en ella y marcada como Oculta. TxtSubClass tiene agregada una propiedad, Prop2, marcada como protegida.

Pública

La primer visibilidad a discutir es el valor de Pública. Al crear una propiedad o método que es Público causa que aquella propiedad o método sea visible, o sea que se la pueda leer, escribir o ejecutar desde cualquier otro objeto o clase sin limitación.

Protegida

Un método o propiedad Protegida es accesible solamente por la clase que creó dicha propiedad o método y para las subclases de esa clase. La visibilidad se extiende a lo largo del árbol de subclases si hay varios niveles hacia abajo (Prop2 en el diagrama de arriba es visible a txtSubClass, pero no puede ser direccionada en el código que esté en el objeto txtSubClass1 o en el objeto Formulario).

Nota del Traductor: se ha respetado en forma literal al autor, pero en realidad la propiedad Prop2 es visible en txtSubClass1 y se puede hacer referencia a ella en el formulario, pero no se puede modificar. Únicamente la clase que creó la propiedad lo puede hacer.

Oculta

Un método o propiedad Oculta es visible ÚNICAMENTE para la clase que la ha creado. Las subclases no ven esta propiedad/método en su hoja de propiedades y no pueden acceder a la misma (ocurre un error de VFP). (Prop1 en el diagrama de arriba es accesible SÓLO por la clase txtBase, txtSubClass no puede direccionar la propiedad y el nombre de la propiedad no aparece en la hoja de propiedades de la clase txtSubClass)

¿Por qué debería preocuparme?

Una de las características subyacentes del Diseño Orientado a Objetos es "Ocultar la implementación de un objeto". Esto significa ocultar completamente el mecanismo exacto que un objeto particular o clase usa para cumplir con su responsabilidad.

A menudo, un objeto puede necesitar datos internos o funcionalidad que no tiene ningún significado fuera del alcance de dicho objeto. Si estas porpiedades y métodos fueran visibles para el mundo exterior, existe la posibilidad de que puedan ser accedidos por algún código que no debería estar haciendo eso. Usando la visibilidad se puede controlar absolutamente qué puede y qué no puede acceder a propiedades y métodos.

Nota: También se puede cambiar la visibilidad de las propiedades y métodos de Visual FoxPro usando el diálogo de Edición de Métodos y Propiedades.

Un ejemplo para Oculta.

Usted está diseñando una clase formulario que será utilizada por otros desarrolladores a través de subclases. Uno de los comportamientos de la clase se cumpliría mejor si estuviera repartido en múltiples métodos en lugar de uno grande. No obstante, estos sub-métodos no son útiles fuera de la clase y un desarrollador que sobreescriba uno de ellos convertiría en no funcional a la clase. Usted puede definir un médodo como Público, aquel que será llamado por los desarrolladores para iniciar el comportamiento, pero los restantes sub-métodos como Oculto de manera que los otros desarrolladores ni siquiera sabrán que existen.

Un ejemplo para Protegida.

Usted está creando una clase utilitaria que necesita algún almacenamiento interno para su estado. Para ello crea un conjunto de propiedades. Si algún objeto fuera de la clase modifica estas propiedades, el estado del objeto se pierde. Usted puede definir estas propiedades como Protegidas y nada fuera del objeto puede direccionarlas.

Usando los métodos Access y Assign.

Usted podría estar pensando que usando los métodos Access y Assign se hace esencialmente la misma cosa que con popiedades protegidas. No exactamente. Los métodos Access y Assign permiten responder a algo que se direcciona a una propiedad, pero no previenen el acceso. En algunas situaciones, usted podría querer permitir a objetos externos actualizar o leer una propiedad y necesita hacer algo basado en el valor asignado o leído. En ese caso, los médodos Access y Assign son la vía para hacerlo.

No obstante, creando un método Assign que siempre descarte la asignación, es como ayudar a una persona que se está quemando manteniéndola bajo agua por 30 minutos.