FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Saber si una ventana no MDI, esta abierta.
Posts: 199
Joined: Wed Jan 02, 2019 08:36 AM
Saber si una ventana no MDI, esta abierta.
Posted: Sun Oct 19, 2025 06:47 AM
Hola a todos.
para una DEFINE WINDOW que no sea MDI
se puede?
gracias !!!
Cesar Cortes Cruz
SysCtrl Software
Mexico
Bueno, primero que todo explicar que en Harbour + FiveWin, cuando trabajas con ventanas (TWindow, TDialog, TMDIChild, etc.), cada ventana es realmente un objeto (instancia de una clase), y normalmente no hay un array global automático que mantenga una lista de “ventanas hijas” no-MDI de una ventana principal.
FiveWin no mantiene automáticamente una lista de ventanas hijas genéricas.
La función WndMain() solo devuelve la ventana principal (global _WndMain), pero no hay un array interno público con todas las ventanas abiertas.

Sin embargo, hay varias formas de identificar o mantener referencia a las ventanas hijas, dependiendo de cómo las crees.

Te dejo un ejemplo totalmente funcional.
En este ejemplo la variable que contiene las ventanas, es STATIC. Si necesitas aplicarlo a un programa/sistema con varios prg puedes ponerlo en una variable global o pasarla como referencia.
#include "fivewin.ch"


STATIC hWndMap := {}

FUNCTION Main()

   LOCAL oWnd

   DEFINE WINDOW oWnd TITLE "Ventana Principal"
   RegistraVentana(oWnd)

   @1,1 BUTTON "Crear Ventana Hija" OF oWnd ACTION CrearVentanaHija(oWnd) size 200,25
   @4,2 SAY "Pulsa con el botón derecho del ratón en el fondo de cada una de las ventanas hijas. Se desplegará un menu. Selecciona la ventana que quieras abrir. Tambien puedes asociar ese menu a un boton, etc.." OF oWnd SIZE 200,200 COLOR CLR_GRAY

   ACTIVATE WINDOW oWnd
RETURN NIL

// -----------------------------------------------------
// Crea una ventana hija y la registra
// -----------------------------------------------------
FUNCTION CrearVentanaHija(oParent)
   LOCAL oWnd, nNum := Len(hWndMap) + 1

   DEFINE WINDOW oWnd TITLE "Hija #" + LTrim(Str(nNum)) FROM nNum*100, nNum*100 TO (nNum*100)+200, (nNum*100)+500 PIXEL
   RegistraVentana(oWnd)

   oWnd:bValid := { || QuitaVentanaDeMapa(oWnd) }
   oWnd:bRClicked := { |a,b| MenuVentanas(a,b,oWnd) }

   ACTIVATE WINDOW oWnd
RETURN NIL

// -----------------------------------------------------
// Registra la ventana en el mapa global
// -----------------------------------------------------
FUNCTION RegistraVentana(oWin)
   aadd( hWndMap, { oWin:hWnd, oWin } )
RETURN NIL

// -----------------------------------------------------
// Elimina una ventana del mapa global al cerrarse
// -----------------------------------------------------
FUNCTION QuitaVentanaDeMapa(oWin)

LOCAL nElemento := 0
LOCAL I:=1, lSucces := .f.

FOR I=1 TO LEN(hWndMap)
   IF hWndMap[I,2]:cCaption==oWin:cCaption
      nElemento := i
      lSucces := .t.
   ENDIF
NEXT I

IF lSucces = .t.
   aDel(hWndMap,nElemento)
   aSize(hWndMap,LEN(hWndMap)-1)
ENDIF

RETURN NIL


// --------------------------------------------------
// MUESTRA UN MENU CON TODAS LAS VENTANAS
// --------------------------------------------------

FUNCTION MenuVentanas( nRow, nCol, oWnd )

LOCAL aVentanas:={}
LOCAL I:=1
LOCAL oMenu

FOR I=1 TO LEN(hWndMap)
   AADD(aVentanas, hWndMap[i,2]:cCaption)
NEXT I

MENU oMenu POPUP
   FOR I=1 TO LEN(aVentanas)
      IF hWndMap[i,2]:lFocused = .t.
         MENUITEM aVentanas[i] OF oMenu CHECKED
      ELSE
         MENUITEM aVentanas[i] OF oMenu
      ENDIF
   NEXT I
   SEPARATOR
   MENUITEM "Cerrar menú" OF oMenu ACTION oMenu:End()
ENDMENU

FOR I=1 TO LEN(aVentanas)
   oMenu:aItems[i]:bAction := HazBlock(i)
NEXT I

oMenu:Activate( nRow,nCol, oWnd , .f. )

RETURN(NIL)

//-----------------------------------------------------------------------------
// Make code block with number of any MDI windows

FUNCTION HazBlock( x ) //CLASS TMdiChildFolder

Return &("{ || SelectWin(" +LTrim(Str(x))+" ) }" )

//-----------------------------------------------------------------------------
// Selecciona la ventana n
FUNCTION SelectWin(nNumeroVentana)

   hWndMap[nNumeroVentana,2]:SetFocus()

return(nil)
Espero que te ayude o te inspire. Si expecificas mas tu pregunta, tal vez pueda orientar la respuesta a lo que necesitas.
Saludos
Jesús Marín
Jesús Marín
deumare@gmail.com
Posts: 1144
Joined: Mon Feb 05, 2007 07:15 PM
Re: Saber si una ventana no MDI, esta abierta.
Posted: Mon Oct 20, 2025 05:21 PM
Que sencillo lo haces Jesús
muchas gracias !!! :D
Cesar Cortes Cruz

SysCtrl Software

Mexico



' Sin +- FWH es mejor "

Continue the discussion