Sunday, 31 January 2016 17:47

Modelo de Datos en TPuy. parte 1

Written by
Rate this item
(0 votes)

El modelo de datos en TPuy. Parte 1.

En TPuy obviamente por ser derivado de t-gtk, se hace uso del modelo de datos de GTK+. La diferencia es que tratamos de darle un nivel más alto y sencillo al uso de estos modelos de datos.

Vamos a definir de forma breve un modelo de datos. Es una estructura en conjunto que representa información y la forma de acceder a ella, por ejemplo, una tabla de datos contiene un numero de columnas y filas; estas filas y columnas pueden estar identificadas y al hacer una proyección de fila y columna, ambas coinciden en una ubicación que puede contener uno o más datos. De esta forma, mediante coordenadas accedemos a los datos. 

tablas 001

 

 

Entendemos entonces que debemos conocer los mecanismos de acceso y asi darles sentido a los mismos y puedan entonces representar información. 

 

Podemos concluir que una tabla de datos puede ser una forma de modelo de datos.

 

En GTK+, manipular la información de un modelo de datos como la de una tabla de datos es tarea de un conjunto de funciones destinadas para ello:

  • Las GtkListStore. Destinadas al tratamiento de datos tipo tabla (filas y columnas)
  • Las GtkTreeStore. Destinadas al tratamiento de datos tipo árbol (filas, filas hijas y columnas).

Y la forma de hacer visible los datos de un modelo de datos, se hace a traves del grupo de funciones GtkTreeView.

Un buen material de lectura respecto al uso de estas funciones de GTK+.

Modelos de datos estandares

Programar con GTK (lenguaje C) TreeView.

 

¿Cómo hacer uso de todo esto?

Bien, para el uso de gtk+ en C, python, php, etc.. la internet está llena de guías, ejemplos, tutoriales, etc. El objetivo de este artículo es mostrar como hacerlo con t-gtk y TPuy.

En t-gtk se cuenta con un conjunto de clases que nos permiten hacer uso de la gtk usando programación orientada a objetos. De manera que instanciamos un objeto de tipo modelo de datos y luego instanciamos otro objeto tipo treeview. Se puede ver mayor información del esto en el artículo <colocar aqui enlace a articulo de modelo de datos en t-gtk>

En TPuy, lo que hacemos es tratar de hacer más fácil el uso de los modelos de datos y las vistas a los mismos. La idea es tratar de que la gestiòn de los modelos y la vista sea algo muy simplista y que el programador se dedique más al objetivo que desea conseguir en el uso de estos objetos.

Vamos a explicarlo mejor a través del siguiente ejemplo:

 

 dm_test1

View source
  1. #include "tpy_xbs.ch"
  2.  
  3. function dm_test1()
  4.  
  5.    local aStruct
  6.    local aItems
  7.    local oModel
  8.    local oListBox, dFecha := date()
  9.  
  10.  
  11.    aItems := {;
  12.               {"Rafael"  , "Carmona"     ,.t., dFecha-15},;
  13.               {"Federico", "De Maussion" ,.f., dFecha-30},;
  14.               {"Daniel"  , "Garcia"      ,.f., dFecha+12},;
  15.               {"Riztan"  , "Gutierrez"   ,.f., dFecha   } ;
  16.              }
  17.  
  18.    aStruct := {{"Nombre"  , "C" , 20 , 0},;
  19.                {"Apellido", "C" , 20 , 0},;
  20.                {"Estatus" , "L" , 01 , 0},;
  21.                {"Fecha"   , "D" , 10 , 0}}
  22.  
  23.  
  24.    //oModel := tpy_data_model():New(,,aStruct,aItems)
  25.    DEFINE MODEL oModel ;
  26.           STRUCT aStruct ;
  27.           DATA aItems
  28.  
  29.  
  30.    //oListBox := tpy_listbox():New(,oModel,"listbox",,350,500)
  31.    DEFINE LISTBOX oListBox ;
  32.           MODEL oModel ;
  33.           TITLE "Listado";
  34.           SIZE 350,400 //OF oTpuy:oDesktop
  35.  
  36.  
  37.    oListBox:Active()
  38.  
  39.    oModel:Destroy()
  40.  
  41. return nil
  42.  
  43.  

Como se puede deducir, la instrucción encargada de preparar el modelo de datos es:

DEFINE MODEL  oModel  ;
       STRUCT aStruct ;
       DATA   aItems

De esta forma instanciamos un objeto tpuy de tipo modelo de datos (tpy_data_model). No es la única forma de crear un modelo de datos de tpuy, pero de momento es la que vamos a analizar.

Tras haber creado un arreglo de estructura como:

 

aStruct := {{"Nombre"  , "C" , 20 , 0},;
            {"Apellido", "C" , 20 , 0},;
            {"Estatus" , "L" , 01 , 0},;
            {"Fecha"   , "D" , 10 , 0}} 

Indicando:  Nombre de la columna, tipo de dato, longitud de la columna, nro de decimales (para dato tipo numérico).

Se procede a crear otro arreglo que puede o no contener los datos. En el caso del ejemplo, el arreglo de datos contiene 4 registros de personas.

aItems  := {;
           {"Rafael"  , "Carmona"     ,.t., dFecha-15},;
           {"Federico", "De Maussion" ,.f., dFecha-30},;
           {"Daniel"  , "Garcia"      ,.f., dFecha+12},;
           {"Riztan"  , "Gutierrez"   ,.f., dFecha   } ;
           }

Como el arreglo que contiene los datos puede estar vacio, es válido tambié instanciar el modelo de datos de tpuy de la siguiente manera:

DEFINE MODEL  oModel  ;
       STRUCT aStruct ;
       DATA   {}

 

Continuamos. luego de la instrucción anterior, ahora tenemos una variable oModel contenedora del modelo de datos. Ahora, vamos a construir el objeto visual de ese modelo de datos, es decir, el equivalente al GtkTreeView. Generamos el objeto a través de la instrucción:

DEFINE LISTBOX oListBox  ;
       MODEL   oModel   ;
       TITLE   "Listado" ;
       SIZE    350,400

Tras ejecutarse la instrucción, queda disponible la variable oListBox contenedora de un objeto visual del modelo de datos oModel. Sin embargo el objeto aún no se despliega en pantalla, y precisamente es importante que aún no se despliegue nada. Esto, porque si se necesita hacer algunos ajustes a este objeto, ahora es el momento.

Igualmente la instrucción para instanciar el objeto tipo tpy_listbox, tiene algunas variantes que luego estudiaremos, de momento solo indicaremos que al no indicar un objeto widget contenedor para el oListBox; al activar el oListBox la clase que lo controla se encarga de crear una ventana que será la que contendrá el oListBox.

Si ya se hicieron ajustes o si no hay nada más que hacer, procedemos a "Activar" el objeto oListBox.

Para activar el objeto, ejecutamos la instrucción:

oListBox:Active()

A través de la instrucción active, el objeto oListBox puede aparecer empotrado en una ventana independiente o dentro de un contenedor que se le ha indicado.  En nuestro ejemplo, no se ha indicado ningun contenedor; por lo que la clase crea una ventana que será la que contenga el objeto oListBox y la ventana estará accesible a través de la variable oListBox:oWnd.

En caso de tener ya una ventana creada y querer que el objeto oListBox se despliegue dentro de un contenedor de la ventana, entonces la instrucción debe ser algo como:

DEFINE LISTBOX oListBox  ;
       MODEL   oModel   ;
       OF   oBox ;

Esto, suponiendo que el objeto oBox es un contenedor de una ventana y es un objeto ya disponible. Es decir, previamente debe existir algo como:

DEFINE WINDOW oWnd        ;
TITLE "Mi Ventana" ;
SIZE 400,400

DEFINE BOX oBox OF oWnd

   

 

En el próximo artículo, vamos a continuar analizando el ejemplo. Haremos algunos cambios y los comentaremos.

 

 

 

Read 3943 times Last modified on Friday, 12 February 2016 05:01
Riztan Gutierrez

Desarrollador de Software en xBase. (clipper, [x]Harbour)

Amante del Software Libre!

twitter 16x16 @riztanivan