New FTDN April 2026 (FWH 26.03)

Post Reply
User avatar
Antonio Linares
Site Admin
Posts: 44508
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 717 times
Been thanked: 311 times
Contact:

New FTDN April 2026 (FWH 26.03)

Post by Antonio Linares »

March 2026

  • New: Complete HTML documentation (docs/ folder, 26 pages)
    Dark theme, DeepWiki-style 3-column layout with sidebar navigation.
    Opens automatically after FWH installation. Search with Ctrl+K.
    Organized in subfolders: getting-started/, core/, ui/, data/,
    printing/, internet/, reference/. Shared CSS/JS, Mermaid diagrams,
    Harbour syntax highlighting, parameter tables, code examples.
    Sections: Framework Overview, Installation, Build System,
    TWindow, TDialog, TControl, TXBrowse, TButton, TGet, TMenu,
    TFolder, TComboBox, TCheckBox, TDatabase, TRecordSet, TODBC,
    MariaDB, TPrinter, TReport, TWebView2, AI Classes (TOpenAI,
    TChatGPT, TOLlama, TDeepSeek, TGemini, TGrok, TKimi, Transformer),
    TWebServer, Commands Reference, Functions Reference, Error System,
    GDI Resources (TFont, TBrush, TBitmap, TImage, TIni, TReg32).

  • Enh: Error dialog auto-detects Windows dark mode theme
    The FiveWin error system dialog (errsysw.prg) now automatically shows in
    dark mode when the Windows system theme is set to dark, even if the app
    has not explicitly called FW_SetDarkMode(.T.). Detection uses IsDarkTheme()
    and FW_GETTHEMEMODE(). Apps that call FW_SetDarkMode(.T.) always get dark mode.

  • New: samples/report/prnativa.prg - Printer status check before printing
    Demonstrates how to query the default printer status using PrnStatus()
    and bitmask flags (PRINTER_STATUS_*) before sending a print job.
    Detects: offline, paper out, paper jam, paused, no toner, door open, etc.
    If the printer is not available, attempts to start the Windows Spooler service.

  • New: FiveWin test suite (tests/testfwh.prg)
    87 automated tests across 10 categories verifying FWH core functionality:

    • Strings: cValToChar, StrToken, NumToken
    • Math: Int, Abs, Max, Min, Round, Mod, matrix basics
    • Hash: hb_Hash, hb_HSet, hb_HHasKey, hb_HKeys
    • Arrays: Len, AScan, ASort, AAdd, ADel, ATail
    • Dates: Year, Month, Day, DoW, Date(), Time()
    • Files: MemoWrit, MemoRead, FErase, lIsDir
    • Classes: TRect, TFont, TBrush, TCursor, TIni
    • Controls: Dialog, Button, Say, Get (headless, no ACTIVATE)
    • Database: dbCreate, USE, APPEND, REPLACE, LOCATE, SKIP, CLOSE
    • Compatibility: Version(), hb_Compiler(), ValType, hash functions
      Results output to testfwh.log via LogFile().
      Run with: tests\run.bat [hb32|hm32|hm64|hg32|hg64] (interactive menu if no param)
  • New: Support for Embarcadero BCC32C (LLVM/Clang-based) C compiler
    FWH now builds with bcc32c from c:\bcc77c (Embarcadero C++ 7.70, Clang 5.0.2).
    New libraries: FiveHL.lib (PRG) + FiveHCL.lib (C/C++) + FiveHXL.lib (xHarbour).
    Requires Harbour built with clang: harbour_bcc770C_32_20250515.zip from
    https://github.com/FiveTechSoft/harbour ... our_builds
    Use c:\harbour\bin\win\clang\harbour.exe and c:\harbour\lib\win\bcc32c\ libs.
    Build via mfwh_new.bat option 2 (Harbour) or option 8 (xHarbour).

  • Fix: #pragma option -a- (Borland byte alignment) not supported by bcc32c/Clang
    Affected files: dlg2chr.c, ctrl2chr.c, wndbrush.c
    The Borland-specific #pragma option -a- is silently ignored by bcc32c (Clang),
    causing sizeof(DIALOG_RES) and sizeof(CONTROL) to be 20 instead of 18 bytes.
    This corrupted dialog templates, making all dialogs fail with error 1407
    (ERROR_CLASS_DOES_NOT_EXIST). Fixed by adding #pragma pack(push, 1) which
    works with all compilers: BCC32, BCC32C, MSVC, and MinGW/GCC.

  • New: Unified hbmk2 build system for FWH libraries (fwh.hbp + fwhc.hbp)
    Two .hbp files replace 10 makefiles for building all FWH library variants:

    • fwh.hbp: builds FiveH*.lib from 351 PRG sources
    • fwhc.hbp: builds FiveHC*.lib from 228 C/C++ sources
      Supports all compiler/architecture combinations via hbmk2 flags:
      BCC 32, MSVC 32/64, MinGW 32/64, and xHarbour (BCC 32, MSVC 64).
  • New: Unified build script for samples (samples/build_new.bat)
    Replaces 20 individual build*.bat files with a single script featuring
    an interactive menu to select the compiler/architecture combination:
    build_new myapp -> interactive menu
    build_new myapp hb32 -> Harbour + BCC 32 (direct)
    build_new myapp hbc32c -> Harbour + BCC32C/Clang (direct)
    build_new myapp hm64 -> Harbour + MSVC 64 (direct)
    build_new myapp xhbc -> xHarbour Commercial + VC98 (direct)
    Available options: hb32, hbc32c, hm32, hm64, hg32, hg64, xb32, xm64, xhbc
    Works from any subdirectory of samples/.

  • New: xHarbour Commercial support in build system

    • mfwh_new.bat option 0: builds Fivehmx.lib + FiveHX.lib using VC98
    • build_new.bat option 9 (xhbc): builds samples with xHB Commercial + VC98
    • buildxhb.bat: auto-copies xHBZipDll.dll next to built executables
    • source/internal/xhbcompat.c: Harbour compatibility layer for xHB Commercial
      Provides hb_DirExists() and other functions missing in xHB (abandoned 2016).
      Add new stubs here as needed when unresolved externals appear.
  • New: hbmk2 project examples in makes/ subfolders (replaces old .zip files)
    Each folder has a self-contained go.bat + test.hbp + test.prg ready to use:
    makes/hb_bcc32/ Harbour + BCC 32
    makes/hb_bcc32c/ Harbour + BCC32C (Clang)
    makes/hb_msvc32/ Harbour + MSVC 32
    makes/hb_msvc64/ Harbour + MSVC 64
    makes/hb_gcc32/ Harbour + GCC 32
    makes/hb_gcc64/ Harbour + GCC 64
    makes/xhb_bcc32/ xHarbour + BCC 32
    makes/xhb_msvc64/ xHarbour + MSVC 64
    makes/xhb_commercial/ xHarbour Commercial + VC98 (uses xlink)
    Users: copy folder, adjust paths in test.hbp, run go.bat.

  • New: Unified library build script (mfwh_new.bat)
    Replaces 10 individual mfwh*.bat files with a single script:
    mfwh_new -> interactive menu
    mfwh_new hb32 -> Harbour + BCC 32 (direct)
    mfwh_new all -> build all Harbour variants (1-5)

  • Enhancement: xHarbour compatibility improvements

    • Enabled hbcompat.ch in FiveWin.ch for global Harbour/xHarbour function mapping
    • Added #ifdef XHARBOUR guards for variadic ... syntax (window.prg, activex.prg)
    • Removed duplicate wrapper functions now handled by hbcompat.ch (drxl.prg, harbour.prg)
    • xHarbour builds use HB_INSTALL_PREFIX to invoke the real xHarbour compiler
  • Fix: XBrowse lSeekBar + lIncrFilter: Multiple fixes for incremental filter
    with SeekBar display:

    • Fix: oFilterCol was never assigned, so the SeekBar SAY was never painted
      when lIncrFilter was active. Now auto-assigned from SelectedCol() on first Seek.
    • Fix: SeekBar text was painted on screen DC instead of the double-buffer DC,
      causing it to be overwritten by DispEnd(). ShowSeek() now uses the active
      hDC (buffer or screen) and draws text with DrawText/SetTextColor directly.
    • Fix: Seek(nil) called from GoUp/GoDown/navigation methods was clearing
      cSeek even during active incremental filtering, erasing the search text.
      Now preserves cSeek when lIncrFilter is active.
    • Fix: Recursive Seek("") calls during Refresh()/Change() were clearing the
      search state. Added static recursion guard in Seek() for lIncrFilter mode.
    • Fix: Search icon (zoom2 bitmap) was not drawn with transparent background.
      Changed from DrawBitmap to DrawTransparent for proper alpha rendering.
  • New sample: samples/ui/xbrowse/xbrseek.prg - Demonstrates lSeekBar with
    incremental filtering (lIncrFilter + lSeekWild) using a DBF data source.
    Shows colored SeekBar (bClrEdit), ESC to reset filter, and AUTOSORT.

  • Enhancement: CLASS Transformer - Bug fixes and C-accelerated operations:

    • Fix: W_vocab gradient was never accumulated in Backward(), preventing the
      output projection layer from learning. Now correctly computes dW_vocab.
    • Fix: LayerNorm:Backward() used normalized values (x_norm) instead of original
      input (x - mean) for gradient computation, producing incorrect gradients.
    • Fix: Residual connection gradients were not propagated in Transformer:Backward().
      The skip-connection gradient is now correctly added at each residual block.
    • New C functions in matrixes.c for Transformer acceleration:
      hb_Matrix3DAdd() - Element-wise 3D tensor addition
      hb_Matrix3DInplaceAdd() - In-place 3D tensor addition (no allocation)
      hb_Matrix3DAvg() - Average pooling over sequence dimension (3D->2D)
      hb_Matrix3DExpand() - Expand 2D gradient to 3D (uniform distribution)
      hb_MatMul3D() - Batch matrix multiply [batch][seq][d] x [d][d_out]
      hb_LayerNorm3D() - Full LayerNorm forward in C (returns output+cache)
      hb_LayerNormBackward3D() - Full LayerNorm backward in C (returns grads)
      hb_ScaledDotAttention() - Fused scaled dot-product attention (QKT+softmax+V)
      hb_EmbeddingLookup3D() - Fast batch embedding lookup from 2D matrix
    • Transformer:Forward() and Backward() now use C-accelerated calls, replacing
      triple-nested Harbour loops with single C function calls.
    • LayerNorm:Forward() and Backward() reduced from 30 lines each to 5 lines.
    • MultiHeadAttention:Forward() uses fused hb_ScaledDotAttention() per head.
    • FeedForward:Forward() uses hb_MatMul3D() for batch multiplication.
  • New sample: samples/ai/transformer.prg - Interactive Transformer demo with
    unified FiveWin dialog showing live training progress, accuracy metrics,
    next-word predictions (top-5 with probabilities), and autoregressive text
    generation. Trained on a 141-phrase Spanish corpus with 120 epochs.

  • Enhancement: Updated all build scripts to support Microsoft Visual Studio 2026
    (Community edition, version 18). The vcvarsall.bat path has been updated from
    "2022\Community" to "18\Community" in all .bat files: mfwh.bat, mfwh64.bat,
    mfwhx64.bat, mfwhxh64.bat, dll\rc2dll64.bat, and the sample build scripts
    (buildh32, buildh64, buildx32, buildxh64, bldmbh32, EasyReport, webview, xlsxlibhb).

  • Fix: Resolved linker error LNK2005 "HB_FUN_MESSAGEBOX already defined" that occurred
    when linking with xhb.lib. The internal C function MESSAGEBOX in source\function\msgs.c
    and source\winapi\msgbox.c has been renamed to FW_MESSAGEBOX to avoid symbol collision
    with xhb.lib(xhbwin.obj). An #xtranslate directive has been added to fivewin.ch so
    that any existing user code calling MessageBox() is automatically redirected to
    FW_MessageBox() at compile time, requiring no source code changes.

  • Enhancement: FW_SetDarkMode() - Global dark mode for the entire application.
    A single call enables dark mode for all existing and future dialogs:
    FW_SetDarkMode( .T. ) // enable with default colors
    FW_SetDarkMode( .T., nClrText, nClrBack ) // enable with custom colors
    FW_SetDarkMode( .F. ) // disable (restore light mode)
    FW_SetDarkMode() // query current state (.T./.F.)
    When enabled, TDialog:Initiate automatically applies SetDarkMode() to every new
    dialog. Existing open windows are themed immediately. TDialog:CtlColor forces
    dark colors on resource-only static controls (SAYs, GroupBoxes, Radio, Checkbox).

    Example:

    #include "FiveWin.ch"

    function Main()

    local oWnd, oBar

    FW_SetDarkMode( .T. )

    DEFINE WINDOW oWnd TITLE "Dark Mode App"

    DEFINE BUTTONBAR oBar OF oWnd

    DEFINE BUTTON OF oBar ACTION TestDialog()
    DEFINE BUTTON OF oBar ACTION FW_SetDarkMode( ! FW_SetDarkMode() ), ;
    oWnd:Refresh() // toggle dark/light

    ACTIVATE WINDOW oWnd

    return nil

    function TestDialog()

    local oDlg, cName := Space( 30 )

    DEFINE DIALOG oDlg TITLE "Test" SIZE 300, 200

    @ 1, 1 SAY "Name:" OF oDlg
    @ 1, 4 GET cName OF oDlg

    @ 3, 1 CHECKBOX lCheck VAR .T. PROMPT "Option 1" OF oDlg
    @ 4, 1 CHECKBOX lCheck2 VAR .F. PROMPT "Option 2" OF oDlg

    @ 6, 4 BUTTON "OK" OF oDlg ACTION oDlg:End()

    ACTIVATE DIALOG oDlg CENTERED

    return nil

  • Enhancement: TDialog:SetDarkMode( nClrText, nClrBack ) - Unified cascading dark
    mode. Handles SAY, Group, Radio, Checkbox, TGet, TComboBox, TMultiGet, TListBox,
    TXBrowse (with columns), TFolder (per page), and TBar automatically.
    Both parameters default to RGB(220,220,220) / RGB(30,30,30).

  • Enhancement: TBar:SetDarkMode( nClrText, nClrBack ) - Dark mode for buttonbars.
    Same signature as TDialog/TFolder. Detected automatically by the cascade.
    FW_SetDarkMode(.F.) restores default light gradients via SetGradients().

  • Enhancement: TTabs - Dark mode support. Paints flat solid tabs with configurable
    colors instead of bitmap-based tabs. Text color respects ::nClrText.

  • Enhancement: TTxtEdit - Improved text selection with mouse and keyboard:

    • Anchor-based selection with consistent absolute line/col coordinates
    • Proper multi-line partial rendering, drag selection, Shift+Arrow/Home/End
    • Double-click word selection, multi-line DelBlock, partial-line Copy
    • Backspace/Delete/typing replaces selected block, Ctrl+V deletes before paste
    • Keywords (cTokens1) rendered in bold with slightly larger font
  • Enhancement: VisualFW IDE - Dark mode applied to all IDE windows: toolbars,
    source editor tabs, buttonbars, Object Inspector, Options and Tools dialogs.
    Dark Mode menu item shows a check mark. Window layout fixes for proper
    alignment of Inspector and Source Editor borders.

  • Fix: VisualFW IDE - "Duplicated Id: No: 201" crash when opening the Options dialog.
    The TXBrowse on the Project Option page was auto-assigned ID 201, colliding with the
    ID_GETRESOURCE GET already registered on that dialog page. Fixed by setting the shared
    TControl CLASSDATA counter (nInitID) past 201 before the XBrowse is created, ensuring
    the auto-assigned ID is always >= 203.

  • Fix: VisualFW IDE - "Unrecoverable error 9003: Too many recursive error handler calls"
    in the FWH error dialog (errsysw.prg). The ListBox was created with "@ LISTBOX n ITEMS
    aStack" (without VAR), so n remained a string (aStack[1]) instead of the TListBox
    object. Calling n:SetColor() then failed, triggering infinite recursion. Fixed by using
    "@ LISTBOX oLbx VAR n ITEMS aStack" and calling oLbx:SetColor().

  • Enhancement: fixed Class TGemini for images support. Thanks to Roberto for his feedback:

    viewtopic.php?p=284399#p284399

  • Fix: Several fixes in TFont, TWindow, TTreeView and TFolder classes related to
    form serialization (.ffm): correct font handle restoration, proper coordinate
    handling, TFolder page array bounds, and TFolder per-page background color
    preservation across save/load cycles.

  • Enhancement: VisualFW IDE - Multiple improvements to the Object Inspector: multi-line
    editing for aPrompts on TFolder/TTabs controls, real-time tab switching when editing
    nOption, fixed color/font/file dialog double-prompting, and improved color persistence.

  • Enhancement: VisualFW IDE - Dark Mode toggle added under Views menu, switching the
    entire IDE between light and dark color schemes.

  • Enhancement: VisualFW IDE - Build system modernized with a single visualfw.hbp file
    supporting both 32-bit (BCC) and 64-bit (MSVC) builds.

  • Enhancement: FiveWin Library - Refactored event resolution in TWindow:Load() using
    variadic ellipsis and a new FW_EvMethod() helper for more robust event restoration.

  • Enhancement: TFolderEx PaintLR() method now supports multiline text (stacked vertical
    characters) when the layout is LEFT or RIGHT. If a tab prompt contains Chr(13), the text
    is drawn with a non-rotated font using DT_CENTER (without DT_SINGLELINE), allowing
    characters to be displayed one below the other. This mirrors the same Chr(13) multiline
    support that PaintTB() already had for TOP/BOTTOM layouts. Fully backwards compatible ÔÇö
    existing prompts without Chr(13) are unaffected.

  • Enhancement: TOutlookMail class improvements:

    • Added hUser DATA to cache the Microsoft Graph user profile, avoiding redundant
      API calls on every send().
    • revoke() now clears the cached hUser on disconnect.
    • testoutlook.prg: token is now persisted via saveStore() after authentication and
      after sending, so rotated refresh tokens survive application restarts.
    • Applied Harbour coding standards (3-space indentation, proper block nesting,
      parentheses spacing) to oauth.prg, outlookmail.prg and testoutlook.prg.
  • Enhancement: samples/outlook/testoutlook.rc minor changes for 32 bits.

February 2026

  • Fix: The is2byteansi() function in source\winapi\fwunicode.c has been updated to
    correctly support Thai (CP874), Simplified Chinese GBK (CP936), and Traditional
    Chinese Big5 (CP950) codepages. This prevents false positives during UTF-8
    detection in is_utf8(), resolving potential garbled text issues with double-byte
    characters in these languages.

  • Fix: MessageBox() and FWMESSAGEBOX() (used by MsgInfo(), MsgStop(), etc) now properly display
    Unicode characters (e.g., Chinese Big5) by using MessageBoxW and fw_parWide() for correct codepage conversion.
    Many thanks to Steven Liu for his feedback!

  • Enhancement: source\winapi\fwunicode.c functions now support Big5 (CP950) and GB (CP936)
    Harbour codepages, ensuring correct Unicode conversion.

  • Enhancement: Class TWebView2 Method New() now accepts a second optional parameter cUserDataFolder.
    This allows creating isolated WebView2 sessions (e.g., for fresh logins) by initializing
    the environment with a custom user data folder.

  • Fix: GDI+ memory leaks fixed in gdipfwh.cpp. samples\ui\xbrowse\testxbrw.prg now
    works without leaks.

  • Fix: Audit gdipfwh.cpp for Memory Leaks Completed the comprehensive audit of gdipfwh.cpp

    Identified and fixed multiple critical memory leaks where GDI+ objects (Graphics, FontFamily,
    Bitmap, Brush) were allocated with new but not deleted. Applied fixes to 11 functions including
    GDIP_RINGGRAD, GDIP_DRAWARROW, GDIP_DRAWTEXT, and image handling functions. Updating documentation
    and signaling readiness for recompilation.

    viewtopic.php?p=283679#p283679


January 2026

  • Enhancement: CLASS TTaskPanel METHOD AddLink( cPrompt, bAction, cBitmap, oFnt, nClrT,
    nClrP, nClrO, cMsg, cTooltip ) has been enhanced to support all parameters:

    viewtopic.php?p=283478#p283478

    Many thanks to Alex Da Silva!

  • Fix: Fixed PDF title in MSPrintToPDF()


    viewtopic.php?p=283516#p283516

    Many thanks to Enrico Maria Giordano!

  • New: function FileHash() -- cHashValue it returns an unique hash string for the provided filename.

    Many thanks to Juan Navas! (AdaptaPro)

  • Fix: Bug fixed in METHOD Destroy() CLASS Region in Class Region:

    viewtopic.php?p=283618#p283618

  • Fix: Successfully applied and verified GDI leak fixes in xbrowse.prg for both TXBrowse:Destroy()
    and TXBrwColumn:End() :

    The Destroy() and End() methods now correctly identify and destroy:

    • Icons using DestroyIcon()

    • GDI+ Images using GDIP_DeleteImage()

    • Bitmaps using PalBmpFree()

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 44508
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 717 times
Been thanked: 311 times
Contact:

Re: New FTDN April 2026 (FWH 26.03)

Post by Antonio Linares »

Final FWH 26.03 already published:

April 2026

  • FWH 26.03 final release. All 13 libraries regenerated against current
    sources. install/beta.txt set to 0 so installers ship without the "Beta N"
    suffix. Build-system cleanup: BCC32C (Clang-based bcc32c) variant removed
    from mfwh_new.bat, samples/build_new.bat, CLAUDE.md and both .iss files ÔÇö
    FiveHL.lib, FiveHCL.lib and FiveHXL.lib are no longer produced or
    distributed. fwh64.iss also updated to reference the canonical xHarbour
    64-bit library names (Fivexh64.a, Fivehxh64.lib) after a stale FiveHX64.lib
    was deleted. Verified samples/misc/fivedbu.prg builds cleanly with all 7
    active compilers (hb32, hm32, hm64, hg32, hg64, xb32, xm64) via the new
    FW_NORUN=1 flag in build_new.bat which suppresses the auto-launch for
    batch verification.

  • Fixed sample: samples/testsay4.prg and testsay4.rc ÔÇö file encoding was
    UTF-8 which broke the legacy OemToAnsi("...") pattern (multi-byte UTF-8
    sequences treated as CP850 single bytes produced garbage in the GET
    showing TRAB). Converted both files to CP1252, replaced the OemToAnsi
    wrappers with direct Portuguese literals (ELETRONICAS, INSTRUCOES). SAYs
    already worked because their text came from the .rc resource; the GET
    failed because TRAB was built in the PRG. No FWH code change required ÔÇö
    FW_SetUnicode(.T.) works fine once the source bytes are correct.

  • New sample: samples/ai/chatbot.prg ÔÇö Chatbot UI built with RICHEDIT5
    (msftedit.dll / RichEdit50W). Uses DEFINE DIALOG RESOURCE with chatbot.rc
    and TRichEdit5():Redefine(). Chat history displays user messages in blue
    and bot responses in green using RTF color tables inserted via
    REINSERTRTF5(). Enter key in the input field triggers send. Includes
    chatbot.rc showing how to declare a RichEdit50W CONTROL in a .rc file
    with rc.exe (MSVC), which requires WS/DS/ES_ constants to be #defined
    explicitly (unlike BCC's brc32.exe which has them built-in).

  • New TBackup and TRestore Classes
    Many thanks to Silvio Falconi
    The classes support three operating modes to adapt to different needs:
    Normal (File Copy): Direct copy of selected files (e.g., .DBF, .FPT)
    using the FiveWin CopyFiles() function, complete with a progress bar (Meter).
    ZIP (Compression): Creation and decompression of .ZIP archives
    to save space and facilitate data transport.
    Windows Native: Integration with the wbadmin system tool
    for entire volume backups and System Restore Point management.

    Usage:

    DEFINE BACKUP oBck ;
    TYPE BK_NORMAL ;
    SOURCE "C:\DATA" ;
    TARGET "D:\BACKUP" ;
    FILES { "*.DBF" } ;
    LANGUAGE 2 // Spanish
    ACTIVATE BACKUP oBck

    DEFINE RESTORE oRes ;
    TYPE RES_NORMAL ;
    SOURCE "C:\BACKUP" ;
    TARGET "C:\MIA_APP" ;
    FILES { "DATI.DBF", "INDICI.CDX" } ;
    LANGUAGE 2 ; // Spanish
    OVERWRITE
    ACTIVATE RESTORE oRes

    To use integration with the wbadmin system tool the user must be Administrator.

  • Fixed: TXBrowse:ToExcel() could crash with "Microsoft Excel cannot paste
    the data" (OLE error 0x800A03EC) when the Windows clipboard was temporarily
    locked by another process. All oSheet:Paste() calls ÔÇö in the chunked loop
    (> 16000 chars), after the loop, in the ::Copy() path, and in
    TXBrwColumn:ToExcel() for images and UTF-8 text ÔÇö now retry up to 5 times
    with SysRefresh() between attempts before giving up.

  • Fixed: TCBrowse no longer displayed Unicode characters (Cyrillic, accented
    Italian/French/German/Spanish, Greek, etc.) when FW_SetUnicode(.T.) was
    active. Root cause: is2byteansi() in fwunicode.c was returning TRUE for all
    byte pairs when the system codepage is CP1250-1258, causing isutf8() to skip
    genuine UTF-8 multi-byte sequences (e.g. D0 9F for Cyrillic ðƒ, C3 A9 for ├®)
    and return FALSE. DrawTextAW() then called DrawTextA() instead of DrawTextW(),
    which cannot render Unicode text. Fix: is2byteansi() now consults
    FW_GetUnicode() ÔÇö when FW_SetUnicode(.T.) is active, byte pairs are treated
    as real UTF-8 sequences, not ANSI pairs.

  • Fixed: TXBrowse:bLClicked was being evaluated twice per click. TControl:
    LButtonDown evaluated the codeblock and then fell through to TWindow:
    LButtonDown which evaluated it again. TXBrowse:LButtonDown now evaluates
    bLClicked once and neutralizes it during the ::Super:LButtonDown chain to
    prevent the double-fire.

  • New sample: samples/unicode/willi2t.prg - Diagnostic test for
    FW_SetUnicode(.T.) with accented CP1252 characters in GETs. Logs hex values,
    byte counts and UTF-8 detection state before and after dialog interaction.

  • New sample: samples/ui/TESTPAS3.prg - Password login dialog controlling
    access to MDI window. Fixed original IF( bug (Harbour parsed IF( as IIF),
    uses == exact comparison with AllTrim(), and oWnd:Show() before Login()
    so the main window is visible behind the login dialog.

  • Fixed: SetWindowText() double UTF-8 conversion with FW_SetUnicode(.T.) on
    CP1250-1258 codepages. When a Unicode GET control (created with
    CreateWindowExW) lost focus, its text was read back as UTF-8 via
    GetWindowTextW, but SetWindowText() passed it through fw_parWide() which
    used isutf8()/is2byteansi() to detect encoding. The is2byteansi() function
    always returned TRUE for CP1250-1258, defeating UTF-8 detection and causing
    MultiByteToWideChar to treat valid UTF-8 bytes (e.g. C3 B1 for ├▒) as two
    separate CP1252 characters (Ã and ±), producing double-encoded output.
    Fix: SetWindowText() now validates with MultiByteToWideChar(CP_UTF8,
    MB_ERR_INVALID_CHARS) first; if the text is valid UTF-8 it uses CP_UTF8
    directly, otherwise falls back to fw_parWide() for ANSI text.

  • Fixed: REDEFINE GET ... MEMO (TMultiGet) from resource dialog was broken -
    the edited text was not reaching the bound variable (arrived empty).
    Regression introduced on 2026-03-10 when oWnd:DefControl( Self ) was
    accidentally removed from TMultiGet:ReDefine. Without that call, the
    TMultiGet object was never added to oDlg:aControls, Initiate() was never
    invoked, ::hWnd stayed nil, and every SendMessage/GetWindowText on the
    control returned 0/"". Restored the missing oWnd:DefControl( Self ) call.

  • Fixed: Labels demo Source() dialog showing empty. MemoRead() needed Trim()
    on the DBF field, and full path via cFilePath(ExeName()). Replaced the
    REDEFINE GET MEMO resource dialog with a pure PRG dialog using Courier New
    font for proper source code display.

  • Fixed: Labels demo toolbar bitmaps not showing. Updated DEMO.RC to use
    correct relative paths to bitmaps\ directory.

  • Fixed: autolay.prg sample crash "Cannot create Dialog Box: Dbf2RC".
    Added missing autolay.rc resource file (copied from samples/data/dbf2rc.rc)
    with corrected icon path.

  • Fixed: PrintEnd() crash "Method not exported: LMETA" when oPrinter is nil.
    Added nil guard before accessing oPrinter:lMeta. Can occur when MsgWait or
    modal dialogs are used between ENDPAGE and ENDPRINT without PREVIEW.

  • Fixed: TPages:SetColor() crash "Class: 'CHARACTER' has no exported method:
    SETCOLOR" during REDEFINE. SetColor() was called before child dialogs were
    created, when ::aDialogs still contained resource name strings instead of
    dialog objects. Changed the nil check to ValType() == "O".

March 2026

  • Fixed: TXBrowse:ToExcel() crash "No instance variable: BOLD" when exporting
    from report preview to Excel. oSheet:Rows():Font:Bold OLE call could fail
    when third-party libraries define conflicting _BOLD accessors. Wrapped in TRY/CATCH.

  • Enhanced: FiveGuru Menu Inspector now functional
    Fixed duplicate control IDs in MenuInspect .rc dialog. MenuInspect()
    now supports Add MenuItem, Add SubMenu (converts last item), and Remove.

  • Fixed: TFolder crash "Message not found: TFOLDER:TDIALOG" with xHarbour
    xHarbour resolves ::Super based on the last CLASS..FROM seen in the file.
    TFolder:SetColor and SetDarkMode were defined after CLASS TFolderDialog
    FROM TDialog, so ::Super resolved to TDialog instead of TControl.
    Moved those methods before the TFolderDialog class definition.
    Also fixed deferred page creation: TFolder:New() now creates TFolderDialog
    pages even when parent hWnd is 0 (DEFINE DIALOG), so controls defined
    between DEFINE/ACTIVATE attach to the correct folder page.

  • Fix: SetAutoHelp() crash with xHarbour + DBFCDX (Variable does not exist: TITLE)
    When opening help.dbf via USE "Help" VIA "DBFCDX", the DBFCDX driver auto-opens
    the structural help.cdx and evaluates the stored index expression. In xHarbour,
    field->Title fails to resolve during the auto-open phase, causing error BASE/1003.
    Fixed by erasing help.cdx before the USE, since the INDEX ON at the next line
    always rebuilds the tag anyway. (source/winapi/help32.prg)

  • Fix: Accented characters on buttons, comboboxes and checkboxes in dialogs
    On applications with a Windows XP manifest (comctl32 v6), common controls
    like BUTTON, COMBOBOX and CHECKBOX are created as Unicode windows.
    When SetWindowText() or SendMessage(CB_ADDSTRING) detected a Unicode window
    via IsWindowUnicode(), it called fw_parWide() to convert the text from
    multibyte to UTF-16. fw_parWide() delegates to strtowidestr() which calls
    hbcdp_to_wincdp() to determine the conversion codepage. The bug was in
    hbcdp_to_wincdp() (fwunicode.c): when bAnsiOnly was TRUE (non-UTF-8 text),
    it was supposed to skip OEM codepages (< 1250) and keep the default CP_ACP.
    But the else branch at line 119 unconditionally assigned the OEM codepage:
    if ( bAnsiOnly && v >= 1250 ) { icdp = v; }
    else { icdp = v; } // <-- BUG: defeats the bAnsiOnly check
    This caused CP1252 strings (e.g. "A├▒adir" with ├▒=0xF1) to be converted
    using CP437 where 0xF1 is ┬▒ instead of ├▒, producing garbled text.
    Fixed by changing the condition to: if ( !bAnsiOnly || v >= 1250 ) { icdp = v; }
    so OEM codepages are skipped when the caller expects ANSI-only text.
    SAY controls were unaffected because they paint their own text via
    DrawTextExA which interprets bytes using the font's ANSI charset.
    See samples/test/testlang.prg.

  • Fix: Dialog titles with accented characters (German, Spanish, Portuguese, etc.)
    strings.prg was encoded in UTF-8 where accented chars take 2 bytes (e.g.
    ä=C3A4), corrupting dialog templates which expect single-byte characters.
    Converted strings.prg to CP1252 encoding (ä=E4, ü=FC, ó=F3, etc.).
    Also changed MultiByteToWideChar code page from CP_OEMCP to CP_ACP in
    dlg2chr.c and ctrl2chr.c, since PRG strings are ANSI (CP1252), not OEM
    (CP850). CP_OEMCP was a Clipper/DOS legacy that misinterpreted accented
    characters on modern Windows. See samples/test/testlang.prg.

  • Enh: New FWString() entries for fivedbu menu localization
    Added "Select Printer", "Map Network Drive", "Disconnect Network Drive"
    with translations for Spanish, French, Portuguese, German and Italian.
    Fixed German translation of "Setup" from "Drucker" (Printer) to
    "Einstellungen" (Settings). Fixed Portuguese and Italian translations.
    fivedbu.prg: Setup menu, Select Printer, Map/Disconnect Network Drive
    now use FWString() for multi-language support.

  • New: xHarbour + BCC 64 build support
    Added new compiler variant to the build system:

    • mfwh_new.bat option B (or param xb64): builds Fivexh64.a PRG lib
      using xHarbour64 harbour.exe + BCC64 compiler + tlib64
      C lib FiveC64.a is shared from Harbour+BCC64 build
    • build_new.bat xb64: builds samples with xHarbour64 + BCC64
      Links with Fivexh64.a + FiveC64.a + xHarbour64 runtime .a libs
  • Fix: TGet IME compatibility with Windows 10/11 TSF (Text Services Framework)
    The new Chinese IME in Windows 10/11 caused character loss and input blocking
    in TGet controls. TGet's KeyChar/KeyWChar methods called Assign(), SetPos(),
    and Refresh() during IME composition, interfering with the TSF framework.
    Added lIMEComposing flag and WM_IME_STARTCOMPOSITION/ENDCOMPOSITION/COMPOSITION
    handling in HandleEvent. During composition, character input bypasses TGet's
    custom processing via CallWindowProc, letting the native EDIT control handle
    the IME. After composition ends, TGet syncs its buffer and cursor position.
    Affects Chinese (Pinyin/Bopomofo), Japanese, and Korean IME input.
    See samples/test/testime.prg for an automated IME simulation test.

  • Fix: TWBrowse nAt NIL crash and nClrPane block evaluation
    TWBrowse:nAt was not initialized, causing array access errors when
    user codeblocks (bLine, nClrPane) were evaluated during the first
    WM_PAINT before SetArray() was called. Additionally, WBRWLINE
    evaluated nClrPane blocks without passing the column index, destroying
    the block and crashing when the block expected a nCol parameter.
    Fixed by initializing DATA nAt INIT 1 and deferring nClrPane block
    evaluation to the per-column loop where the column index is available.
    See samples/misc/brwcolor.prg.

  • Fix: DialogBoxIndirect failure (nResult -1) on MSVC 32/64 builds
    Commit 8562d5a added #pragma pack(push,1) for ALL compilers to fix
    bcc32c dialog template alignment. However, MSVC uses default alignment
    (4/8 bytes) for the DIALOG_RES and CONTROL structs in dlg2chr.c and
    ctrl2chr.c, and the rest of the code (padding bytes, offsets) was written
    for that layout. Forcing pack(1) on MSVC corrupted the dialog template,
    causing DialogBoxIndirect to return -1 and all DEFINE DIALOG to fail
    silently. Fixed by restricting #pragma pack(push,1) to BORLANDC only.

  • Enh: fivedbu.prg shows C compiler and 32/64-bit in title bar
    Uses hb_Compiler() and #ifdef 64 for architecture detection.
    fivedbu.rc paths changed from .\..\..\path to ../../path for
    compatibility with MinGW windres resource compiler.

  • New: Complete HTML documentation (docs/ folder, 26 pages)
    Dark theme, DeepWiki-style 3-column layout with sidebar navigation.
    Opens automatically after FWH installation. Search with Ctrl+K.
    Organized in subfolders: getting-started/, core/, ui/, data/,
    printing/, internet/, reference/. Shared CSS/JS, Mermaid diagrams,
    Harbour syntax highlighting, parameter tables, code examples.
    Sections: Framework Overview, Installation, Build System,
    TWindow, TDialog, TControl, TXBrowse, TButton, TGet, TMenu,
    TFolder, TComboBox, TCheckBox, TDatabase, TRecordSet, TODBC,
    MariaDB, TPrinter, TReport, TWebView2, AI Classes (TOpenAI,
    TChatGPT, TOLlama, TDeepSeek, TGemini, TGrok, TKimi, Transformer),
    TWebServer, Commands Reference, Functions Reference, Error System,
    GDI Resources (TFont, TBrush, TBitmap, TImage, TIni, TReg32).

  • Enh: Error dialog auto-detects Windows dark mode theme
    The FiveWin error system dialog (errsysw.prg) now automatically shows in
    dark mode when the Windows system theme is set to dark, even if the app
    has not explicitly called FW_SetDarkMode(.T.). Detection uses IsDarkTheme()
    and FW_GETTHEMEMODE(). Apps that call FW_SetDarkMode(.T.) always get dark mode.

  • New: samples/report/prnativa.prg - Printer status check before printing
    Demonstrates how to query the default printer status using PrnStatus()
    and bitmask flags (PRINTER_STATUS_*) before sending a print job.
    Detects: offline, paper out, paper jam, paused, no toner, door open, etc.
    If the printer is not available, attempts to start the Windows Spooler service.

  • New: FiveWin test suite (tests/testfwh.prg)
    87 automated tests across 10 categories verifying FWH core functionality:

    • Strings: cValToChar, StrToken, NumToken
    • Math: Int, Abs, Max, Min, Round, Mod, matrix basics
    • Hash: hb_Hash, hb_HSet, hb_HHasKey, hb_HKeys
    • Arrays: Len, AScan, ASort, AAdd, ADel, ATail
    • Dates: Year, Month, Day, DoW, Date(), Time()
    • Files: MemoWrit, MemoRead, FErase, lIsDir
    • Classes: TRect, TFont, TBrush, TCursor, TIni
    • Controls: Dialog, Button, Say, Get (headless, no ACTIVATE)
    • Database: dbCreate, USE, APPEND, REPLACE, LOCATE, SKIP, CLOSE
    • Compatibility: Version(), hb_Compiler(), ValType, hash functions
      Results output to testfwh.log via LogFile().
      Run with: tests\run.bat [hb32|hm32|hm64|hg32|hg64] (interactive menu if no param)
  • Enhanced: /save skill now auto-updates whatsnew.txt before committing
    Analyzes changes and adds an entry with * New:, * Enhanced: or * Fixed: prefix.

  • New: /dialog skill for designing Windows dialog boxes
    Generates .rc resource files and/or pure FiveWin PRG code with proper layout.
    Includes visual debugging via SaveAsImage(), font profiles (Segoe UI, MS Sans Serif),
    combobox dropdown rules, and automatic proportional control sizing.

  • Fixed: MSVC 32-bit libraries rebuilt with current Harbour revision
    FiveH32.lib and FiveHC32.lib were compiled with an older Harbour revision,
    causing incorrect FWString() lookups (e.g. "Setup" returning "Drucker" in German).

  • New: samples/test/customer.prg - Customer form dialog example
    Demonstrates pure PRG dialog creation with Segoe UI font, gradient background,
    and combobox handling. Also samples/test/translate.prg for translation testing.

  • Fixed: TControl:GetNewId() now skips IDs already in use by other controls
    When mixing .rc resource controls (fixed IDs) with programmatic controls
    (auto-generated IDs), GetNewId() could return an ID already used by a
    REDEFINE'd control, causing "Duplicated Id" error in TDialog:DefControl().
    Now GetNewId() checks ::oWnd:aControls and skips to the next available ID.

  • Fixed: 64-bit installer missing libmariadb64_bcc64.a and libmariadb64_gcc.a
    BCC64 and GCC64 builds that use MariaDB failed at link time with
    "Unable to open file LIBMARIADB64_BCC64.A". Added both libs to fwh64.iss.

  • Fixed: isutf8() false positives with CP1252 accented text (Portuguese, etc.)
    Dialog titles with accented characters (ã, ç, ó, etc.) from FWString() were
    corrupted because isutf8() misidentified CP1252 byte pairs (e.g. C3 A7 = ç)
    as valid UTF-8, causing SetWindowTextW() to be called with ANSI bytes.
    Added CP1250-1258 recognition to is2byteansi() in fwunicode.c.

  • Fixed: TPreview:SaveAs() passed aMeta array instead of TPrinter object
    to MSPrintToPDF(), causing "No existe el m├®todo: CDOCUMENT" error
    when saving print preview to PDF via Microsoft Print to PDF.

  • Enhanced: Added "Test" translation to strings.prg
    Portuguese: "Teste", Spanish: "Prueba", Italian: "Prova".

  • Fixed: mfwh_new.bat hbc32c no longer overwrites FiveH.lib/FiveHC.lib
    hbc32c now passes -olib/FiveHL and -olib/FiveHCL to hbmk2, writing
    directly to the correct filenames. Prevents mixing bcc32/bcc32c objects.

  • Fixed: libmariadb64.a was GCC format, incompatible with BCC64 linker
    Users linking with -llibmariadb64 and BCC64 got "Invalid object file dwtoct.o".
    Replaced libmariadb64.a with BCC64 import lib. GCC version is libmariadb64_gcc.a.

  • New: samples/test/setlang2.prg - Multi-language accented characters test
    Tests FWString() with Portuguese, German, Spanish, French, Italian.
    Includes FW_SetUnicode(.T.), diagnostic hex dump, and all control types.

  • Fixed: HTML docs syntax highlighter corrupting code examples
    Single quotes, numbers, and keywords inside strings/comments were being
    re-processed by subsequent regex passes, producing visible class="xx" artifacts.
    Refactored highlightHarbour() to use token placeholders for all literals.

  • Enhanced: WebApp draggable MDI child windows with position sync
    Child windows can be dragged in the browser and position syncs to desktop.
    Desktop position changes reflect in browser via polling.
    Child buttonbar with Unicode icons, grouped buttons, and click actions.
    Bar sizes proportional, jQuery UI draggable with pause-during-drag.

  • Enhanced: WebApp real-time bidirectional interaction via AJAX polling
    Browser auto-refreshes data every 1 second without page reload.
    Clicking a row in the browser navigates to that record in the Windows app.
    Changes in the Windows app are reflected in the browser automatically.
    New API endpoints: /api/content (AJAX data), /api/goto/N (navigate).

  • Enhanced: WebApp shows XBrowse data in browser with selected row highlight
    MDI child windows with XBrowse controls render as Bootstrap tables.
    Current record is highlighted with table-primary class.
    HTML is cached from GUI thread via timer for thread-safe serving.

  • New: WebApp URL routing ÔÇö browser clicks execute FiveWin actions
    Clicking buttons/menus in the web browser (localhost) now executes
    the corresponding action in the Windows app via thread-safe timer.
    WA_BuildUrlMap() maps URLs to actions, WA_CheckPending() evaluates them.

  • Fixed: HTML charset changed from utf-8 to windows-1252 for WebApp
    Accented characters in menu items were showing as ? in the browser.

  • Fixed: TBtnBmp:Html() malformed class attribute broke button href links
    Missing quote separator between class and title caused invalid HTML.

n* Fixed: Restored strings.prg CP1252 encoding after accidental UTF-8 corruption
The Edit tool converted CP1252 accented bytes to UTF-8 replacement chars (U+FFFD).
All 15 libraries rebuilt with correct accented characters.

  • New: Support for Embarcadero BCC32C (LLVM/Clang-based) C compiler
    FWH now builds with bcc32c from c:\bcc77c (Embarcadero C++ 7.70, Clang 5.0.2).
    New libraries: FiveHL.lib (PRG) + FiveHCL.lib (C/C++) + FiveHXL.lib (xHarbour).
    Requires Harbour built with clang: harbour_bcc770C_32_20250515.zip from
    https://github.com/FiveTechSoft/harbour ... our_builds
    Use c:\harbour\bin\win\clang\harbour.exe and c:\harbour\lib\win\bcc32c\ libs.
    Build via mfwh_new.bat option 2 (Harbour) or option 8 (xHarbour).

  • Fix: #pragma option -a- (Borland byte alignment) not supported by bcc32c/Clang
    Affected files: dlg2chr.c, ctrl2chr.c, wndbrush.c
    The Borland-specific #pragma option -a- is silently ignored by bcc32c (Clang),
    causing sizeof(DIALOG_RES) and sizeof(CONTROL) to be 20 instead of 18 bytes.
    This corrupted dialog templates, making all dialogs fail with error 1407
    (ERROR_CLASS_DOES_NOT_EXIST). Fixed by adding #pragma pack(push, 1) which
    works with all compilers: BCC32, BCC32C, MSVC, and MinGW/GCC.

  • New: Unified hbmk2 build system for FWH libraries (fwh.hbp + fwhc.hbp)
    Two .hbp files replace 10 makefiles for building all FWH library variants:

    • fwh.hbp: builds FiveH*.lib from 351 PRG sources
    • fwhc.hbp: builds FiveHC*.lib from 228 C/C++ sources
      Supports all compiler/architecture combinations via hbmk2 flags:
      BCC 32, MSVC 32/64, MinGW 32/64, and xHarbour (BCC 32, MSVC 64).
  • New: Unified build script for samples (samples/build_new.bat)
    Replaces 20 individual build*.bat files with a single script featuring
    an interactive menu to select the compiler/architecture combination:
    build_new myapp -> interactive menu
    build_new myapp hb32 -> Harbour + BCC 32 (direct)
    build_new myapp hbc32c -> Harbour + BCC32C/Clang (direct)
    build_new myapp hm64 -> Harbour + MSVC 64 (direct)
    build_new myapp xhbc -> xHarbour Commercial + VC98 (direct)
    Available options: hb32, hbc32c, hm32, hm64, hg32, hg64, xb32, xm64, xhbc
    Works from any subdirectory of samples/.

  • New: xHarbour Commercial support in build system

    • mfwh_new.bat option 0: builds Fivehmx.lib + FiveHX.lib using VC98
    • build_new.bat option 9 (xhbc): builds samples with xHB Commercial + VC98
    • buildxhb.bat: auto-copies xHBZipDll.dll next to built executables
    • source/internal/xhbcompat.c: Harbour compatibility layer for xHB Commercial
      Provides hb_DirExists() and other functions missing in xHB (abandoned 2016).
      Add new stubs here as needed when unresolved externals appear.
  • New: hbmk2 project examples in makes/ subfolders (replaces old .zip files)
    Each folder has a self-contained go.bat + test.hbp + test.prg ready to use:
    makes/hb_bcc32/ Harbour + BCC 32
    makes/hb_bcc32c/ Harbour + BCC32C (Clang)
    makes/hb_msvc32/ Harbour + MSVC 32
    makes/hb_msvc64/ Harbour + MSVC 64
    makes/hb_gcc32/ Harbour + GCC 32
    makes/hb_gcc64/ Harbour + GCC 64
    makes/xhb_bcc32/ xHarbour + BCC 32
    makes/xhb_msvc64/ xHarbour + MSVC 64
    makes/xhb_commercial/ xHarbour Commercial + VC98 (uses xlink)
    Users: copy folder, adjust paths in test.hbp, run go.bat.

  • New: Unified library build script (mfwh_new.bat)
    Replaces 10 individual mfwh*.bat files with a single script:
    mfwh_new -> interactive menu
    mfwh_new hb32 -> Harbour + BCC 32 (direct)
    mfwh_new all -> build all Harbour variants (1-5)

  • Enhancement: xHarbour compatibility improvements

    • Enabled hbcompat.ch in FiveWin.ch for global Harbour/xHarbour function mapping
    • Added #ifdef XHARBOUR guards for variadic ... syntax (window.prg, activex.prg)
    • Removed duplicate wrapper functions now handled by hbcompat.ch (drxl.prg, harbour.prg)
    • xHarbour builds use HB_INSTALL_PREFIX to invoke the real xHarbour compiler
  • Fix: XBrowse lSeekBar + lIncrFilter: Multiple fixes for incremental filter
    with SeekBar display:

    • Fix: oFilterCol was never assigned, so the SeekBar SAY was never painted
      when lIncrFilter was active. Now auto-assigned from SelectedCol() on first Seek.
    • Fix: SeekBar text was painted on screen DC instead of the double-buffer DC,
      causing it to be overwritten by DispEnd(). ShowSeek() now uses the active
      hDC (buffer or screen) and draws text with DrawText/SetTextColor directly.
    • Fix: Seek(nil) called from GoUp/GoDown/navigation methods was clearing
      cSeek even during active incremental filtering, erasing the search text.
      Now preserves cSeek when lIncrFilter is active.
    • Fix: Recursive Seek("") calls during Refresh()/Change() were clearing the
      search state. Added static recursion guard in Seek() for lIncrFilter mode.
    • Fix: Search icon (zoom2 bitmap) was not drawn with transparent background.
      Changed from DrawBitmap to DrawTransparent for proper alpha rendering.
  • New sample: samples/ui/xbrowse/xbrseek.prg - Demonstrates lSeekBar with
    incremental filtering (lIncrFilter + lSeekWild) using a DBF data source.
    Shows colored SeekBar (bClrEdit), ESC to reset filter, and AUTOSORT.

  • Enhancement: CLASS Transformer - Bug fixes and C-accelerated operations:

    • Fix: W_vocab gradient was never accumulated in Backward(), preventing the
      output projection layer from learning. Now correctly computes dW_vocab.
    • Fix: LayerNorm:Backward() used normalized values (x_norm) instead of original
      input (x - mean) for gradient computation, producing incorrect gradients.
    • Fix: Residual connection gradients were not propagated in Transformer:Backward().
      The skip-connection gradient is now correctly added at each residual block.
    • New C functions in matrixes.c for Transformer acceleration:
      hb_Matrix3DAdd() - Element-wise 3D tensor addition
      hb_Matrix3DInplaceAdd() - In-place 3D tensor addition (no allocation)
      hb_Matrix3DAvg() - Average pooling over sequence dimension (3D->2D)
      hb_Matrix3DExpand() - Expand 2D gradient to 3D (uniform distribution)
      hb_MatMul3D() - Batch matrix multiply [batch][seq][d] x [d][d_out]
      hb_LayerNorm3D() - Full LayerNorm forward in C (returns output+cache)
      hb_LayerNormBackward3D() - Full LayerNorm backward in C (returns grads)
      hb_ScaledDotAttention() - Fused scaled dot-product attention (QKT+softmax+V)
      hb_EmbeddingLookup3D() - Fast batch embedding lookup from 2D matrix
    • Transformer:Forward() and Backward() now use C-accelerated calls, replacing
      triple-nested Harbour loops with single C function calls.
    • LayerNorm:Forward() and Backward() reduced from 30 lines each to 5 lines.
    • MultiHeadAttention:Forward() uses fused hb_ScaledDotAttention() per head.
    • FeedForward:Forward() uses hb_MatMul3D() for batch multiplication.
  • New sample: samples/ai/transformer.prg - Interactive Transformer demo with
    unified FiveWin dialog showing live training progress, accuracy metrics,
    next-word predictions (top-5 with probabilities), and autoregressive text
    generation. Trained on a 141-phrase Spanish corpus with 120 epochs.

  • Enhancement: Updated all build scripts to support Microsoft Visual Studio 2026
    (Community edition, version 18). The vcvarsall.bat path has been updated from
    "2022\Community" to "18\Community" in all .bat files: mfwh.bat, mfwh64.bat,
    mfwhx64.bat, mfwhxh64.bat, dll\rc2dll64.bat, and the sample build scripts
    (buildh32, buildh64, buildx32, buildxh64, bldmbh32, EasyReport, webview, xlsxlibhb).

  • Fix: Resolved linker error LNK2005 "HB_FUN_MESSAGEBOX already defined" that occurred
    when linking with xhb.lib. The internal C function MESSAGEBOX in source\function\msgs.c
    and source\winapi\msgbox.c has been renamed to FW_MESSAGEBOX to avoid symbol collision
    with xhb.lib(xhbwin.obj). An #xtranslate directive has been added to fivewin.ch so
    that any existing user code calling MessageBox() is automatically redirected to
    FW_MessageBox() at compile time, requiring no source code changes.

  • Enhancement: FW_SetDarkMode() - Global dark mode for the entire application.
    A single call enables dark mode for all existing and future dialogs:
    FW_SetDarkMode( .T. ) // enable with default colors
    FW_SetDarkMode( .T., nClrText, nClrBack ) // enable with custom colors
    FW_SetDarkMode( .F. ) // disable (restore light mode)
    FW_SetDarkMode() // query current state (.T./.F.)
    When enabled, TDialog:Initiate automatically applies SetDarkMode() to every new
    dialog. Existing open windows are themed immediately. TDialog:CtlColor forces
    dark colors on resource-only static controls (SAYs, GroupBoxes, Radio, Checkbox).

    Example:

    #include "FiveWin.ch"

    function Main()

    local oWnd, oBar

    FW_SetDarkMode( .T. )

    DEFINE WINDOW oWnd TITLE "Dark Mode App"

    DEFINE BUTTONBAR oBar OF oWnd

    DEFINE BUTTON OF oBar ACTION TestDialog()
    DEFINE BUTTON OF oBar ACTION FW_SetDarkMode( ! FW_SetDarkMode() ), ;
    oWnd:Refresh() // toggle dark/light

    ACTIVATE WINDOW oWnd

    return nil

    function TestDialog()

    local oDlg, cName := Space( 30 )

    DEFINE DIALOG oDlg TITLE "Test" SIZE 300, 200

    @ 1, 1 SAY "Name:" OF oDlg
    @ 1, 4 GET cName OF oDlg

    @ 3, 1 CHECKBOX lCheck VAR .T. PROMPT "Option 1" OF oDlg
    @ 4, 1 CHECKBOX lCheck2 VAR .F. PROMPT "Option 2" OF oDlg

    @ 6, 4 BUTTON "OK" OF oDlg ACTION oDlg:End()

    ACTIVATE DIALOG oDlg CENTERED

    return nil

  • Enhancement: TDialog:SetDarkMode( nClrText, nClrBack ) - Unified cascading dark
    mode. Handles SAY, Group, Radio, Checkbox, TGet, TComboBox, TMultiGet, TListBox,
    TXBrowse (with columns), TFolder (per page), and TBar automatically.
    Both parameters default to RGB(220,220,220) / RGB(30,30,30).

  • Enhancement: TBar:SetDarkMode( nClrText, nClrBack ) - Dark mode for buttonbars.
    Same signature as TDialog/TFolder. Detected automatically by the cascade.
    FW_SetDarkMode(.F.) restores default light gradients via SetGradients().

  • Enhancement: TTabs - Dark mode support. Paints flat solid tabs with configurable
    colors instead of bitmap-based tabs. Text color respects ::nClrText.

  • Enhancement: TTxtEdit - Improved text selection with mouse and keyboard:

    • Anchor-based selection with consistent absolute line/col coordinates
    • Proper multi-line partial rendering, drag selection, Shift+Arrow/Home/End
    • Double-click word selection, multi-line DelBlock, partial-line Copy
    • Backspace/Delete/typing replaces selected block, Ctrl+V deletes before paste
    • Keywords (cTokens1) rendered in bold with slightly larger font
  • Enhancement: VisualFW IDE - Dark mode applied to all IDE windows: toolbars,
    source editor tabs, buttonbars, Object Inspector, Options and Tools dialogs.
    Dark Mode menu item shows a check mark. Window layout fixes for proper
    alignment of Inspector and Source Editor borders.

  • Fix: VisualFW IDE - "Duplicated Id: No: 201" crash when opening the Options dialog.
    The TXBrowse on the Project Option page was auto-assigned ID 201, colliding with the
    ID_GETRESOURCE GET already registered on that dialog page. Fixed by setting the shared
    TControl CLASSDATA counter (nInitID) past 201 before the XBrowse is created, ensuring
    the auto-assigned ID is always >= 203.

  • Fix: VisualFW IDE - "Unrecoverable error 9003: Too many recursive error handler calls"
    in the FWH error dialog (errsysw.prg). The ListBox was created with "@ LISTBOX n ITEMS
    aStack" (without VAR), so n remained a string (aStack[1]) instead of the TListBox
    object. Calling n:SetColor() then failed, triggering infinite recursion. Fixed by using
    "@ LISTBOX oLbx VAR n ITEMS aStack" and calling oLbx:SetColor().

  • Enhancement: fixed Class TGemini for images support. Thanks to Roberto for his feedback:

    viewtopic.php?p=284399#p284399

  • Fix: Several fixes in TFont, TWindow, TTreeView and TFolder classes related to
    form serialization (.ffm): correct font handle restoration, proper coordinate
    handling, TFolder page array bounds, and TFolder per-page background color
    preservation across save/load cycles.

  • Enhancement: VisualFW IDE - Multiple improvements to the Object Inspector: multi-line
    editing for aPrompts on TFolder/TTabs controls, real-time tab switching when editing
    nOption, fixed color/font/file dialog double-prompting, and improved color persistence.

  • Enhancement: VisualFW IDE - Dark Mode toggle added under Views menu, switching the
    entire IDE between light and dark color schemes.

  • Enhancement: VisualFW IDE - Build system modernized with a single visualfw.hbp file
    supporting both 32-bit (BCC) and 64-bit (MSVC) builds.

  • Enhancement: FiveWin Library - Refactored event resolution in TWindow:Load() using
    variadic ellipsis and a new FW_EvMethod() helper for more robust event restoration.

  • Enhancement: TFolderEx PaintLR() method now supports multiline text (stacked vertical
    characters) when the layout is LEFT or RIGHT. If a tab prompt contains Chr(13), the text
    is drawn with a non-rotated font using DT_CENTER (without DT_SINGLELINE), allowing
    characters to be displayed one below the other. This mirrors the same Chr(13) multiline
    support that PaintTB() already had for TOP/BOTTOM layouts. Fully backwards compatible ÔÇö
    existing prompts without Chr(13) are unaffected.

  • Enhancement: TOutlookMail class improvements:

    • Added hUser DATA to cache the Microsoft Graph user profile, avoiding redundant
      API calls on every send().
    • revoke() now clears the cached hUser on disconnect.
    • testoutlook.prg: token is now persisted via saveStore() after authentication and
      after sending, so rotated refresh tokens survive application restarts.
    • Applied Harbour coding standards (3-space indentation, proper block nesting,
      parentheses spacing) to oauth.prg, outlookmail.prg and testoutlook.prg.
  • Enhancement: samples/outlook/testoutlook.rc minor changes for 32 bits.

February 2026

  • Fix: The is2byteansi() function in source\winapi\fwunicode.c has been updated to
    correctly support Thai (CP874), Simplified Chinese GBK (CP936), and Traditional
    Chinese Big5 (CP950) codepages. This prevents false positives during UTF-8
    detection in is_utf8(), resolving potential garbled text issues with double-byte
    characters in these languages.

  • Fix: MessageBox() and FWMESSAGEBOX() (used by MsgInfo(), MsgStop(), etc) now properly display
    Unicode characters (e.g., Chinese Big5) by using MessageBoxW and fw_parWide() for correct codepage conversion.
    Many thanks to Steven Liu for his feedback!

  • Enhancement: source\winapi\fwunicode.c functions now support Big5 (CP950) and GB (CP936)
    Harbour codepages, ensuring correct Unicode conversion.

  • Enhancement: Class TWebView2 Method New() now accepts a second optional parameter cUserDataFolder.
    This allows creating isolated WebView2 sessions (e.g., for fresh logins) by initializing
    the environment with a custom user data folder.

  • Fix: GDI+ memory leaks fixed in gdipfwh.cpp. samples\ui\xbrowse\testxbrw.prg now
    works without leaks.

  • Fix: Audit gdipfwh.cpp for Memory Leaks Completed the comprehensive audit of gdipfwh.cpp

    Identified and fixed multiple critical memory leaks where GDI+ objects (Graphics, FontFamily,
    Bitmap, Brush) were allocated with new but not deleted. Applied fixes to 11 functions including
    GDIP_RINGGRAD, GDIP_DRAWARROW, GDIP_DRAWTEXT, and image handling functions. Updating documentation
    and signaling readiness for recompilation.

    viewtopic.php?p=283679#p283679


January 2026

  • Enhancement: CLASS TTaskPanel METHOD AddLink( cPrompt, bAction, cBitmap, oFnt, nClrT,
    nClrP, nClrO, cMsg, cTooltip ) has been enhanced to support all parameters:

    viewtopic.php?p=283478#p283478

    Many thanks to Alex Da Silva!

  • Fix: Fixed PDF title in MSPrintToPDF()


    viewtopic.php?p=283516#p283516

    Many thanks to Enrico Maria Giordano!

  • New: function FileHash() -- cHashValue it returns an unique hash string for the provided filename.

    Many thanks to Juan Navas! (AdaptaPro)

  • Fix: Bug fixed in METHOD Destroy() CLASS Region in Class Region:

    viewtopic.php?p=283618#p283618

  • Fix: Successfully applied and verified GDI leak fixes in xbrowse.prg for both TXBrowse:Destroy()
    and TXBrwColumn:End() :

    The Destroy() and End() methods now correctly identify and destroy:

    • Icons using DestroyIcon()

    • GDI+ Images using GDIP_DeleteImage()

    • Bitmaps using PalBmpFree()

regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply