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