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.
xHarbour Commercial: unresolved externals fixed
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.
samples/ai/opencode1.prg— three agents in parallelsamples/ai/opencode2.prg+opencode2.html— TWebView2 WhatsApp-style designer (agents left, chat right, add/edit roles)
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).
- Formats: BMP, JPG/JPEG, PNG (and other types supported by
FW_ReadImage/ FreeImage / GDI+ fallbacks) - UI: code-created
DEFINE DIALOGwithPIXEL TRUEPIXELso the image and controls share the same pixel grid; withoutTRUEPIXEL, PIXEL controls can land outside the dialog template and disappear - Slider: horizontal TSlider under the bitmap (0–100); value shown next to the label “Blur:”
- API:
Blur( hBmp, nRadius )from the FWH C library — no embedded C in the sample - CLI:
testblur.exe path\to\image.jpgskips the file dialog when the path exists
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).