Resumen FlexGrid

Mensaje enviado por "govoni" <govoni@mx2.redestb.es>

Te envio alguna informacion sobre FlexGrid que encontré hace tiempo por ahí,
...
Saludos
J.Carlos

METER DATOS EN EL GRID
Hay varias maneras de poblar de datos un MSFLexGrid. No hay ninguna "oficial" o con claras diferencias de velocidad por lo que el elegir una u otra depende del origen de los datos y del gusto del programador.
Para datos contenidos en una base de datos la opción obvia es ligar el grid a un DataControl. Una vez establecidas las propiedades DatabaseName y RecordSource del DataControl, simplemente hay que usar la propiedadDataSource del MSFlexGrid para ligar el grid al DataControl. El grid se llenará automáticamente con los datos, una fila por cada registro.
La primera fila contendrá las cabeceras de las comunas derivadas de los nombres de los campos de la base de datos. Si no quieres estas cabeceras emplea el método RemoveItem para borrarlas. Como MSFlexGrid no permite borrar una línea de cabecera (fija), debes poner primero la propiedad FixedRows a cero.

En el modo no enlazado, MSFlexGrid es un contenedor de datos: pones el dato una vez y permanece allí durante la vida del grid. Existen cuatro propieadades y un método que te ayudarán a hacer esto : el método AddItem method, y las propiedades Clip, Text, TextArray y TextMatrix.

Si está usando el grid como listbox, o prefieres pensar en él como en un listbox, usa el método AddItem para poblarlo.
El siguiente código crea un grid de dos columnas con las letras desde la A hasta la Z y sus códigos ASCII.

MSFlexGrid1.Rows = 0
For I = Asc("A") To Asc("Z")
  MyData = Chr$(I) & vbTab & I
  MSFlexGrid1.AddItem MyData
Next

El método AddItem añadirá 26 filas a las existentes en el grid, por eso ponemos la propiedad Rows a cero antes de empezar. Hay que tener en cuenta que el tabulador (vbTab) se usa para separar los datos para la segunda columna. El método AddItem tiene un parámetro opcional Index para añadir la fila en una localización específica.

La propiedad Clip se usa para rellenar un grid con un rango de datos de algún origen de datos que tenga un método Clip compatible. Un rdoResulset es un origen de datos y su método GetClipString cumple las condiciones. El siguiente ejemplo cojerá las primeras cuatro filas de la tabla Customers y las copiará en las filas 5 a 8 del grid.

Dim rs As rdoResultset

Set rs = MyConnection.OpenResultset("Customers")
>select the target range
MSFlexGrid1.Row = 5
MSFlexGrid1.Col = 1
MSFlexGrid1.RowSel = 8
MSFlexGrid1.ColSel = rs.rdoColumns.Count

>get the data
MSFlexGrid1.Clip = rs.GetClipString(4) >returns 4 rows

Hay que destacar que no hemos tenido que tratar los datos a nivel de campo, la propiedad Clip lo hace por nosotros. La propiedad Clip retorna los datos formateados de manera que también nos servirían para hacer Cortar y Pegar desde una zona del grid a otra.

La propiedad Text es usada frecuentemente para asignar el contenido de una celda. Esta celda debe ser la celda activa, por lo que previamente debes emplear las propiedades Row y Col para seleccionar la celda deseada. Para asignar un valor a un rango de celdas debes emplear la propiedad FillStyle conjuntamente con la porpiedad Text. El código siguiente pone una "X" en cada celda de un grid :

MSFlexGrid1.Row = 0
MSFlexGrid1.Col = 0
MSFlexGrid1.RowSel = MSFlexGrid1.Rows - 1
MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1
MSFlexGrid1.FillStyle = flexFillRepeat
MSFlexGrid1.Text = "X"

Si tu no quieres cambiar de celda activa para asignar valores debes emplear las propiedades TextArray y TextMatrix. Estas propiedades dan valor a un grupo arbitrario de celdas sin cambiar las propiedades Row y Col. TextMatrix direcciona una celda empleando la notación de fila y columna. TextArray usa un índice para referenciar una celda. Este índice es simplemente una numeración, empezando en cero, de las celdas de izquierda a derecha y de arriba a abajo. En un grid de 2 x 2 las siguientes líneas modifican el valor de la celda inferior derecha :

MSFlexGrid1.TextArray(3) = "X"
MSFlexGrid1.TextMatrix(1,1) = "X"

Como ves, hay gran variedad de maneras de poner datos en un MsFlexGrid.


TECNICAS DE ORDENACION

MSFlexGrid tiene capacidades de ordenación flexibles y rápidas. En muchos casos es más rápido usar la ordenación interna que emplear la cláusula ORDER BY en la consulta SQL.

Las opciones de ordenación te permiten ordenar ascendente o descendentemente tanto números como caracteres. La ordenación de caractéres puede ser sensible a mayúsculas / minúsculas o nó, según se desee. La propiedad Sort especifica el tipo de ordenación. Esta propiedad puede ser entendida también como un método porque la acción de ordenar se produce cuando se modifica su valor.
Puedes ordenar varias columnas para dar un efecto de ordenación por varias claves.

Existen dos técnicas que pueden ser usadas para dar más flexibilidad a la ordenación. Establecer la propiedad Sort a flexSortCustom hace que el evento Custom se dispare cada vez que el grid es ordenado. Puedes usar este evento para implementar cualquier tipo de ordenación que quieras. El segundo método emplea una columna oculta y deja que el grid haga el trabajo. Supongamos que tienes un campo de una base de datos que devuelve una fecha en formato corto. Ni la ordenación numérica ni la de caracteres ordenará correctamente esta columna. Para ordenar por fecha necesitas añadir una columna extra y ponerle anchura cero. Rellena la columna con los valores obtenidos de convertir la fecha en número y ordena por esta columna como se muestra (asumimos que la fecha está en la columna 2):

Dim Ro As Integer
Dim SortCol As Integer
Dim SortDate As Double
>add a column to hold the sort key
MSFlexGrid1.Cols = MSFlexGrid1.Cols + 1
SortCol = MSFlexGrid1.Cols - 1
MSFlexGrid1.ColWidth(SortCol) = 0 >invisible
>calculate key values & populate grid
For Ro = 1 To MSFlexGrid1.Rows - 1
   SortDate = DateValue(MSFlexGrid1.TextMatrix(Ro, 2))
   MSFlexGrid1.TextMatrix(Ro, SortCol) = SortDate
Next Ro

>do the sort
MSFlexGrid1.Col = SortCol >set the key
MSFlexGrid1.Sort = flexSortNumericAscending

EDITANDO LOS DATOS DEL GRID

MSFlexGrid no tiene incluída la capacidad de editar celdas, pero provee los instrumentos necesarios para que sea sencillo añadirla mediante programación. La ventaja de esto es que puedes implementarla a tu gusto. La técnica se basa en que la edición no ocurre realmente en el grid sino en un textbox posicionado sobre la celda editada.

En este ejemplo, daremos al usuario dos formas de entrar en modo edición, por hacer doble click en una celda o, simplemente, por empezar a escribir sobre ella. Las siguientes dos rutinas implementan esto :

Private Sub MSFlexGrid1_DblClick()
  GridEdit Asc(" ")
End Sub

Private Sub MSFlexGrid1_KeyPress(KeyAscii As Integer)
  GridEdit KeyAscii
End Sub

En cada caso llamamos a la rutina de edición y le pasamos la pulsación de una tecla. En el caso del doble click le pasamos un espacio en blanco. La rutina GridEdit inicializa el textbox y lo mueve a su posición.

Sub GridEdit(KeyAscii As Integer)
  >emplear la fuente correcta
  Text1.FontName = MSFlexGrid1.FontName
  Text1.FontSize = MSFlexGrid1.FontSize
  Select Case KeyAscii
    Case 0 To Asc(" ")
         Text1 = MSFlexGrid1
         Text1.SelStart = 1000
    Case Else
         Text1 = Chr(KeyAscii)
         Text1.SelStart = 1
  End Select
  >posicionar el textbox
  Text1.Left = MSFlexGrid1.CellLeft + MSFlexGrid1.Left
  Text1.Top = MSFlexGrid1.CellTop + MSFlexGrid1.Top
  Text1.Width = MSFlexGrid1.CellWidth
  Text1.Height = MSFlexGrid1.CellHeight
  Text1.Visible = True
  Text1.SetFocus
End Sub

Por propósitos de demostración, la instrucción Case en la rutina GridEdit muestra dos maneras diferentes de entrar en modo edición. En la práctica es probable que emplees sólo uno de ellos, o uno diferente creado por ti. Si se entra en modo edición mediante doble click se copian los contenidos de la celda en el textbox y se pone el cursor al final del mismo. Si entramos presionando una tecla normal, se ignora el contenido de la celda y se inserta la tecla pulsada en el textbox. El posicionamiento del textbox puede
realizarse en una sola instrucción empleando el método Move. Hamos usado cuatro líneas para facilitar la lectura de este artículo.

Ahora necesitamos uan serie de rutinas que manejen lo que sucede cuando el usuario se mueve a diferente celda o a otro control. El evento LeaveCell será tambien el lugar en el que pondrás las validaciones que necesites.

Private Sub MSFlexGrid1_LeaveCell()
  If Text1.Visible Then
     MSFlexGrid1 = Text1
     Text1.Visible = False
  End If
End Sub

Private Sub MSFlexGrid1_GotFocus()
  If Text1.Visible Then
    MSFlexGrid1 = Text1
    Text1.Visible = False
  End If
End Sub

Pondremos ahora un poco de código de navegación en el evento KeyDown del textbox para que, por ejemplo, el usuario pueda abandonar el modo edición presionando Esc y moverse a otra fila presionando "las flechas".

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
  Select Case KeyCode
    Case vbKeyEscape
      Text1.Visible = False
      MSFlexGrid1.SetFocus
    Case vbKeyReturn
      MSFlexGrid1.SetFocus
    Case vbKeyDown
      MSFlexGrid1.SetFocus
      DoEvents
      If MSFlexGrid1.Row < MSFlexGrid1.Rows - 1 Then
         MSFlexGrid1.Row = MSFlexGrid1.Row + 1
      End If
    Case vbKeyUp
      MSFlexGrid1.SetFocus
      DoEvents
      If MSFlexGrid1.Row > MSFlexGrid1.FixedRows Then
         MSFlexGrid1.Row = MSFlexGrid1.Row - 1
      End If
  End Select
End Sub

Finalmente necesitamos una línea de código para suprimir el Beep que ocurre cuando presionamos la tecla Enter en un textbox:

Private Sub Text1_KeyPress(KeyAscii As Integer)
  >suppresión del beep
  If KeyAscii = vbKeyReturn Then KeyAscii = 0
End Sub

Para lograr el efecto pretendido tenemos que asignar algunas propiedades al textbox en tiempo de diseño : Appearance = 0 (flat) y BorderStyle = 0 (none). También debemos poner Visible = False para que el textbox no sea inicialmente visible. Para mejorar este código el textbox necesita un desplazamiento adicional hacia abajo y hacia la derecha (con la correspondiente reduccion de tamaño) para que el texto esté exactamente
alineado con el de las celdas adyacentes.
Probablemente también quieras escribir algo de código en el evento scroll del grid para que hacer un click en la barra de scroll del grid no haga perder el foco al textbox.

Ten en cuenta que esta técnica no está limitada a usar un TextBox para la edicion. Puedes usar un combobox, checkbox o incluso un control de calendario para editar, según la columna que estés editando.

MSFlexGrid es un control muy flexible y este artículo sólo toca algunas de las cosas que puedes hacer con él.
Según te vayas familiarizando con él, irá pasando a formar parte de tus herramientas de trabajo. La mezcla de celdas y el "pivoting" son dos características únicas en el
MSFlexGrid que le dan un tremendo poder.



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com