What's New in FWH 26.07
Highlights of FiveWin for Harbour/xHarbour version 26.07 (July 2026).
See also whatsnew.txt in the FWH root for the full day-by-day log.
DesktopWeb — one PRG, desktop + browser (login.prg)
New sample samples/DesktopWeb/login.prg: a single application that
exposes the same HTML/CSS/JS to the desktop shell and to any
web browser.
- Multi-thread HTTP server on port 8080
(
hb_threadStart+hb_socket*; build with-mt) - Desktop:
TWebView2navigates tohttp://localhost:8080/ - Browser: open the same URL
- Shared pages: modern login card and clinic appointments dashboard
- Shared business logic:
ValidateLogin()in Harbour; cookie sessionDWSESS - API:
POST /api/login,POST /api/cmd,GET /dashboard,GET /logout - Demo credentials:
admin/1234,demo/demo
Build: cd samples\DesktopWeb then build.bat
(or build_new.bat login hm64 -mt). Requires WebView2 Runtime
for the desktop window. See
TWebView2.
Remote View + WebView2 (testrvweb)
New sample samples/RemoteView/testrvweb.prg combines
Remote View with TWebView2:
- Native FWH toolbar (demo HTML, Navigate, Eval, click counter)
- Embedded Edge WebView2 with demo page and
SendToFWH→bOnBindbridge RemoteViewStarton port 8080 so the same window is live from any browser on the LAN
Layout tip for same-screen development: place the real desktop window low on the
screen (FROM nTop, nLeft … PIXEL) so the browser image stays
above it; use a modest RemoteViewSetOffset. Requires the WebView2
Runtime. Full notes:
Remote View + WebView2.
XBrowse multi-line cell + LimitText (xbrml250 sample)
New sample samples/ui/xbrowse/xbrml250.prg shows how to edit a
long character column in several lines inside the cell, while capping the
length (example: 250 characters).
- Use
nDataLines >= 2and leavecEditPictureempty so XBrowse creates aTMultiGet(word-wrap while typing). SettingcEditPicture := Replicate( "X", 250 )forces a single-lineTGetand disables wrap. bOnPreEdit: alwaysRTrim()the editor text, thenoEditGet:LimitText( nMax ). Fixed-length padded values (PadR/Space(250)) already fill the limit and block typing;TMultiGetdoes not auto-SelectAll likeTGet.- Keys: ENTER ends the cell edit; Ctrl+ENTER or
Shift+ENTER inserts one real line break. Do not call
Replace( CRLF )yourself or you get two breaks (your insert plus the multiline EDIT /ES_WANTRETURN). bOnPostEdit: storeLeft( xVal, nMax )(optionallyPadRif the backend needs a fixed width).
Full notes: TXBrowse multi-line cell edit.
TControl F1 / CHM help — empty nHelpId bubbles to parent
F1 / WM_HELP is delivered to the focused control.
When the control had an empty nHelpId, FWH returned without
opening help, so oWnd:nHelpId / oDlg:nHelpId was
never used. TControl:__HelpTopic() now calls
::oWnd:HelpTopic() so the window/dialog context is applied.
CHM context help behaviour:
- Control numeric
nHelpId—HelpPopup()(small popup; requiresSetHelpPopup( "popups.txt" )for CHM text popups) - Control character topic name —
HelpTopic()full CHM viewer - Window/dialog
nHelpIdor empty control id — parentHelpTopic()full CHM viewer - Explicit
HelpTopic( nId )/HelpTopic( "topic" )— always full CHM viewer
Topic names must match real .htm files inside the CHM.
HelpSetPos() only applies to classic .hlp, not CHM.
Sample: samples/test/testchmhlp.prg (+ popups.txt).
Rebuild the PRG library after update.
samples/misc/dshow.prg — webcam (Media Foundation)
samples/misc/dshow.prg shows live webcam preview and BMP snapshot
in a FiveWin dialog. On Windows 10/11, DirectShow
IVideoWindow / GetCurrentImage often produces a
black buffer even when the filter graph is running (verified
with FaceTime HD / UVC). The sample therefore uses
Media Foundation through C code embedded directly in the PRG.
- Self-contained C: the former
mfcam.cpphelper was converted to C inside#pragma BEGINDUMP. GUIDs and minimal COM vtables are declared locally; MF/COM entry points are resolved at runtime from systemole32,mfplat,mfandmfreadwriteDLLs. Nomfcam.dll, MF SDK headers ormf*.libimport libraries are required. - UI: a timer grabs each frame to a BMP and loads it into
a real
IMAGEcontrol (live preview) and optional snapshot. - Toolchains: any sample variant via
build_new.bat; verified with xHarbour + BCC32 (xb32). - Diagnostics (optional):
build_camtest.batbuilds pure C++ tests without FiveWin —camtest_mf64.exe(MF, recommended) andcamtest64.exe(DirectShow; often black on the same hardware).
cd samples\misc
build_new.bat dshow xb32
dshow.exe
Related: class TWebCam (legacy VFW) and
samples/web/webcam.prg.
FW_DemoDB() — new demo MySQL host
The free cloud demo MySQL server used by FWH samples has moved.
FW_DemoDB() now connects to a single host:
- Host:
mail.fivetechsoft.com - Database:
fivetech_test - User:
fivetech_test - Password:
fivewin2026
The former second server (nServer = 2) was removed. If the first
parameter is a character string it is still treated as cLib
("FWH", "ADO" or "DLP"); numeric values
are ignored. Existing sample calls need no source changes after rebuilding the
PRG library.
oCn := FW_DemoDB() // FWH native (default)
oCn := FW_DemoDB( "ADO" ) // via ADO
oCn := FW_DemoDB( "DLP" ) // via Dolphin, if linked
See also MariaDB / MySQL — FW_DemoDB().
TWebView2 — Fixed Version Runtime
TWebView2():New() accepts a third optional parameter
cBrowserExecutableFolder (Microsoft's browserExecutableFolder).
When set, WebView2 loads a Fixed Version / standalone Runtime from that folder instead
of the Evergreen Runtime installed on the system.
- Useful on older OS (e.g. Windows Server 2012 R2) where current Evergreen builds no longer work
- Useful when the Runtime cannot be installed machine-wide
- Path = Fixed Version root (folder that contains
msedgewebview2.exe) - Must be passed in the constructor (the environment is created in
New()) - Existing code without the parameter is unchanged
oWeb := TWebView2():New( oWnd, , "C:\MyApp\WebView2Runtime" )
Also fixed: the second parameter cUserDataFolder was being overwritten with a
default AppData path; it is now honoured.
Full reference: TWebView2.
Other July 2026 fixes
- MAPISendMail — when TO is given with a single parameter, fill empty
lpszAddressfrom the display name (Thunderbird / stricter Simple MAPI clients) - TXBrowse:SelectRow() — zero-divisor when using multi-select columns without totals
- window.prg — added TSBROWSE to
cBrwClassList - dshow.prg — webcam sample via self-contained Media Foundation C code; see above
- TControl F1 help — empty
nHelpIdbubbles to parent (see above)