Novedades en FWH 26.08
Resumen de FiveWin for Harbour/xHarbour versión 26.08 (agosto 2026).
Ver también whatsnew.txt en la raíz de FWH para el registro día a día.
Totales de TXBrowse en diálogos de recurso
Nuevo sample samples/ui/xbrowse/brwfooter.prg (+
brwfooter.rc): muestra cómo colocar un TXBrowse con totales
en el pie dentro de un diálogo creado desde un recurso binario
(CreateFromResource()): activar la fila de totales con
oBrw:lFooter := .T., poner nFooterType := AGGR_SUM
en cada columna numérica, cargar los datos con
SetArray( aData, .T. ) antes de configurar las
columnas (SetArray con .T. regenera aCols) y llamar a
MakeTotals().
Dos trampas documentadas: el control del .rc debe usar la clase de
ventana "TXBrowse" (registrada por
CreateFromResource()); clases como RichEdit20W
cuya DLL no está cargada hacen que DialogBox() falle con
"Cannot create Dialog Box". Y los bloques bStrData deben usar
oBrw:nArrayAt — no oBrw:nAt — porque nAt llama
a ColAtPos() antes de que exista ::aDisplay durante
INITIATE/ADJUST.
xHarbour Commercial: externos no resueltos corregidos
Al enlazar FWH 26.08 con xHarbour Commercial fallaba con
Unresolved external _HB_FUN_FW_PALBMPREGISTER /
_HB_FUN_FW_PALBMPUNREGISTER (referenciados desde
Fivehmx.lib(bitmap.obj)) y
_HB_FUN_WEBVIEW2_SETBACKGROUNDCOLOR
(Fivehmx.lib(twebview2.obj)).
lib\Fivehcm.lib (la lib C para xHB Commercial, VC98) estaba
obsoleta: era anterior a source/internal/fwpalctl.c
(FW_PalBmpRegister / FW_PalBmpUnregister, usados
por el TBitmap con paleta) y al nuevo
WebView2_SetBackgroundColor() de
source/winapi/webview2.c. La lib se ha reconstruido con
makes/build_fivehcm.ps1. También se corrigen dos bugs que
bloqueaban esa reconstrucción: include/xhbcompat.h usaba
HB_EXTERN_BEGIN y long long aunque se incluye
forzado (-FI) antes de hbapi.h (VC98, C89), y
source/internal/twebview/cwebview.cpp usaba
INVALID_FILE_ATTRIBUTES, que el SDK de VC98 no define.
Verificado: makes/xhb_commercial/go.bat enlaza
test.exe sin externos sin resolver.
TOpenCode — modelos free (OpenCode Zen)
Nueva clase TOpenCode (source/classes/topencode.prg):
API Zen sin clave (Bearer public). Modelos
hy3-free, mimo-v2.5-free,
deepseek-v4-flash-free, etc. Send /
SendWithSystem síncronos; SendAsync /
SendWithSystemAsync con hb_threadStart
(compilar con mt). Si hay rate limit, prueba otro modelo.
Ficheros temp únicos y escritura atómica para varios agentes a la vez.
samples/ai/opencode1.prg— 3 agentes en paralelosamples/ai/opencode2.prg+opencode2.html— TWebView2 estilo WhatsApp (agentes a la izquierda, chat a la derecha)
cd samples\ai
build_new.bat opencode2 hb32 mt
Ver TOpenCode.
libcurl estático + equipos de agentes en opencode2
TOpenCode habla HTTP con hbcurl y un
libcurl estático (Schannel): ya no hace falta distribuir
libcurl.dll. La carpeta 3rdparty/ guarda los
fuentes de curl (curl.tgz, curl-src/) y los
scripts .bat que construyen lib/libcurl_static*.{lib,a}
para bcc32, bcc64, msvc32, msvc64 y gcc.
samples/ai/opencode2.prg es ahora un equipo de agentes:
"New team" diseña un equipo especializado según la actividad; los
agentes se consultan entre sí con etiquetas [[ASK:Nombre]]
y siguen el protocolo saludo → tema → rondas → propuesta.
Los reintentos usan backoff con cooldown y fallback adaptativo (primero
el último modelo que respondió); si la cadena Zen se agota, cae a un
modelo local vía Ollama (ollama:<modelo> en
127.0.0.1:11434). Los envíos en curso se guardan en
opencode2.json y se reanudan al reiniciar.
FWH64: TC5ImgList / TVMenu en Five64.a
TC5ImgList, TVMenu y TVItem se
añadieron a fwh.hbp el 20 de junio de 2026 (32 bits y
MSVC64) pero nunca a makes/hb_bcc64/prg_list.txt. FWH64
(Five64.a / Fivexh64.a) enlazaba sin esas
clases: VMenu fallaba con “Class TC5ImgList not found” y en 32 bits
iba bien.
Los tres PRG están ahora en la lista BCC64. El sample
samples/test/vmenu_test.prg compila y arranca con
build_new.bat vmenu_test hb64. En FWH64 de junio/julio:
compilar source/classes/tc5imglst.prg en la aplicación.
Ver TVMenu.
TXBrowse:bLClicked después de BookMark
TXBrowse:LButtonDown() evalúa bLClicked
una sola vez, después del cambio de fila
(Skip() / BookMark). El arreglo de abril 2026
del doble disparo ejecutaba el bloque antes del movimiento, así que
oBrw:BookMark seguía siendo el registro anterior. Las
columnas SetCheck() tipo radio que hacen
nSelectedRow := oBrw:BookMark en bLClicked
marcaban la fila actual vieja, no la clicada.
bLClicked sigue nileándose alrededor de
Super:LButtonDown() para que TControl / TWindow no lo
evalúen otra vez. Sample: samples/system/xbrwin7c.prg. Ver
TXBrowse bLClicked.
samples/test/testblur.prg — blur con JPG/PNG
samples/test/testblur.prg demuestra el efecto de la librería FWH
Blur( hBitmap, nRadius ) (box blur, 0–100, en
source/internal/ribbon.c). Antes solo cargaba BMP con
PalBmpRead y duplicaba el C en un #pragma BEGINDUMP.
Ahora carga imágenes habituales, muestra un slider horizontal visible bajo la
imagen y enlaza Blur() desde FiveHC / FiveC (sample solo PRG;
Win32 hb_retnl, Win64 hb_retnll).
- Formatos: BMP, JPG/JPEG, PNG (y otros soportados por
FW_ReadImage/ FreeImage / GDI+) - UI:
DEFINE DIALOGconPIXEL TRUEPIXELpara que imagen y controles usen la misma rejilla en píxeles; sinTRUEPIXEL, los controles PIXEL pueden quedar fuera del template del diálogo y no verse - Slider: TSlider horizontal bajo el bitmap (0–100); valor junto a la etiqueta “Blur:”
- API:
Blur( hBmp, nRadius )de la librería C FWH — sin C embebido en el sample - CLI:
testblur.exe ruta\a\imagen.jpgomite el diálogo de fichero si la ruta existe
cd samples\test
build_new.bat testblur hb32
testblur.exe
:: o: testblur.exe C:\ruta\foto.jpg
Relacionado: FW_ReadImage() / PalBmpDraw(),
source/internal/ribbon.c (HB_FUNC( BLUR )), y el sample
samples\test\testblu2.prg (blur sobre fondo de XBrowse).