24 de julio de 2012

Arrastrar, soltar y conservar las posiciones - Parte II - Columnas de una cuadricula

Artículo original: Drag, Drop and Retain It Part II - Grid Columns
http://sandstorm36.blogspot.com.ar/2012/07/drag-drop-and-retain-it-part-ii-grid.html
Autor: Jun Tangunan
Traducido por: Luis Maria Guayán


Arrastrar, soltar y conservar las posiciones - Parte II - Columnas de una cuadricula



Debido al ejemplo de "Arrastrar, soltar y conservar posiciones" que publiqué anteriormente, una nueva solicitud se hizo dentro del foro (Nota del Traductor: Foxite Forum) y esta vez se trata de reordenar las columnas de una cuadrícula sobre la marcha y guardar esa configuración.

Yo pensaba llamar esto "Trucos de cuadrícula # 6" porque se trata de trucos de cuadrícula, pero al final me decidí a hacer esta la parte 2 parte 2 de "Arrastrar, soltar y conservar las posiciones".

De todos modos, aquí está cómo hacerlo. Siempre se debe tener algo primero para guardar la configuración y luego para recuperar, una tabla es mi mejor opción. Esto es simple y solo para que sirva de guía. Puede ser necesario que usted tenga que guardar el nombre del formulario y el nombre de la cuadrícula para algo mas completo

Aquí está el código de ejemplo, si estás interesado:
LOCAL oForm
oForm = NEWOBJECT("Form1")
oForm.SHOW
READ EVENTS
RETURN

DEFINE CLASS Form1 AS FORM
  HEIGHT = 390
  WIDTH = 500
  AUTOCENTER = .T.
  CAPTION = 'Reordenar las columnas y conservarlas'
  SHOWTIPS = .T.

  ADD OBJECT label1 AS LABEL WITH ;
    CAPTION = 'Arrastre y suelte para reordenar columnas. Luego cierre y ' + ;
    'vuelva a abrir formulario para ver si la disposición está guardada', ;
    TOP = 10, LEFT = 10, WIDTH = 480, HEIGHT = 40, WORDWRAP = .T.

  ADD OBJECT grid1 AS GRID WITH ;
    COLUMNCOUNT = 3,;
    HEIGHT = 328, LEFT = 10, TOP = 50, WIDTH = 480,;
    GRIDLINES = 3, DELETEMARK = .F.,;
    GRIDLINECOLOR = RGB(192,192,192),;
    GRIDLINES = 0, FONTNAME = 'Tahoma', FONTSIZE = 8,;
    ANCHOR = 15, ALLOWCELLSELECTION = .F.,;
    TOOLTIPTEXT = 'Drag Column to Rearrange'

  PROCEDURE LOAD
    SET TALK OFF
    SET SAFETY OFF
    CLOSE DATABASES ALL
    SELECT  company, contact, TITLE FROM (HOME(2)+"data\customer") WHERE RECNO() < 50 INTO CURSOR junk
    USE IN SELECT('customer')

    * Create/use a table to store grid column settings
    IF !FILE("gridcolumns.dbf")
      CREATE TABLE gridcolumns (ColName c(10), ColOrder I)
    ELSE
      USE gridcolumns IN 0 SHARED
    ENDIF
  ENDPROC

  PROCEDURE INIT
    IF RECCOUNT("gridcolumns") == 0
      * First run? Save the current order of the columns
      LOCAL lnloop
      WITH THISFORM.grid1
        FOR lnloop = 1 TO .COLUMNCOUNT
          lcColName =  .COLUMNS(m.lnloop).NAME
          lnOrder = .COLUMNS(m.lnloop).COLUMNORDER
          INSERT INTO gridcolumns VALUES (m.lcColName, m.lnOrder)
        NEXT
      ENDWITH
    ENDIF
    THIS._getorder()
  ENDPROC

  PROCEDURE grid1.INIT
    WITH THIS
      .RECORDSOURCETYPE = 6
      .RECORDSOURCE = 'junk'
      .Column1.Header1.CAPTION = 'Column1'
      .Column2.Header1.CAPTION = 'Column2'
      .Column3.Header1.CAPTION = 'Column3'
      .SETALL('Width',150,'Column')

      * Bind Move Events
      FOR lnloop = 1 TO .COLUMNCOUNT
        BINDEVENT(.COLUMNS(m.lnloop),'Moved',THISFORM,'_Moved')
      NEXT
    ENDWITH
  ENDPROC

  PROCEDURE _Moved
    * Save new column orders
    LOCAL lnloop
    WITH THISFORM.grid1
      FOR lnloop = 1 TO .COLUMNCOUNT
        lcColName =  ALLTRIM(.COLUMNS(m.lnloop).NAME)
        lnOrder = .COLUMNS(m.lnloop).COLUMNORDER
        REPLACE ColOrder WITH m.lnOrder FOR ALLTRIM(ColName) = m.lcColName IN gridcolumns
      NEXT
    ENDWITH
  ENDPROC

  PROCEDURE _getorder
    * Fetch Column Orderings
    SELECT gridcolumns
    LOCAL lnloop
    WITH THISFORM.grid1
      FOR lnloop = 1 TO .COLUMNCOUNT
        lcColName =  .COLUMNS(m.lnloop).NAME
        LOCATE FOR ColName = m.lcColName
        .COLUMNS(m.lnloop).COLUMNORDER = ColOrder
      NEXT
      .REFRESH
    ENDWITH
  ENDPROC

  PROCEDURE DESTROY
    CLOSE DATABASES ALL
    CLEAR EVENTS
  ENDPROC

ENDDEFINE

No hay comentarios. :

Publicar un comentario