Revisé el fuente y el historial git. La conclusión: ON INIT no fue eliminado ni modificado en FWH2603 — el mecanismo sigue
exactamente igual:
• El comando ACTIVATE WINDOW ... ON INIT <uInit> (include/fivewin.ch:1909) sigue expandiendo a <oWnd>:bInit := { |Self| <uInit>
} (lÃnea 1930).
• TWindow:Activate() sigue evaluándolo en source/classes/window.prg:1186-1188 (Eval( ::bInit, Self )), código que no cambia
desde 2007.
O sea, esto es equivalente:
ON INIT( DLGINICIAL() ) // idéntico a:
:bInit := {|| DLGINICIAL() }
Lo que realmente cambió en tu workaround no es bInit vs ON INIT, sino esto:
:bInit := {|| oWnd:Show(), oWnd:Center(), oWnd:Maximize(), DLGINICIAL() }
La clave: en Activate(), el bInit se evalúa antes de ShowWindow() (lÃnea 1207) y antes de arrancar el bucle de mensajes (WinRun,
lÃnea 1214). Es decir, con el código viejo, DLGINICIAL() corrÃa con la ventana principal todavÃa oculta y sin message loop
activo. Tu versión nueva muestra y maximiza la ventana explÃcitamente antes de llamar DLGINICIAL() — eso es lo que lo "arregla",
no el cambio de sintaxis.
Sobre por qué dejó de funcionar en 26.03: en ese release no hubo cambios en el path bInit/Activate (los commits de esa época
fueron fixes de warnings, Unicode/chars acentuados, codepages CP1252 y toolchain GCC 14.3). Lo más probable es que algo dentro
de DLGINICIAL() — tÃpicamente activar un diálogo modal — ahora requiera que la ventana padre esté visible. Sin ver DLGINICIAL()
no puedo señalar el commit exacto, pero si quieres lo reviso: dime qué hace esa función (o pégala aquÃ) y rastreo el cambio
concreto.
Un aviso adicional si actualizas más allá de 26.03: el commit 488140e42 (26.08) añadió FW_WndDarkMode( Self ) justo después del
Eval( ::bInit ) en Activate() — si creas controles dentro de bInit, el dark mode global se les aplicará encima.