Novedades en FWH 26.07
Novedades de FiveWin for Harbour/xHarbour versión 26.07 (julio 2026).
Consulte también whatsnew.txt en la raíz de FWH para el diario completo.
DesktopWeb — un PRG, desktop + navegador (login.prg)
Nuevo sample samples/DesktopWeb/login.prg: una sola aplicación
que expone el mismo HTML/CSS/JS al escritorio y a cualquier
navegador.
- Servidor HTTP multi-hilo en el puerto 8080
(
hb_threadStart+hb_socket*; compilar con-mt) - Desktop:
TWebView2navega ahttp://localhost:8080/ - Navegador: la misma URL
- Páginas compartidas: login moderno y dashboard de citas de clínica
- Lógica compartida:
ValidateLogin()en Harbour; sesión por cookieDWSESS - API:
POST /api/login,POST /api/cmd,GET /dashboard,GET /logout - Demo:
admin/1234,demo/demo
Compilar: cd samples\DesktopWeb y build.bat
(o build_new.bat login hm64 -mt). Requiere Runtime WebView2
para la ventana desktop. Ver
TWebView2.
Remote View + WebView2 (testrvweb)
Nuevo ejemplo samples/RemoteView/testrvweb.prg que combina
Remote View con TWebView2:
- Barra de botones FWH nativos (HTML demo, Navigate, Eval, contador)
- Edge WebView2 embebido con página demo y puente
SendToFWH→bOnBind RemoteViewStarten el puerto 8080 para ver/controlar la misma ventana desde cualquier navegador de la LAN
Disposición en la misma pantalla: ventana desktop abajo
(FROM nTop, nLeft … PIXEL) para que la imagen del
navegador quede arriba; RemoteViewSetOffset modesto. Requiere
Runtime WebView2. Detalle:
Remote View + WebView2.
XBrowse multilínea + LimitText (sample xbrml250)
Nuevo sample samples/ui/xbrowse/xbrml250.prg: edición de una
columna de texto larga en varias líneas dentro de la celda, con tope de
longitud (ejemplo: 250 caracteres).
nDataLines >= 2ycEditPicturevacío para que XBrowse cree unTMultiGet(wrap al escribir). Si ponescEditPicture := Replicate( "X", 250 )se fuerza unTGetde una sola línea y se pierde el wrap.bOnPreEdit: siempreRTrim()del texto del editor y luegooEditGet:LimitText( nMax ). Valores rellenados a longitud fija (PadR/Space(250)) llenan el límite y impiden escribir;TMultiGetno hace SelectAll comoTGet.- Teclas: Intro termina la edición; Ctrl+Intro o
Shift+Intro insertan un solo salto de línea real. No uses
Replace( CRLF )a mano: se duplica el salto (tu inserción más el EDIT multilínea /ES_WANTRETURN). bOnPostEdit: guardarLeft( xVal, nMax )(opcionalmentePadRsi el backend exige ancho fijo).
Detalle: TXBrowse edición multilínea.
TControl F1 / ayuda CHM — nHelpId vacío sube al padre
F1 / WM_HELP llega al control con el foco.
Si el control tenía nHelpId vacío, FWH no abría ayuda y no se
usaba oWnd:nHelpId / oDlg:nHelpId.
TControl:__HelpTopic() ahora llama a
::oWnd:HelpTopic() para aplicar el contexto de la ventana/diálogo.
Comportamiento de la ayuda contextual CHM:
- Control con
nHelpIdnumérico —HelpPopup()(popup pequeño; requiereSetHelpPopup( "popups.txt" )para popups de texto CHM) - Control con nombre de topic (carácter) —
HelpTopic()visor CHM completo - nHelpId de ventana/diálogo o control vacío —
HelpTopic()del padre, visor completo HelpTopic( nId )/HelpTopic( "topic" )explícito — siempre visor CHM completo
Los nombres de topic deben coincidir con los .htm reales del CHM.
HelpSetPos() solo aplica a .hlp clásico, no a CHM.
Sample: samples/test/testchmhlp.prg (+ popups.txt).
Recompilar la librería PRG tras la actualización.
samples/misc/dshow.prg — webcam (Media Foundation)
samples/misc/dshow.prg muestra vista previa de webcam y captura BMP
en un diálogo FiveWin. En Windows 10/11, DirectShow
IVideoWindow / GetCurrentImage suele devolver un
buffer negro aunque el grafo esté en Running (comprobado con
FaceTime HD / UVC). El sample usa por tanto
Media Foundation mediante código C integrado en el PRG.
- C autocontenido: el antiguo helper
mfcam.cppse convirtió a C dentro de#pragma BEGINDUMP. Los GUIDs y vtables COM mínimas se declaran localmente; los puntos de entrada MF/COM se resuelven en runtime desde las DLLs del sistemaole32,mfplat,mfymfreadwrite. No hacen faltamfcam.dll, cabeceras del SDK de MF ni librerías de importaciónmf*.lib. - UI: un timer graba cada frame a BMP y lo carga en un
control
IMAGEreal (vista en vivo) y opcionalmente el snapshot. - Compiladores: cualquier variante con
build_new.bat. Verificado con Harbour 64 bits (hb64,hm64) y xHarbour + BCC32 (xb32). - Fix 64 bits (ago 2026): el C embebido incluye
hbapiitm.hpara quehb_itemArrayNew/hb_itemReturnReleaseusen prototipos de puntero. Sin él, los builds 64 bits caían con ACCESS_VIOLATION enMfCamStatus()tras Connect (retorno truncado aint). - Diagnóstico (opcional):
build_camtest.batgenera tests C++ puros sin FiveWin —camtest_mf64.exe(MF, recomendado) ycamtest64.exe(DirectShow; a menudo negro en el mismo PC).
cd samples\misc
build_new.bat dshow hb64
:: o: build_new.bat dshow hm64 / xb32
dshow.exe
Relacionado: clase TWebCam (VFW legado) y
samples/web/webcam.prg.
FW_DemoDB() — nuevo servidor demo MySQL
El servidor MySQL demo en la nube usado por los samples de FWH ha cambiado.
FW_DemoDB() se conecta ahora a un único host:
- Host:
mail.fivetechsoft.com - Base de datos:
fivetech_test - Usuario:
fivetech_test - Password:
fivewin2026
Se ha eliminado el segundo servidor (nServer = 2). Si el primer
parámetro es una cadena se sigue usando como cLib
("FWH", "ADO" o "DLP"); los valores
numéricos se ignoran. Los samples existentes no requieren cambios de código
tras recompilar la librería PRG.
oCn := FW_DemoDB() // nativo FWH (por defecto)
oCn := FW_DemoDB( "ADO" ) // vía ADO
oCn := FW_DemoDB( "DLP" ) // vía Dolphin, si está enlazado
Ver también MariaDB / MySQL — FW_DemoDB().
TWebView2 — Fixed Version Runtime
TWebView2():New() acepta un tercer parámetro opcional
cBrowserExecutableFolder (el browserExecutableFolder de Microsoft).
Cuando se indica, WebView2 carga un Runtime Fixed Version / standalone desde esa carpeta
en lugar del Runtime Evergreen instalado en el sistema.
- Útil en SO antiguos (p. ej. Windows Server 2012 R2) donde el Evergreen actual ya no funciona
- Útil cuando no se puede instalar o actualizar el Runtime en la máquina
- Ruta = raíz del Fixed Version (carpeta con
msedgewebview2.exe) - Debe pasarse en el constructor (el entorno se crea en
New()) - El código existente sin el parámetro no cambia
oWeb := TWebView2():New( oWnd, , "C:\MiPrograma\WebView2Runtime" )
También se corrigió el segundo parámetro cUserDataFolder: se sobrescribía con
una ruta por defecto en AppData; ahora se respeta.
Referencia: TWebView2.
Otros arreglos de julio 2026
- MAPISendMail — con TO de un solo parámetro, rellena
lpszAddressvacío desde el nombre (Thunderbird / clientes Simple MAPI estrictos) - TXBrowse:SelectRow() — división por cero con columnas multi-select sin totales
- window.prg — TSBROWSE añadido a
cBrwClassList - dshow.prg — sample webcam con código C Media Foundation autocontenido;
Harbour 64 bits necesita
hbapiitm.hen el C embebido (ver arriba) - TControl F1 help —
nHelpIdvacío sube al padre (ver arriba)
TDashGauge — Medidor Semicircular para Dashboards
Nuevo sample samples/tgauge/TDashGauge.prg: una subclase de
TControl que renderiza un medidor semicircular con arcos gruesos,
aguja de predicción y punto central — todo con doble buffer via GDI para
eliminar parpadeo.
- Arrastre izquierdo: mueve el valor de la zona activa al ángulo del mouse
- Clic derecho: cicla zonas — Meta → Actual → Predicción
- Rueda del ratón: ajusta el valor ±1% por notch
- API:
SetData(),SetValue(),SetTitle(),SetColors() - Compilar:
build_new.bat tgauge hb32