Novidades no FWH 26.08

Destaques do FiveWin for Harbour/xHarbour versão 26.08 (agosto 2026). Veja também whatsnew.txt na raiz do FWH para o log dia a dia.

TGraph auto-refresh + sample KPI com browse

O TGraph se repinta sozinho quando os dados mudam (source/classes/tgraph.prg): novo DATA lAutoRefresh (.T. por defeito). Qualquer alteração via AddSerie, SetYVals, SelSerie, SelPeriod, aTable, ResizeSerie, SetValue, SetSerieValues, SetData, SetXYValue, SetXYData, DelSerie ou ClearSeries dispara DoRefresh() automaticamente. Agrupa alterações em massa com BeginUpdate() ... EndUpdate() para um único repintado, ou define lAutoRefresh := .F. e refresca à mão com Update(). As atribuições diretas a ::aData / ::aSeries não podem ser interceptadas — usa os métodos Set*() ou chama Refresh() depois. Docs: en/es/pt ui/tgraph.html#auto-refresh.

Novo sample samples/graphics/graphkpi.prg: dois controles TXBrowse (contextos + prompts) com colunas KPI e totais no rodapé, uma buttonbar ancorada no topo, uma barra de estado com os KPIs selecionados e um TGraph redimensionável com splitters que acompanha a navegação e as mudanças de métricas sem refazer o controle. Lembra-te: os browses criados por código precisam de oBrw:CreateFromCode().

Totais do TXBrowse em diálogos de recurso

Novo sample samples/ui/xbrowse/brwfooter.prg (+ brwfooter.rc): mostra como colocar um TXBrowse com totais no rodapé dentro de um diálogo criado a partir de um recurso binário (CreateFromResource()): ativar a linha de totais com oBrw:lFooter := .T., definir nFooterType := AGGR_SUM em cada coluna numérica, carregar os dados com SetArray( aData, .T. ) antes de configurar as colunas (SetArray com .T. regenera aCols) e chamar MakeTotals().

Duas armadilhas documentadas: o controle do .rc deve usar a classe de janela "TXBrowse" (registrada por CreateFromResource()); classes como RichEdit20W cuja DLL não está carregada fazem DialogBox() falhar com "Cannot create Dialog Box". E os blocos bStrData devem usar oBrw:nArrayAt — não oBrw:nAt — porque nAt chama ColAtPos() antes de ::aDisplay existir durante INITIATE/ADJUST.

Formatação numérica: não defina bStrData nas colunas numéricas de array. O bStrData padrão (ArrCell) aplica oCol:cEditPicture às células de dados; um bloco próprio que devolva o número bruto é exibido com Str() e o picture é ignorado. Os totais não são afetados, pois MakeTotals() lê o valor bruto via bEditValue (::Value), não via bStrData. Use cEditPicture := "999,999,999" para as células, cFooterPicture para o total do rodapé e nFootStrAlign := AL_RIGHT para alinhá-lo à direita.

Ao linkar o FWH 26.08 com xHarbour Commercial falhava com Unresolved external _HB_FUN_FW_PALBMPREGISTER / _HB_FUN_FW_PALBMPUNREGISTER (referenciados de Fivehmx.lib(bitmap.obj)) e _HB_FUN_WEBVIEW2_SETBACKGROUNDCOLOR (Fivehmx.lib(twebview2.obj)).

lib\Fivehcm.lib (a lib C para xHB Commercial, VC98) estava desatualizada: era anterior a source/internal/fwpalctl.c (FW_PalBmpRegister / FW_PalBmpUnregister, usados pelo TBitmap com paleta) e ao novo WebView2_SetBackgroundColor() em source/winapi/webview2.c. A lib foi reconstruída com makes/build_fivehcm.ps1. Também foram corrigidos dois bugs que bloqueavam essa reconstrução: include/xhbcompat.h usava HB_EXTERN_BEGIN e long long embora seja incluído forçadamente (-FI) antes de hbapi.h (VC98, C89), e source/internal/twebview/cwebview.cpp usava INVALID_FILE_ATTRIBUTES, que o SDK do VC98 não define. Verificado: makes/xhb_commercial/go.bat linka test.exe sem externos não resolvidos.

TOpenCode — modelos free (OpenCode Zen)

Nova classe TOpenCode (source/classes/topencode.prg): API Zen sem chave (Bearer public). Modelos hy3-free, mimo-v2.5-free, deepseek-v4-flash-free, etc. Send / SendWithSystem síncronos; SendAsync / SendWithSystemAsync com hb_threadStart (compilar com mt). Em rate limit tenta outro modelo. Ficheiros temp únicos e escrita atómica para vários agentes ao mesmo tempo.

cd samples\ai
build_new.bat opencode2 hb32 mt

Ver TOpenCode.

libcurl estático + equipes de agentes no opencode2

TOpenCode fala HTTP com hbcurl e um libcurl estático (Schannel): não é preciso distribuir o libcurl.dll. A pasta 3rdparty/ guarda os fontes do curl (curl.tgz, curl-src/) e os scripts .bat que constroem lib/libcurl_static*.{lib,a} para bcc32, bcc64, msvc32, msvc64 e gcc.

samples/ai/opencode2.prg agora é uma equipe de agentes: "New team" desenha uma equipe especializada a partir da atividade; os agentes se consultam entre si com etiquetas [[ASK:Nome]] e seguem o protocolo saudação → tema → rodadas → proposta. As retentativas usam backoff com cooldown e fallback adaptativo (primeiro o último modelo que respondeu); se a cadeia Zen se esgota, cai para um modelo local via Ollama (ollama:<modelo> em 127.0.0.1:11434). Os envios em curso são gravados em opencode2.json e retomados ao reiniciar.

FWH64: TC5ImgList / TVMenu em Five64.a

TC5ImgList, TVMenu e TVItem entraram em fwh.hbp em 20 de junho de 2026 (32 bits e MSVC64) mas nunca em makes/hb_bcc64/prg_list.txt. O FWH64 (Five64.a / Fivexh64.a) ligava sem essas classes: VMenu falhava com “Class TC5ImgList not found” e no 32 bits funcionava.

Os três PRGs estão agora na lista BCC64. O sample samples/test/vmenu_test.prg compila e corre com build_new.bat vmenu_test hb64. No FWH64 de junho/julho: compile source/classes/tc5imglst.prg na aplicação. Ver TVMenu.

TXBrowse:bLClicked depois de BookMark

TXBrowse:LButtonDown() avalia bLClicked uma vez, depois da mudança de linha (Skip() / BookMark). A correção de abril 2026 do disparo duplo executava o bloco antes do movimento, então oBrw:BookMark ainda era o registro anterior. Colunas SetCheck() no estilo rádio que fazem nSelectedRow := oBrw:BookMark em bLClicked marcavam a linha atual antiga, não a clicada.

bLClicked continua anulado em volta de Super:LButtonDown() para TControl / TWindow não o avaliarem de novo. Sample: samples/system/xbrwin7c.prg. Ver TXBrowse bLClicked.

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

samples/test/testblur.prg demonstra o efeito da biblioteca FWH Blur( hBitmap, nRadius ) (box blur, 0–100, em source/internal/ribbon.c). Antes carregava apenas BMP via PalBmpRead e duplicava o C num #pragma BEGINDUMP. Agora carrega imagens comuns, mostra um slider horizontal visível sob a imagem e liga Blur() a partir das libs FiveHC / FiveC (sample só PRG; Win32 hb_retnl, Win64 hb_retnll).

cd samples\test
build_new.bat testblur hb32
testblur.exe
:: ou: testblur.exe C:\caminho\foto.jpg

Relacionado: FW_ReadImage() / PalBmpDraw(), source/internal/ribbon.c (HB_FUNC( BLUR )), e o sample samples\test\testblu2.prg (blur sobre fundo de XBrowse).