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.

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.

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).

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).