Hola a todos.
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.
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
para una DEFINE WINDOW que no sea MDIBueno, 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.
se puede?
gracias !!!
Cesar Cortes Cruz
SysCtrl Software
Mexico
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)Saludos
Jesús Marín
Jesús Marín
deumare@gmail.com
deumare@gmail.com