Arquitectura
HarbourBuilder utiliza una arquitectura en capas que separa limpiamente la logica de la aplicacion del codigo nativo especifico de la plataforma. Este disenio permite que una unica base de codigo .prg produzca aplicaciones nativas en
Windows
macOS
Linux.
Arquitectura de 5 Capas
Cada aplicacion HarbourBuilder fluye a traves de cinco capas, desde la sintaxis xBase de alto nivel hasta las llamadas a la API nativa de la plataforma:
.prg source files"] --> B["2. xBase Commands
#xcommand / #translate (compile-time)"] B --> C["3. Harbour OOP Layer
TForm, TControl, TToolBar, ..."] C --> D["4. HB_FUNC Bridge
UI_FormNew, UI_SetProp, UI_OnEvent"] D --> E1["5a. Win32 API
C++ · CreateWindowEx"] D --> E2["5b. Cocoa / AppKit
Objective-C · NSView"] D --> E3["5c. GTK3
C · GtkWidget"] D --> E4["5d. Android
JNI · android.widget.*"] D --> E5["5e. iOS / UIKit
Objective-C · UIView"] style A fill:#58a6ff,stroke:#388bfd,color:#0d1117 style B fill:#8b5cf6,stroke:#7c3aed,color:#fff style C fill:#f59e0b,stroke:#d97706,color:#0d1117 style D fill:#3fb950,stroke:#2ea043,color:#0d1117 style E1 fill:#0078d4,stroke:#005a9e,color:#fff style E2 fill:#555,stroke:#333,color:#fff style E3 fill:#e95420,stroke:#c34113,color:#fff style E4 fill:#34c759,stroke:#1a8d4d,color:#0d1117 style E5 fill:#007aff,stroke:#005ec4,color:#fff
Backends de Plataforma
Cada capa se asigna a una tecnologia nativa diferente segun la plataforma objetivo:
| Capa | Windows | macOS | Linux | Android | iOS |
|---|---|---|---|---|---|
| Codigo de Aplicacion | Harbour .prg | Harbour .prg | Harbour .prg | Harbour .prg | Harbour .prg |
| Comandos xBase | hbbuilder.ch | hbbuilder.ch | hbbuilder.ch | UI_* directo (re-emitido por el IDE) | UI_* directo (re-emitido por el IDE) |
| Capa OOP | TForm, TControl | TForm, TControl | TForm, TControl | UI_* plano (iter 1, TForm pronto) | UI_* plano (iter 1, TForm pronto) |
| Puente HB_FUNC | C++ (MSVC/MinGW) | Objective-C (Clang) | C (GCC) | C + JNI (NDK Clang) | Objective-C (Xcode Clang) |
| Backend Nativo | Win32 API / GDI+ | Cocoa / AppKit | GTK3 / Cairo | android.widget.* | UIKit / UIView |
| Creacion de Ventanas | CreateWindowEx() | [NSWindow alloc] | gtk_window_new() | FrameLayout en MainActivity | UIView en UIViewController |
| Bucle de Eventos | GetMessage / WndProc | [NSApp run] | gtk_main() | Ciclo de vida de la Activity | UIApplicationMain (controlado por el SO) |
| Dibujo | GDI / GDI+ | Core Graphics | Cairo / Pango | Canvas / Skia | Core Graphics (iOS) |
Sistema de Tipos de Control
Cada componente visual en HarbourBuilder se identifica mediante una constante numerica CT_ definida en
hbide.h. Estas constantes (que van de 0 a 86) determinan como el IDE serializa los controles,
como el disenador los renderiza y que widget nativo crea el backend en tiempo de ejecucion.
| Pestania de Paleta | Rango CT_ | Controles |
|---|---|---|
| Estandar | 0 – 11 | CT_FORM (0), CT_LABEL (1), CT_EDIT (2), CT_BUTTON (3), CT_CHECKBOX (4), CT_COMBOBOX (5), CT_GROUPBOX (6), CT_LISTBOX (7), CT_RADIO (8), CT_TOOLBAR (9), CT_TABCONTROL (10), CT_STATUSBAR (11) |
| Adicionales | 12 – 32 | CT_BITBTN (12), CT_SPEEDBTN (13), CT_IMAGE (14), CT_SHAPE (15), CT_BEVEL (16), CT_SCROLLBOX (17), CT_MASKEDIT (18), CT_STRINGGRID (19), CT_MEMO (24), CT_PANEL (25), CT_SCROLLBAR (26), CT_STATICTEXT (31), CT_LABELEDEDIT (32) |
| Nativo | 20 – 37 | CT_TREEVIEW (20), CT_LISTVIEW (21), CT_PROGRESSBAR (22), CT_RICHEDIT (23), CT_TRACKBAR (34), CT_UPDOWN (35), CT_DATETIMEPICKER (36), CT_MONTHCALENDAR (37) |
| Sistema | 38 – 39 | CT_TIMER (38), CT_PAINTBOX (39) |
| Dialogos | 40 – 45 | CT_OPENDIALOG (40), CT_SAVEDIALOG (41), CT_FONTDIALOG (42), CT_COLORDIALOG (43), CT_FINDDIALOG (44), CT_REPLACEDIALOG (45) |
| IA | 46 – 52 | CT_OPENAI (46), CT_GEMINI (47), CT_CLAUDE (48), CT_DEEPSEEK (49), CT_GROK (50), CT_OLLAMA (51), CT_TRANSFORMER (52) |
| Acceso a Datos | 53 – 61 | CT_DBFTABLE (53), CT_MYSQL (54), CT_MARIADB (55), CT_POSTGRESQL (56), CT_SQLITE (57), CT_FIREBIRD (58), CT_SQLSERVER (59), CT_ORACLE (60), CT_MONGODB (61) |
| Internet | 62, 71 – 78 | CT_WEBVIEW (62), CT_WEBSERVER (71), CT_WEBSOCKET (72), CT_HTTPCLIENT (73), CT_FTPCLIENT (74), CT_SMTPCLIENT (75), CT_TCPSERVER (76), CT_TCPCLIENT (77), CT_UDPSOCKET (78) |
| Hilos | 63 – 70 | CT_THREAD (63), CT_MUTEX (64), CT_SEMAPHORE (65), CT_CRITICALSECTION (66), CT_THREADPOOL (67), CT_ATOMICINT (68), CT_CONDVAR (69), CT_CHANNEL (70) |
| Conscientes de Datos | 79 – 86 | CT_BROWSE (79), CT_DBGRID (80), CT_DBNAVIGATOR (81), CT_DBTEXT (82), CT_DBEDIT (83), CT_DBCOMBOBOX (84), CT_DBCHECKBOX (85), CT_DBIMAGE (86) |
Estructura de Archivos
El proyecto HarbourBuilder esta organizado en directorios claramente separados:
HarbourBuilder/ ├── backends/ │ ├── cocoa/ // Backend Objective-C para macOS │ ├── gtk3/ // Backend GTK3/C para Linux │ ├── win32/ // Backend C++ para Windows │ ├── android/ // Backend JNI + Java para Android │ ├── ios/ // Backend UIKit + Objective-C para iOS │ ├── console/ // Backend TUI de consola │ └── web/ // Backend Web/HTML ├── core/ // Clases OOP de Harbour (TForm, TControl, ...) ├── cpp/ │ ├── include/ // Cabeceras C/C++ (hbide.h con defines CT_) │ └── src/ // Fuentes C++ del IDE (disenador, inspector, editor) ├── docs/ │ ├── assets/ // CSS, JS, imagenes para documentacion │ ├── en/ // Documentacion en ingles │ ├── es/ // Documentacion en espaniol │ └── pt/ // Documentacion en portugues ├── harbour/ // Compilador Harbour y runtime ├── images/ // Iconos y mapas de bits del IDE ├── include/ // Cabeceras Harbour (hbide.ch) ├── resources/ │ └── icons/ // Iconos de la paleta de componentes └── samples/ └── projects/ // Proyectos de ejemplo
Sistema de Eventos
HarbourBuilder enruta los eventos nativos del sistema operativo a traves de una canalizacion unificada que termina en bloques de codigo Harbour definidos por el usuario. El mismo flujo de eventos se aplica en todas las plataformas; solo difiere el punto de entrada (WndProc en Windows, NSResponder en macOS, g_signal en GTK3, UIEvent en iOS).
oBtn:OnClick := { || DoSomething() }. El generador de codigo escribe estas asignaciones automaticamente cuando se hace doble clic en un control en el disenador de formularios.
Herramientas Bidireccionales
HarbourBuilder mantiene una sincronizacion perfecta entre el disenador visual y el codigo fuente. Los cambios en cualquier direccion se reflejan instantaneamente, y las implementaciones METHOD escritas por el usuario nunca se sobrescriben durante la regeneracion de codigo.
(visual)"] -- "drop control /
move / resize" --> B["Code Generator"] B -- "writes .prg" --> C["Source Code
(.prg file)"] C -- "parse changes" --> D["Code Parser"] D -- "updates objects" --> A B -. "preserves METHOD
implementations" .-> C D -. "detects new controls
and properties" .-> A style A fill:#58a6ff,stroke:#388bfd,color:#0d1117 style C fill:#3fb950,stroke:#2ea043,color:#0d1117 style B fill:#f59e0b,stroke:#d97706,color:#0d1117 style D fill:#f59e0b,stroke:#d97706,color:#0d1117
| Direccion | Disparador | Accion |
|---|---|---|
| Disenador → Codigo | Soltar, mover, redimensionar o cambiar una propiedad en el inspector | El generador de codigo reescribe los comandos DEFINE FORM / @, preservando todos los bloques METHOD |
| Codigo → Disenador | Editar el fuente .prg en el editor de codigo y guardar | El analizador de codigo detecta controles nuevos o modificados y actualiza el lienzo del disenador en tiempo real |
Canalizacion de Compilacion
El proceso de compilacion transforma el codigo fuente Harbour en ejecutables nativos a traves de una canalizacion de multiples etapas:
Harbour source"] --> B["Harbour Compiler
(harbour.exe)"] B --> C[".c
Generated C code"] C --> D["C Compiler
(MSVC / Clang / GCC)"] D --> E[".obj / .o
Object files"] E --> F["Linker
(link / ld)"] G["Native Backend
(Win32 / Cocoa / GTK3 / Android JNI / iOS UIKit)"] --> F H["Harbour Runtime
(libharbour)"] --> F F --> I[".exe / app / ELF / APK / .app
Native binary"] style A fill:#58a6ff,stroke:#388bfd,color:#0d1117 style B fill:#8b5cf6,stroke:#7c3aed,color:#fff style C fill:#f59e0b,stroke:#d97706,color:#0d1117 style D fill:#8b5cf6,stroke:#7c3aed,color:#fff style E fill:#f59e0b,stroke:#d97706,color:#0d1117 style F fill:#3fb950,stroke:#2ea043,color:#0d1117 style G fill:#e95420,stroke:#c34113,color:#fff style H fill:#555,stroke:#333,color:#fff style I fill:#3fb950,stroke:#2ea043,color:#0d1117
| Etapa | Windows | macOS | Linux | Android | iOS |
|---|---|---|---|---|---|
| Compilador Harbour | harbour.exe | harbour | harbour | harbour (NDK cross) | harbour (Xcode cross) |
| Compilador C | cl.exe (MSVC) / gcc (MinGW) | clang (Xcode) | gcc / g++ | clang (NDK) | clang (Xcode) |
| Enlazador | link.exe / ld | ld (via clang) | ld (via gcc) | ld (NDK) | ld (via clang) |
| Etapas Extra | — | — | — | aapt2 → javac → d8 → zipalign → apksigner | asset catalog → Info.plist → .app bundle |
| Salida | .exe | Paquete .app | Binario ELF | .apk | Paquete .app |