Controles Nativos de Plataforma
La pestania Win32 / Cocoa / GTK3 proporciona controles complejos que se asignan directamente a los widgets nativos avanzados de cada plataforma. Estos controles ofrecen funcionalidad rica con integracion completa del sistema operativo.
TTabControl CT_TABCONTROL = 33
Contenedor de paginas con pestanas. Cada pestana alberga un panel de controles, permitiendo interfaces multipagina.
| Propiedad | Tipo | Valor predet. | Descripcion |
nTabIndex | Numerico | 0 | Pestana activa actualmente (base 0) |
nTabCount | Numerico | 0 | Numero de pestanas (solo lectura) |
nTabPosition | Numerico | 0 | 0=Arriba, 1=Abajo, 2=Izquierda, 3=Derecha |
lHotTrack | Logico | .F. | Resaltar pestanas al pasar el mouse |
| Evento | Categoria | Descripcion |
OnChange | Accion | Pestana activa cambiada |
OnChanging | Accion | La pestana esta a punto de cambiar (se puede cancelar) |
| Plataforma | Widget Nativo |
| Windows | WC_TABCONTROL (SysTabControl32) |
| macOS | NSTabView |
| Linux | GtkNotebook |
// Crear un formulario con pestanas
@ 10, 10 TABCONTROL oTab OF oForm SIZE 400, 300
oTab:AddTab( "General" )
oTab:AddTab( "Detalles" )
oTab:AddTab( "Notas" )
TTreeView CT_TREEVIEW = 20
Visualizacion de arbol jerarquico con nodos expandibles/colapsables. Ideal para exploradores de archivos, arboles de categorias y organigramas.
| Propiedad | Tipo | Valor predet. | Descripcion |
lShowLines | Logico | .T. | Mostrar lineas conectoras entre nodos |
lShowButtons | Logico | .T. | Mostrar botones de expandir/colapsar |
lCheckBoxes | Logico | .F. | Mostrar casillas de verificacion junto a los elementos |
lSorted | Logico | .F. | Ordenar nodos automaticamente por orden alfabetico |
oSelected | TreeNode | NIL | Nodo seleccionado actualmente |
| Evento | Categoria | Descripcion |
OnChange | Accion | Nodo seleccionado cambiado |
OnExpanding | Accion | Nodo a punto de expandirse |
OnCollapsing | Accion | Nodo a punto de colapsarse |
OnDblClick | Accion | Doble clic en nodo |
OnEdited | Accion | Etiqueta del nodo editada |
| Plataforma | Widget Nativo |
| Windows | WC_TREEVIEW (SysTreeView32) |
| macOS | NSOutlineView |
| Linux | GtkTreeView (modelo de arbol) |
// Construir un arbol de categorias
@ 10, 10 TREEVIEW oTree OF oForm SIZE 200, 300
oRoot := oTree:AddItem( "Productos" )
oRoot:AddChild( "Electronica" )
oRoot:AddChild( "Ropa" )
oRoot:Expand()
TListView CT_LISTVIEW = 21
Lista multi-columna en modo informe (LVS_REPORT). Cada item es una fila con N celdas; las cabeceras vienen definidas por aColumns.
| Propiedad | Tipo | Valor predet. | Descripcion |
aColumns | Array | {"Column1","Column2","Column3"} | Cabeceras de columna (max 8) |
aItems | Array | {} | Filas; cada elemento es array de cadenas, una por columna (max 64 filas) |
aImages | Array | {} | Rutas a PNG/ICO para ImageList (max 16); requerido para modos Icon/SmallIcon |
nViewStyle | Numerico | 2 | 0=Icono, 1=Lista, 2=Informe, 3=IconoPeq |
| Metodo | Descripcion |
SetColumns( aCols ) | Define cabeceras desde array de cadenas |
SetItems( aRows ) | Reemplaza todas las filas; SetItems({}) limpia |
AddItem( aCells ) | Anade una fila al final |
SetImages( aPaths ) | Carga PNG/ICO en ImageList 32x32 + 16x16; row N usa icono N % count |
| Evento | Categoria | Descripcion |
OnClick | Accion | Click en item |
OnDblClick | Accion | Doble click en item |
OnColumnClick | Accion | Click en cabecera (para ordenar) |
OnChange | Accion | Cambio de seleccion |
| Plataforma | Widget Nativo |
| Windows | WC_LISTVIEW (SysListView32) con LVS_REPORT + LVS_EX_FULLROWSELECT|GRIDLINES |
| macOS | NSTableView multi-columna |
| Linux | GtkTreeView + GtkListStore |
Sintaxis xBase
// Definir ListView con 3 columnas
@ 50, 20 LISTVIEW oLV OF oForm SIZE 480, 250 ;
COLUMNS "Nombre", "Edad", "Ciudad"
oLV:AddItem( { "Alice", "30", "New York" } )
oLV:AddItem( { "Bob", "25", "Los Angeles" } )
oLV:AddItem( { "Charlie", "40", "Chicago" } )
Editar en el Inspector
Al seleccionar un control TListView en el diseñador, el inspector expone dos propiedades editables:
- aColumns — pulsar el boton
... abre el editor de array. Una columna por linea.
- aItems — pulsar el boton
... abre el ListView Items Editor: una rejilla con las cabeceras de aColumns, una fila por item, doble click sobre cualquier celda para editarla en sitio. Botones + Add / - Del / Up / Down para gestionar filas. Enter confirma, Esc cancela.
El generador de codigo emite el comando @ ... LISTVIEW ... COLUMNS ... seguido de un :AddItem({...}) por cada fila.
Formato de almacenamiento
Internamente las propiedades aColumns y aItems se serializan como cadenas:
aColumns: cabeceras separadas por | — ej. "Nombre|Edad|Ciudad"
aItems: filas separadas por |, celdas dentro de cada fila por ; — ej. "Alice;30;NY|Bob;25;LA"
Modos de visualizacion
La propiedad nViewStyle aparece en el inspector como dropdown con los valores enumerados (vsIcon, vsList, vsReport, vsSmallIcon). Cambiar el valor en runtime refresca el control inmediatamente. Los modos Icon y SmallIcon requieren un ImageList asociado para mostrar iconos.
Editar imagenes en el Inspector
La propiedad aImages abre un dialogo dedicado ListView Images Editor al pulsar ...: lista de rutas + botones + Add (file picker .png/.ico/.bmp), - Del, Up, Down. Las imagenes se cargan en runtime via GDI+, escaladas a 32x32 (vsIcon) y 16x16 (vsSmallIcon). Asignacion por fila es round-robin: row[N]:icono = aImages[N mod len(aImages)].
// Definir ListView con iconos
@ 50, 20 LISTVIEW oLV OF oForm SIZE 480, 250 ;
COLUMNS "Nombre", "Edad" ;
ITEMS "Alice;30", "Bob;25" ;
IMAGES "user.png", "admin.png"
oLV:nViewStyle := 0 // Modo Icon: muestra PNGs 32x32
TProgressBar CT_PROGRESSBAR = 22
Indicador visual del progreso de una operacion. Soporta modos determinista (porcentaje) e indeterminado (marquesina).
| Propiedad | Tipo | Valor predet. | Descripcion |
nMin | Numerico | 0 | Valor minimo |
nMax | Numerico | 100 | Valor maximo |
nPosition | Numerico | 0 | Valor de progreso actual |
lMarquee | Logico | .F. | Modo indeterminado (animado) |
| Plataforma | Widget Nativo |
| Windows | PROGRESS_CLASS (msctls_progress32) |
| macOS | NSProgressIndicator |
| Linux | GtkProgressBar |
// Barra de progreso para procesamiento de archivos
@ 200, 20 PROGRESSBAR oProgress OF oForm SIZE 300, 20 RANGE 0, 100
oProgress:nPosition := 45
TRichEdit CT_RICHEDIT = 23
Editor de texto enriquecido que soporta negrita, cursiva, subrayado, colores, fuentes y formateo de parrafos (RTF).
| Propiedad | Tipo | Valor predet. | Descripcion |
cText | String | "" | Contenido de texto plano |
cRTFText | String | "" | Contenido de texto enriquecido (RTF) |
lReadOnly | Logico | .F. | Impedir edicion |
lWordWrap | Logico | .T. | Ajustar lineas largas |
nSelStart | Numerico | 0 | Posicion de inicio de seleccion |
nSelLength | Numerico | 0 | Longitud de seleccion |
| Evento | Categoria | Descripcion |
OnChange | Accion | Contenido cambiado |
OnSelChange | Accion | Seleccion cambiada |
OnKeyDown | Teclado | Tecla presionada |
| Plataforma | Widget Nativo |
| Windows | RICHEDIT_CLASS (RichEdit20W) |
| macOS | NSTextView (RTF habilitado) |
| Linux | GtkTextView (con marcado Pango) |
TTrackBar CT_TRACKBAR = 34
Control deslizante para seleccionar un valor numerico dentro de un rango. Usado para volumen, zoom y ajustes similares.
| Propiedad | Tipo | Valor predet. | Descripcion |
nMin | Numerico | 0 | Valor minimo |
nMax | Numerico | 100 | Valor maximo |
nPosition | Numerico | 0 | Posicion actual del deslizador |
nTickFreq | Numerico | 1 | Frecuencia de marcas |
lHorizontal | Logico | .T. | Orientacion horizontal |
| Evento | Categoria | Descripcion |
OnChange | Accion | Posicion del deslizador cambiada |
| Plataforma | Widget Nativo |
| Windows | TRACKBAR_CLASS (msctls_trackbar32) |
| macOS | NSSlider |
| Linux | GtkScale |
TUpDown CT_UPDOWN = 35
Boton giratorio (flechas arriba/abajo) normalmente asociado con un control de edicion para entrada numerica.
| Propiedad | Tipo | Valor predet. | Descripcion |
nMin | Numerico | 0 | Valor minimo |
nMax | Numerico | 100 | Valor maximo |
nPosition | Numerico | 0 | Valor actual |
nIncrement | Numerico | 1 | Incremento por paso |
oBuddy | Control | NIL | Control de edicion asociado |
lWrap | Logico | .F. | Volver de maximo a minimo |
| Evento | Categoria | Descripcion |
OnChange | Accion | Valor cambiado (clic arriba/abajo) |
| Plataforma | Widget Nativo |
| Windows | UPDOWN_CLASS (msctls_updown32) |
| macOS | NSStepper |
| Linux | GtkSpinButton |
TDateTimePicker CT_DATETIMEPICKER = 36
Selector de fecha y/u hora con calendario desplegable. Proporciona formateo consciente de la configuracion regional.
| Propiedad | Tipo | Valor predet. | Descripcion |
dValue | Date | Date() | Fecha/hora seleccionada |
dMinDate | Date | NIL | Fecha minima seleccionable |
dMaxDate | Date | NIL | Fecha maxima seleccionable |
cFormat | String | "" | Formato de visualizacion personalizado (ej. "yyyy-MM-dd") |
nKind | Numerico | 0 | 0=Fecha, 1=Hora, 2=FechaHora |
| Evento | Categoria | Descripcion |
OnChange | Accion | Fecha/hora seleccionada cambiada |
OnDropDown | Accion | Calendario desplegable abierto |
OnCloseUp | Accion | Calendario desplegable cerrado |
| Plataforma | Widget Nativo |
| Windows | DATETIMEPICK_CLASS (SysDateTimePick32) |
| macOS | NSDatePicker |
| Linux | GtkCalendar + GtkPopover |
// Selector de fecha para fecha de factura
@ 80, 120 DATETIMEPICKER oDtp OF oForm SIZE 150, 24
oDtp:cFormat := "dd/MM/yyyy"
TMonthCalendar CT_MONTHCALENDAR = 37
Control de calendario mensual en linea. Muestra una cuadricula completa del mes para seleccion de fecha.
| Propiedad | Tipo | Valor predet. | Descripcion |
dValue | Date | Date() | Fecha seleccionada |
dMinDate | Date | NIL | Fecha minima seleccionable |
dMaxDate | Date | NIL | Fecha maxima seleccionable |
lMultiSelect | Logico | .F. | Permitir seleccionar un rango de fechas |
lShowToday | Logico | .T. | Resaltar la fecha de hoy |
| Evento | Categoria | Descripcion |
OnSelect | Accion | Fecha seleccionada |
OnSelChange | Accion | Rango de seleccion cambiado |
| Plataforma | Widget Nativo |
| Windows | MONTHCAL_CLASS (SysMonthCal32) |
| macOS | NSDatePicker (NSClockAndCalendarDatePickerStyle) |
| Linux | GtkCalendar |
9 Controles Nativos de Plataforma
Estos controles utilizan widgets avanzados especificos del sistema operativo para maxima apariencia nativa. HarbourBuilder asigna automaticamente cada control al widget correcto en Windows (Win32), macOS (Cocoa) y Linux (GTK3).