What's New in FWH 26.08

Highlights of FiveWin for Harbour/xHarbour version 26.08 (August 2026). See also whatsnew.txt in the FWH root for the full day-by-day log.

TGraph auto-refresh + KPI browse sample

TGraph repaints itself when the data changes (source/classes/tgraph.prg): new lAutoRefresh DATA (.T. by default). Any change through AddSerie, SetYVals, SelSerie, SelPeriod, aTable, ResizeSerie, SetValue, SetSerieValues, SetData, SetXYValue, SetXYData, DelSerie or ClearSeries triggers DoRefresh() automatically. Group batch updates with BeginUpdate() ... EndUpdate() for a single repaint, or set lAutoRefresh := .F. and refresh manually with Update(). Direct assignments to ::aData / ::aSeries cannot be intercepted — use the Set*() methods or call Refresh() afterwards. Docs: en/es/pt ui/tgraph.html#auto-refresh.

New sample samples/graphics/graphkpi.prg: two TXBrowse controls (contexts + prompts) with KPI columns and footer totals, a docked buttonbar on top, a statusbar with the selected KPIs, and a splitter-resizable TGraph that follows navigation and metric changes without rebuilding the control. Reminder: code-created browses need oBrw:CreateFromCode().

TXBrowse footers in resource dialogs

New sample samples/ui/xbrowse/brwfooter.prg (+ brwfooter.rc) shows how to place a TXBrowse with footer totals inside a dialog created from a binary resource (CreateFromResource()): enable the footer row with oBrw:lFooter := .T., set nFooterType := AGGR_SUM on each numeric column, load the data with SetArray( aData, .T. ) before configuring the columns (SetArray with .T. regenerates aCols) and call MakeTotals().

Two pitfalls are documented: the control in the .rc must use window class "TXBrowse" (registered by CreateFromResource()); classes like RichEdit20W whose DLL is not loaded make DialogBox() fail with "Cannot create Dialog Box". And column data blocks should use oBrw:nArrayAt — not oBrw:nAt — because nAt calls ColAtPos() before ::aDisplay exists during INITIATE/ADJUST.

Numeric formatting: do not set bStrData on numeric array columns. The default bStrData (ArrCell) applies oCol:cEditPicture to data cells; a custom block returning the raw number is displayed with plain Str() and the picture is ignored. Footer totals are unaffected either way, because MakeTotals() reads the raw value via bEditValue (::Value), not via bStrData. Use cEditPicture := "999,999,999" for the cells, cFooterPicture for the footer total and nFootStrAlign := AL_RIGHT to right align it.

Linking FWH 26.08 with xHarbour Commercial failed with Unresolved external _HB_FUN_FW_PALBMPREGISTER / _HB_FUN_FW_PALBMPUNREGISTER (referenced from Fivehmx.lib(bitmap.obj)) and _HB_FUN_WEBVIEW2_SETBACKGROUNDCOLOR (Fivehmx.lib(twebview2.obj)).

lib\Fivehcm.lib (the xHB Commercial C lib, VC98) was stale: it predated source/internal/fwpalctl.c (FW_PalBmpRegister / FW_PalBmpUnregister, used by the palette-aware TBitmap) and the new WebView2_SetBackgroundColor() in source/winapi/webview2.c. The lib has been rebuilt with makes/build_fivehcm.ps1. Two bugs that had been blocking the rebuild are fixed as well: include/xhbcompat.h used HB_EXTERN_BEGIN and long long although it is force-included before hbapi.h (VC98, C89), and source/internal/twebview/cwebview.cpp used INVALID_FILE_ATTRIBUTES, which the VC98 SDK does not define. Verified: makes/xhb_commercial/go.bat links test.exe with zero unresolved externals.

TOpenCode — free models (OpenCode Zen)

New class TOpenCode (source/classes/topencode.prg) calls https://opencode.ai/zen/v1/chat/completions with Authorization: Bearer public — no API key. Free models include hy3-free, mimo-v2.5-free and deepseek-v4-flash-free. Sync Send / SendWithSystem; async SendAsync / SendWithSystemAsync via hb_threadStart (build with mt so the linker uses hbvmmt). Rate-limit answers retry another free model. Concurrent async calls use unique oc_<ms>_<seq>.json names and write through a .part file then rename.

cd samples\ai
build_new.bat opencode1 hb32 mt
build_new.bat opencode2 hb32 mt
:: run from samples\ai (libcurl.dll)

See TOpenCode.

Static libcurl + opencode2 team agents

TOpenCode now talks HTTP through hbcurl with a static libcurl (Schannel) — no libcurl.dll to ship. The 3rdparty/ folder keeps the curl sources (curl.tgz, curl-src/) and the batch scripts that build lib/libcurl_static*.{lib,a} for bcc32, bcc64, msvc32, msvc64 and gcc.

samples/ai/opencode2.prg grew into a team-of-agents sample: "New team" designs a specialized team from the activity; agents consult each other with [[ASK:Name]] tags and run a greet → topic → talk → proposal protocol. Retries use backoff with cooldown and adaptive fallback (last good model first); when the Zen free chain is exhausted it falls back to a local model via Ollama (ollama:<model> at 127.0.0.1:11434). Pending sends are persisted to opencode2.json and resumed on restart.

FWH64: TC5ImgList / TVMenu in Five64.a

TC5ImgList, TVMenu and TVItem were added to fwh.hbp on 20 June 2026 (32-bit and MSVC64) but never to makes/hb_bcc64/prg_list.txt. FWH64 (Five64.a / Fivexh64.a) therefore linked without those classes: VMenu failed with “Class TC5ImgList not found” while 32-bit was fine.

The three PRGs are now in the BCC64 list. Sample samples/test/vmenu_test.prg builds and runs with build_new.bat vmenu_test hb64. Older June/July FWH64 work-around: compile source/classes/tc5imglst.prg into the app. See TVMenu.

TXBrowse:bLClicked after BookMark

TXBrowse:LButtonDown() now evaluates bLClicked once, after the row change (Skip() / BookMark). The April 2026 double-fire fix had run the block before the move, so oBrw:BookMark was still the previous record. Radio-style SetCheck() columns that assign nSelectedRow := oBrw:BookMark in bLClicked therefore checked the old current row instead of the clicked one.

bLClicked is still niled around Super:LButtonDown() so TControl / TWindow do not evaluate it a second time. Sample: samples/system/xbrwin7c.prg. See TXBrowse bLClicked.

samples/test/testblur.prg — blur with JPG/PNG

samples/test/testblur.prg demonstrates the FWH library Blur( hBitmap, nRadius ) effect (box blur, 0–100, implemented in source/internal/ribbon.c). It previously loaded only BMP via PalBmpRead and carried a duplicate C #pragma BEGINDUMP. It now loads common image files, shows a visible horizontal slider under the image, and links Blur() from the FiveHC / FiveC libs (pure PRG sample; Win32 uses hb_retnl, Win64 hb_retnll).

cd samples\test
build_new.bat testblur hb32
testblur.exe
:: or: testblur.exe C:\path\to\photo.jpg

Related: FW_ReadImage() / PalBmpDraw(), source/internal/ribbon.c (HB_FUNC( BLUR )), and sample samples\test\testblu2.prg (blur over an XBrowse background).