21 de julio de 2012

Arrastrar, soltar y conservar posiciones

Artículo original: Drag, Drop and Retain Positions
http://sandstorm36.blogspot.com/2012/07/drag-drop-and-retain-positions.html
Autor: Jun Tangunan
Traducido por: Luis Maria Guayán


Arrastrar, soltar y conservar posiciones

Aquí otro ejemplo moviendo objetos a su alrededor y conservando las posiciones en la siguiente ejecución del formulario. Esto es sólo una simple demostración de cómo podemos hacer lo siguiente:



Mientras que la parte de arrastrar y soltar parece ser fácil, además de conservar y recuperar esos valores posteriormente, lo que me llevó más tiempo de averiguar es cómo el reordenamiento de estos objetos que afectan las propiedades tabIndex de cada objeto dentro del contenedor. De todos modos, esto no está perfecto aun, pero al menos usted tendrá algo con que empezar y perfeccionar.

Copie y pegue el código a un .PRG, ejecute y tilde "Permitir mover", a continuación, arrastre los botones alrededor. Después de eso, cierre el formulario y a continuación, ejecutelo de nuevo. Vea si se mantiene las últimas posiciones cuando se cerró el formulario y si el tabindex es el adecuado.
Aquí el código del ejemplo si le interesa:
LOCAL oForm AS FORM
oForm = CREATEOBJECT('TestForm')
oForm.SHOW(1)
RETURN

DEFINE CLASS TestForm AS FORM
  AUTOCENTER = .T.
  WIDTH = 300
  HEIGHT = 440
  MINWIDTH = 200
  MINHEIGHT = 100
  CAPTION = 'Drag, Drop & Retain Positions'

  ADD OBJECT chkMove AS CHECKBOX WITH CAPTION = 'Permitir mover los objetos',;
    TOP = 400, LEFT = 5, AUTOSIZE = .T., VALUE = .F., ANCHOR = 6
  ADD OBJECT Command1 AS MyButton WITH CAPTION='One', TOP = 5, LEFT = 5
  ADD OBJECT Command2 AS MyButton WITH CAPTION='Two', TOP = 70, LEFT = 5
  ADD OBJECT Command3 AS MyButton WITH CAPTION='Three', TOP =135, LEFT = 5
  ADD OBJECT Command4 AS MyButton WITH CAPTION='Four', TOP = 200, LEFT = 5
  ADD OBJECT Command5 AS MyButton WITH CAPTION='Five', TOP = 265, LEFT = 5
  ADD OBJECT Command6 AS MyButton WITH CAPTION='Six', TOP = 330, LEFT = 5

  PROCEDURE LOAD
    CLOSE DATABASES ALL
    * Check if table is there for preserving/restoring values
    IF !FILE('DragDrops.dbf')
      CREATE TABLE dragdrops FREE (ObjectName c(40),xTop I,xLeft I,xTabIndex I)
      INDEX ON xTop+xLeft TAG xTabIndex
    ELSE
      USE dragdrops ORDER xTabIndex
    ENDIF
  ENDPROC

  PROCEDURE INIT
    * Check if first run or not, if first run, make an entry in the table
    IF RECCOUNT() == 0
      FOR EACH loCtrl IN THISFORM.CONTROLS FOXOBJECT
        INSERT INTO dragdrops VALUES (loCtrl.NAME,loCtrl.TOP,loCtrl.LEFT,0)
      NEXT
    ENDIF
    THIS._reorder()
  ENDPROC

  PROCEDURE _TabIndex
    * recreate tab indexes
    LOCAL lnTab
    lnTab = 1
    SCAN
      REPLACE xTabIndex WITH m.lnTab IN dragdrops
      lnTab = m.lnTab + 1
    ENDSCAN
  ENDPROC

  PROCEDURE _reorder
    * Reorder Tab Index
    FOR EACH loCtrl IN THISFORM.CONTROLS FOXOBJECT
      SELECT dragdrops
      LOCATE FOR UPPER(loCtrl.NAME) = UPPER(ObjectName)
      loCtrl.TABINDEX = dragdrops.xTabIndex
    NEXT
  ENDPROC

ENDDEFINE

DEFINE CLASS MyButton AS COMMANDBUTTON
  HEIGHT = 60
  WIDTH = 100

  PROCEDURE INIT
    * Get previous positions
    SELECT dragdrops
    LOCATE FOR UPPER(THIS.NAME) = UPPER(ObjectName)
    THIS.TOP = dragdrops.xTop
    THIS.LEFT = dragdrops.xLeft
  ENDPROC

  PROCEDURE MOUSEMOVE
    LPARAMETERS nButton, nShift, nXCoord, nYCoord
    IF m.nButton = 1 AND THISFORM.chkMove.VALUE = .T.
      THIS.MOVE(m.nXCoord, m.nYCoord)
      * update new coordinates
      REPLACE xTop WITH m.nYCoord, xLeft WITH m.nXCoord FOR;
        UPPER(THIS.NAME) = UPPER(ObjectName) IN dragdrops
      THISFORM._TabIndex()
    ENDIF
  ENDPROC

  PROCEDURE CLICK
    MESSAGEBOX("You've clicked "+THIS.NAME+CHR(13)+;
      "Tab Index: "+TRANSFORM(THIS.TABINDEX))
  ENDPROC

ENDDEFINE

No hay comentarios. :

Publicar un comentario