HMG TUTORIAL
 
Ejemplos:  ..\SAMPLES\Basics\TUTORIAL

 


El Primer Programa


No seré muy original, este programa desplegará el mensaje 'Hola Mundo'

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 01 - Hola Mundo!' ;
        MAIN 
 
    END WINDOW
 
    ACTIVATE WINDOW Win_1
 
Return   
   

¼    DEFINE WINDOW El comando DEFINE WINDOW: Creará la ventana principal para el programa

¼  Win_1 Es el nombre de la ventana

¼    AT 0,0 Indica la posición de la ventana (row=0,col=0)

¼    WIDTH 400 Significa que la ventana tendrá 400 pixels de ancho.

¼    HEIGHT 200 Significa que la ventana tendrá 200 pixels de alto.

¼    TITLE 'Hola el Mundo!' Indica el texto en la barra de tí­tulo de la ventana.

¼    MAIN Indica que estamos definiendo la ventana principal de la aplicación
(una ventana principal se requiere para todas las aplicaciones HMG)

¼    ACTIVATE WINDOW Form_1 Mostrará la ventana e iniciará el ciclo de eventos. 


Agregando El Menú Principal

Agregaremos un menú principal al programa:

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 02 - Testeo de Propiedad' ;
        MAIN 
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Cambiar el Título de la Ventana' ACTION Win_1.Title := 'Nuevo Título'
             ITEM 'Recuperar el Título de la Ventana' ACTION MsgInfo ( Win_1.Title )
           END POPUP
        END MENU
    END WINDOW
 
    ACTIVATE WINDOW Win_1
 
Return
   

Como puede verse es bastante fácil e intuitivo.
Todo los comandos del menú principal estarán entre las declaraciones DEFINE MAIN MENU / END MENU.
Cada popup individual del menú estarán entre las declaraciones POPUP / END POPUP.
Cada í­tem de menú se codificará via la declaración ITEM.
Puede usarse cuantos popups sean necesários y pueden anidarse sin ningún lí­mite.

La función MsgInfo()

Ésta es una función muy útil. Mostrará una pequeña ventana de mensaje (con el í­cono de información del sistema) y un mensaje que se le pase como parámetro.

Puede agregar opcionalmente un tí­tulo (como segundo parámetro)


El Control LABEL

El control LABEL permite mostrar texto y es muy fácil de utilizar también.

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 03 - Testeo de Label' ;
        MAIN 
        @ 100,10 LABEL Label_1 VALUE 'Este es un Label!'
    END WINDOW
 
    ACTIVATE WINDOW Win_1
 
Return
   

@ 100,10 significa que el texto será mostrado en la fila 100, columna 10.
        (Recordar que la unidad de medida es en pixel).

Label_1 es el nombre del control (lo identificaremos por este nombre La cláusula

VALUE indica el valor inicial del control cuando es creado.

 


Obteniendo datos del usuario (el control TextBox)

El control TextBox es el medio más usado para obtener datos del usuario.

Para ingresar datos numéricos, solo agregarse la cláusula NUMERIC.

Para ingresar datos numéricos, solo agregarse la cláusula INPUTMASK.

 

 
#include "hmg.ch"
 
Function Main()
DEFINE WINDOW Win_1 ;
    AT 0,0 ;
    WIDTH 400 ;
    HEIGHT 300 ;
    TITLE 'Tutor 04 - Testeo de TextBox' ;
    MAIN 
        
    DEFINE MAIN MENU
       POPUP "Primer Popup"
         ITEM 'Cambiar el contenido del TextBox ' ACTION Win_1.Text_1.Value := 'Nuevo valor del TextBox'
         ITEM 'Recuperar el contenido del TextBox' ACTION  MsgInfo ( Win_1.Text_1.Value )
         SEPARATOR
         ITEM 'Cambiar el contenido numérico del TextBox' ACTION  Win_1.Text_2.Value := 100
         ITEM 'Recuperar el contenido numérico del TextBox' ACTION  MsgInfo ( Str(Win_1.Text_2.Value) )
         SEPARATOR
         ITEM 'Cambiar el contenido numérico del TextBox(InputMask)' ACTION  Win_1.Text_3.Value := 1234.12
         ITEM 'Recuperar el contenido numérico del TextBox(InputMask)' ACTION  MsgInfo ( Str( Win_1.Text_3.Value ) )
       END POPUP
    END MENU
        
    @ 40 , 120 TEXTBOX Text_1
    @ 80 , 120 TEXTBOX Text_2 NUMERIC
    @ 120 , 120 TEXTBOX Text_3 NUMERIC INPUTMASK '9999.99'
END WINDOW
ACTIVATE WINDOW Win_1
Return
   


Obteniendo Datos Lógicos

A veces, es necesario obtener datos de tipo lógico del usuario. La manera más fácil de hacerlo es utilizando el control checkbox.

Agregamos CHECKBOX al programa, junto con nuevas opciones de menú para poder asignar o recuperar su valor.

 

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 300 ;
        TITLE 'Tutor 05 - Testeo de CheckBox' ;
        MAIN 
               
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Cambiar el Valor del CheckBox' ACTION  Win_1.Check_1.Value := .T.
             ITEM 'Recuperar el Valor del CheckBox' ACTION  MsgInfo ( if( Win_1.Check_1.Value,'.T.','.F.') )
           END POPUP
        END MENU
            @ 100, 120 CHECKBOX Check_1 CAPTION 'Check Me!'
    END WINDOW
    ACTIVATE WINDOW Win_1
Return
   


Seleccionando Opciones:

A veces, es necesario obtener el valor de una elección de los usuarios, entre un grupo pequeño de opciones que son conocidos en el momento del diseño.

La mejor manera de proceder en tales casos es usar el control RadioGroup.

 

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 06 - Testeo de RadioGroup' ;
        MAIN 
               
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Cambiar el valor del RadioGroup' ACTION  Win_1.Radio_1.Value := 2
             ITEM 'Recuperar el Valor del RadioGroup' ACTION  MsgInfo ( Str(Win_1.Radio_1.Value) )
           END POPUP
        END MENU
            @ 80, 120 RADIOGROUP Radio_1 OPTIONS {'Opción 1','Opción 2','Opción 3'}
    END WINDOW
    ACTIVATE WINDOW Win_1
Return
   


Otras Formas de Selección de Opciones:

 

Hay varias alternativas para obtener la opción de un usuario además de RadioGroup.

Uno de ellos es el control ListBox.

Usando un Listbox, puede agregarse, cambiar o quitar items en tiempo de ejecución.

 

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 07 - Testeo de ListBox' ;
        MAIN 
        
               DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Cambiar valor del ListBox' ACTION  Win_1.List_1.Value := 2
             ITEM 'Recuperar el valor del ListBox' ACTION  MsgInfo ( Str(Win_1.List_1.Value) )
             SEPARATOR
             ITEM 'Agregar iten de Lista' ACTION Win_1.List_1.AddItem ('Nuevo item de Lista')
             ITEM 'Remove item de Lista' ACTION Win_1.List_1.DeleteItem (2)
             ITEM 'Cambiar item de Lista' ACTION Win_1.List_1.Item (1) := 'Nuevo texto de Item'
             ITEM 'Mostrar cantidad de items de Lista' ACTION MsgInfo ( Str( Win_1.List_1.ItemCount) )
           END POPUP
        END MENU
        
               @ 10, 10 LISTBOX List_1 ITEMS {'Opción 1','Opción 2','Opción 3'}
    END WINDOW
    ACTIVATE WINDOW Win_1
Return
   


Otras Formas de Selección de Opciones II

Otro alternativa para obtener la opción de un usuario es el COMBOBOX.

Usar un ComboBox, es similar al ListBox.

 

 
#include "hmg.ch"
 
Function Main
 
DEFINE WINDOW Win_1 ;
    AT 0,0 ;
    WIDTH 400 ;
    HEIGHT 200 ;
    TITLE 'Tutor 08 - Teste de ComboBox' ;
    MAIN
        
    DEFINE MAIN MENU
       POPUP "Primer Popup"
         ITEM 'Cambiar el valor del ComboBox' ACTION  Win_1.Combo_1.Value := 2
         ITEM 'Recuperar valor del ComboBox' ACTION  MsgInfo ( Str(Win_1.Combo_1.Value))
         SEPARATOR
         ITEM 'Agregar item al ComboBox' ACTION Win_1.Combo_1.AddItem ('New List Item')
         ITEM 'Remove item del ComboBox' ACTION Win_1.Combo_1.DeleteItem (2)
         ITEM 'Cambiar itemd el ComboBox' ACTION Win_1.Combo_1.Item (1) := 'New Item Text'
         ITEM 'Mostrar cantidad de items del ComboBox' ACTION MsgInfo (Str(Win_1.Combo_1.ItemCount))
       END POPUP
    END MENU
    
        @ 10, 10 COMBOBOX Combo_1 ITEMS {'Opción 1','Opción 2','Opción 3'}
END WINDOW
ACTIVATE WINDOW Win_1
Return
   


Botones

Otra manera para permitir que los usuarios tomen una acción (además de los menús) es por medio de botones.

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 09 - Testeo de Button' ;
        MAIN 
               
        @ 10,10 BUTTON Button_1 ;
            CAPTION 'Click Aqui!' ;
            ACTION MsgInfo('Botón Clickeado!') 
    END WINDOW
    ACTIVATE WINDOW Win_1
Return
   


Botones con Imagen

En lugar de un texto puede usarse una imagen.

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 10 - Testeo de imagen en Button' ;
        MAIN
               
        @ 10,10 BUTTON PictureButton_1 ;
            PICTURE 'button.bmp' ;
            ACTION MsgInfo('Imagen en botón Clickeado!!') ;
            WIDTH 27 ;
            HEIGHT 27 ;
            TOOLTIP 'Picture Button Tooltip' 
    END WINDOW
 
    ACTIVATE WINDOW Win_1
 
Return
   


La cláusula tooltip (optativa) causa que una ventana pequeña con un texto explicativo se despliegue cuando el indicador del ratón se queda encima del control por unos segundos. Puede usarse esta cláusula con la mayorí­a de los comandos HMG.


Button + Checkbox = CheckButton

El control CheckButton, actua como un checkbox, pero se ve como un botón. Al igual que los botones, pueden ser de texto o gráficos.

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 11 - Testeo del CheckButton' ;
        MAIN 
               
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Cambiar el valor del CheckButton' ACTION  Win_1.CheckButton_1.Value := .T.
             ITEM 'Recuperar valor del CheckButton' ACTION  MsgInfo ( if(Win_1.CheckButton_1.Value,'.T.','.F.'))
             SEPARATOR
             ITEM 'Agregar item al CheckButton' ACTION  Win_1.CheckButton_2.Value := .T.
             ITEM 'Recuperar valor del CheckButton' ACTION  MsgInfo ( if(Win_1.CheckButton_2.Value,'.T.','.F.')) 
           END POPUP
        END MENU
               
        @ 10,10 CHECKBUTTON CheckButton_1 ;
            CAPTION 'CheckButton' ;
            VALUE .F. 
 
        @ 50,10 CHECKBUTTON CheckButton_2 ;
            PICTURE 'Open.Bmp' ;
            WIDTH 27 ; 
            HEIGHT 27 ;
            VALUE .F. ;
            TOOLTIP 'Graphical CheckButton' 
 
    END WINDOW
    ACTIVATE WINDOW Win_1
Return
   


El Control DatePicker

La manera más fácil de obtener una fecha del usuario es mediante el control datepicker.

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 12 - Testeo del DatePicker' ;
        MAIN 
               
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Cambiar el valor del DatePicker' ACTION  Win_1.date_1.Value := Date()
             ITEM 'Recuperar valor del DatePicker' ACTION  MsgInfo ( dtoc(Win_1.Date_1.Value) )
           END POPUP
        END MENU
        
               @ 10,10 DATEPICKER Date_1
    END WINDOW
    ACTIVATE WINDOW Win_1
Return
   


El control EditBox

El control EditBox permite manejar datos de texto de múltiples lí­neas.

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 300 ;
        TITLE 'Tutor 13 EditBox Test' ;
        MAIN 
               
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Cambiar el contenido del EditBox' ACTION  Win_1.Edit_1.Value := 'Nuevo contenido de EditBox'
             ITEM 'Recuperar contenido del EditBox' ACTION  MsgInfo ( Win_1.Edit_1.Value )
           END POPUP
        END MENU
               
        @ 10,10 EDITBOX Edit_1 ;
            WIDTH 300 ;
            HEIGHT 150 
    END WINDOW
 
    ACTIVATE WINDOW Win_1
 
Return
   


El Control IMAGE

El control Image permite mostrar imágenes desde archivos .bmp .ico .gif .jpg o .emf

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 14 - Testeo de Image' ;
        MAIN 
               
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Cambiar el contenido del Image' ACTION  Win_1.Image_1.Picture := 'Open.Bmp'
             ITEM 'Recuperar contenido del Image' ACTION  MsgInfo ( Win_1.Image_1.Picture )
           END POPUP
        END MENU
        
               @ 10,10 IMAGE Image_1 ;
            PICTURE 'Demo.Bmp' ;
            WIDTH 90 ;
            HEIGHT 90
    END WINDOW
    ACTIVATE WINDOW Win_1
Return
   


El Control ProgressBar

El control ProgressBar permite mostrar el estado de ejecución de una operación

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 15 - Testeo del ProgressBar' ;
        MAIN 
               
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Testeo del ProgressBar' ACTION  DoTest()
           END POPUP
        END MENU
        @ 10,10 PROGRESSBAR Progress_1 ;
            RANGE 0 , 65535
    END WINDOW
 
    ACTIVATE WINDOW Win_1
 
Return
 
Procedure DoTest()
Local i
 
    For i = 0 To 65535 Step 25
        Win_1.Progress_1.Value := i
    Next i
 
Return
 
Procedure DoTest()
Local i
 
    For i = 0 To 65535 Step 25
        Win_1.Progress_1.Value := i
    Next i
 
Return
   


El Control Spinner

Una manera alternada de obtener datos numéricos es mediante el control Spinner. Consiste en un textbox con dos flechas que permiten cambiar el valor de los controles usando el ratón.

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 16 - Testeo del Spinner' ;
        MAIN
               
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Cambiar el valor del Spinner' ACTION  Win_1.Spinner_1.Value := 8
             ITEM 'Recuperar valor del Spinner' ACTION  MsgInfo ( Str( Win_1.Spinner_1.Value ) ) 
           END POPUP
        END MENU
               
        @ 10,10 SPINNER Spinner_1 ;
            RANGE 0,10 ;
            VALUE 5 ;
            WIDTH 100 
 
    END WINDOW
    ACTIVATE WINDOW Win_1
Return
   



El Control TAB

 

Usar TABs permite organizar los controles y ahorrar espacio agrupándolos en carpetas.

 

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 250 ;
        TITLE 'Tutor 17 - Testeo del Tab' ;
        MAIN
               
        DEFINE MAIN MENU
           POPUP "Primer Popup"
             ITEM 'Change Tab Value' ACTION  Win_1.Tab_1.Value := 2
             ITEM 'Retrieve Tab Value' ACTION  MsgInfo ( Str(Win_1.Tab_1.Value) )
           END POPUP
        END MENU
               
        DEFINE TAB Tab_1 ;
            AT 10,10 ;
            WIDTH 350 ;
            HEIGHT 150 
 
            PAGE 'Page 1'
                @ 50,50 LABEL Label_1 VALUE 'Esta es la página 1'
            END PAGE
 
            PAGE 'Page 2' 
                @ 50,50 LABEL Label_2 VALUE 'Esta es la página 2'
            END PAGE
 
        END TAB
 
    END WINDOW
 
    ACTIVATE WINDOW Win_1
 
Return
   


El Control TOOLBAR

 

Los Toolbars se usan para agrupar botones de comando en una barra que se localiza generalmente en la parte superior de la ventana (debajo de la barra de menú.

 

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 640 HEIGHT 480 ;
        TITLE 'Tutor 18 - Testeo del ToolBar' ;
        MAIN ;
        FONT 'Arial' SIZE 10 
 
        DEFINE MAIN MENU 
            POPUP '&Archivo'
                ITEM '&Desabilitado ToolBar Button' ACTION Win_1. ToolBar_1.Button_1.Enabled := .F.
                ITEM '&Habilitado' ToolBar Button' ACTION Win_1. ToolBar_1.Button_1.Enabled := .T.
                ITEM '&Salida' ACTION Win_1.Release
            END POPUP
        END MENU
 
        DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 80,80 FLAT BORDER
 
            BUTTON Button_1 ;
                CAPTION '&Butón &1' ;
                PICTURE 'button1.bmp' ;
                ACTION MsgInfo('Click! 1')
 
            BUTTON Button_2 ;
                CAPTION '&Butón 2' ;
                PICTURE 'button2.bmp' ;
                ACTION MsgInfo('Click! 2') ;
                SEPARATOR
 
            BUTTON Button_3 ;
                CAPTION 'Butón &3' ;
                PICTURE 'button3.bmp' ;
                ACTION MsgInfo('Click! 3')
 
        END TOOLBAR
 
    END WINDOW
    CENTER WINDOW Win_1
    ACTIVATE WINDOW Win_1
Return Nil
   


El Control Statusbar

 

Este control crea una barra en la parte inferior de la ventana, usada generalmente para mostrar información de estado.

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 400 ;
        HEIGHT 200 ;
        TITLE 'Tutor 19 - Testeo del Tab' ;
        MAIN
               
        DEFINE MAIN MENU 
            POPUP '&Testeo del StatusBar'
                ITEM 'Definir Status Item 1' ACTION Win_1.StatusBar.Item(1) := "Nuevo valor 1"
                ITEM 'Definir Status Item 2' ACTION Win_1.StatusBar.Item(2) := "Nuevo valor 2"
            END POPUP
        END MENU
               
        DEFINE STATUSBAR 
            STATUSITEM "Item 1" ACTION MsgInfo('Clickeo 1 !') 
            STATUSITEM "Item 2" WIDTH 100 ACTION MsgInfo('Clickeo 2 !')
            CLOCK 
            DATE 
            STATUSITEM "Item 5" WIDTH 100
        END STATUSBAR
 
    END WINDOW
 
    ACTIVATE WINDOW Win_1
 
Return
   


Controles de Datos I: DATA-BOUND GRID

Los controles de datos están diseñados para trabajar con datos en archivos .dbf directamente.

El control Grid, permite mostrar o editar registros de bases de datos en forma tabular. La propiedad 'recno' se usa para establecer u obtener el número de registro seleccionado (recno()).

 
#include "hmg.ch"
 
Function Main
 
OpenTables()
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 640 HEIGHT 480 ;
        TITLE 'Tutor 20 - Testeo del GRID' ;
        MAIN NOMAXIMIZE 
 
        DEFINE MAIN MENU 
            POPUP 'File'
                ITEM 'Definir el RecNo del Grid' ACTION Win_1.Grid_1.Value := Val ( InputBox ('Set Grid RecNo','') )
                ITEM 'Obtener el RecNo del Grid' ACTION MsgInfo ( Str ( Win_1.Grid_1.RecNo ) )
                SEPARATOR
                ITEM 'Exit' ACTION Win_1.Release
            END POPUP
            POPUP 'Ayuda'
                ITEM 'Sobre el programa' ACTION MsgInfo ("Tutor 20 - GRID Test") 
            END POPUP
        END MENU
 
        @ 10,10 GRID Grid_1 ;
            WIDTH 610 ;
            HEIGHT 390 ; 
            HEADERS { 'Código' , 'Primer Nombre' , 'Apellido', 'Fecha Nacimiento', 'Casado' , 'Biografia' } ;
            WIDTHS { 150 , 150 , 150 , 150 , 150 , 150 } ;
            ROWSOURCE "Test" ;
            COLUMNFIELDS { 'Code' , 'First' , 'Last' , 'Birth' , 'Married' , 'Bio' } ;
            ALLOWDELETE ;
            ALLOWEDIT
 
    END WINDOW
 
    CENTER WINDOW Win_1
 
    ACTIVATE WINDOW Win_1
 
Return Nil
 
Procedure OpenTables()
    Use Test
    Win_1.Browse_1.Value := RecNo() 
Return Nil
 
Procedure CloseTables()
    Use
Return Nil
   


Controles de Datos II: TEXTBOX, DATEPICKER, CHECKBOX, EDITBOX

Las versiones de estos controles para el manejo directo de datos almacenados en archivos .dbf, requiere el uso de las siguientes propiedades y métodos:

Propiedad "Field": Establece el campo al cual el control está enlazado.
Método "Refresh" : Actualiza el contenido del control baseandose en el contenido actual del campo.
Método "Save": Actualiza el archivo de base de datos de acuerdo al contenido del control.

 

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 640 ;
        HEIGHT 480 ;
        TITLE 'Tutor 21 - Testeo de los controles Data-Bound' ;
        MAIN ;
        ON INIT OpenTables() ;
        ON RELEASE CloseTables()
 
        DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 100,30 FLAT RIGHTTEXT BORDER
 
            BUTTON TOP ;
                CAPTION '&Inicio' ;
                PICTURE 'primero.bmp' ;
                ACTION ( DbGoTop() , Refresh() )
 
            BUTTON PREVIOUS ;
                CAPTION '&Anterior';
                PICTURE 'anterior.bmp' ;
                ACTION ( DbSkip(-1) , Refresh() )
 
            BUTTON NEXT ;
                CAPTION '&Próximo';
                PICTURE 'siguiente.bmp' ;
                ACTION ( DbSkip(1) , if ( eof() , DbGoBottom() , Nil ) , Refresh() )
 
            BUTTON BOTTOM ;
                CAPTION '&Ultimo' ;
                PICTURE 'ultimo.bmp' ;
                ACTION ( DbGoBottom() , Refresh() )
 
            BUTTON SAVE ;
                CAPTION '&Guardar' ;
                PICTURE 'guardar.bmp' ;
                ACTION ( Save() , Refresh() )
 
            BUTTON UNDO ;
                CAPTION '&Desahacer' ;
                PICTURE 'deshacer.bmp' ;
                ACTION ( Refresh() )
 
        END TOOLBAR
 
        @ 50,10 LABEL LABEL_1 VALUE 'Código:'
        @ 80,10 LABEL LABEL_2 VALUE 'Primer Nombre'
        @ 110,10 LABEL LABEL_3 VALUE 'Apellido'
        @ 140,10 LABEL LABEL_4 VALUE 'Fecha Nacimiento:'
        @ 170,10 LABEL LABEL_5 VALUE 'Casado:'
        @ 200,10 LABEL LABEL_6 VALUE 'Bio:'
 
        @ 50,200 TEXTBOX TEXT_1;
            FIELD TEST->CODE ;
            NUMERIC ;
            MAXLENGTH 10
 
        @ 80,200 TEXTBOX TEXT_2;
            FIELD TEST->FIRST ;
            MAXLENGTH 30
 
        @ 110,200 TEXTBOX TEXT_3;
            FIELD TEST->LAST ;
            MAXLENGTH 30
 
        @ 140,200 DATEPICKER DATE_4 ;
            FIELD Test->Birth
 
        @ 170,200 CHECKBOX CHECK_5 ;
            CAPTION '' ;
            FIELD Test->Married 
 
        @ 200,200 EDITBOX EDIT_6 ;
            FIELD Test->Bio ;
            HEIGHT 100
 
    END WINDOW
 
    Win_1.Text_1.SetFocus
 
    ACTIVATE WINDOW Win_1
 
Return Nil
 
Procedure Refresh
 
    Win_1.Text_1.Refresh
    Win_1.Text_2.Refresh
    Win_1.Text_3.Refresh
    Win_1.Date_4.Refresh
    Win_1.Check_5.Refresh
    Win_1.Edit_6.Refresh
    Win_1.Text_1.SetFocus
 
Return
 
Procedure Save
 
    Win_1.Text_1.Save
    Win_1.Text_2.Save
    Win_1.Text_3.Save
    Win_1.Date_4.Save
    Win_1.Check_5.Save
    Win_1.Edit_6.Save
 
Return
 
Procedure OpenTables 
    USE TEST
Return
 
Procedure CloseTables
    USE
Return
   


El Control SPLITBOX

 

Los controles o ventanas definidos como parte de este contenedor pueden ser ordenados por el usuario usando una "barra de arrastre" ubicada su izquierda. Debe omitirse  '@ <row>,<col>' en la definición del control.

 
#include "hmg.ch"
 
Function Main
 
    DEFINE WINDOW Win_1 ;
        AT 0,0 ;
        WIDTH 640 HEIGHT 450 ;
        TITLE 'Tutor 22 - Testeo del SplitBox' ;
        MAIN 
 
        DEFINE SPLITBOX 
 
            LISTBOX List_1 ;
                WIDTH 200 ;
                HEIGHT 400 ;
                ITEMS {'Item 1','Item 2','Item 3','Item 4','Item 5'} ;
                VALUE 3 ;
                TOOLTIP 'ListBox 1' 
 
            EDITBOX Edit_1 ;
                WIDTH 200 ;
                HEIGHT 400 ;
                VALUE 'EditBox!!' ;
                TOOLTIP 'EditBox' ;
                MAXLENGTH 255 
 
        END SPLITBOX
 
    END WINDOW
 
    CENTER WINDOW Win_1
 
    ACTIVATE WINDOW Win_1
 
Return Nil