Como saber si una venta Dialog esta abierta
Como saber si una venta Dialog esta abierta
Ahora que he empezado a trabajar con Dialogos NOWAIT, me encuentro con el problema que cada vez que pulso sobre la misma opcion del menu se me abre de nuevo una ventana de dialogo, previamente abierta, pudiendo tener el usuario abiertas las mismas ventanas vez tras vez.
¿Existe alguna funcion para saber si dicha ventana ya esta abierta, y si es afirmativo que devuelva un valor que me pueda servir para indicarselo al usuario, evitando que se vuelva a abrir?
Gracias de antemano.
Uns saludo.
¿Existe alguna funcion para saber si dicha ventana ya esta abierta, y si es afirmativo que devuelva un valor que me pueda servir para indicarselo al usuario, evitando que se vuelva a abrir?
Gracias de antemano.
Uns saludo.
- armando.lagunas
- Posts: 340
- Joined: Mon Oct 05, 2009 3:35 pm
- Location: Curico-Chile
- Contact:
Re: Como saber si una venta Dialog esta abierta
Hola,
yo realizo lo siguiente:
en el programa main de tu aplicación coloca lo siguiente:
y después al comienso de tu prg que contenga el dialogo NOWAIT
colocas esto:
solamente cuando salgas del dialogo, ya sea con la "X" o ESC o la tecla que definiste como salida, se ejecuta el valid final del dialogo y la variable vuelve a quedar Nil, y asi puedes ejecutarlo nuevamente.
espero que me entiendas y te sirva, saludos
yo realizo lo siguiente:
en el programa main de tu aplicación coloca lo siguiente:
Code: Select all
#include "fivewin.ch"
memvar oApp
function main
public oApp
...
...
oApp:Taplication()
...
...
return nil
CLASS Taplication
DATA aProc INIT {NIL,NIL,NIL,.....} // n dialogos NOWAIT
...
...
ENDCLASS
colocas esto:
Code: Select all
#include "fivewin.ch"
memvar oApp
function dialogonowait()
IF oApp:aProc[1] = Nil // el procedimiento, si es nil quiere decir que lo has ejecutado una vez
oApp:aProc[1] := ProcName() // a qui le asignas el nombre del procedimiento
ELSE
MsgStop("Este procedimiento se encuentra activo")
RETURN Nil
ENDIF
...
...
DEFINE DIALOG oDlg RESOURCE ...
...
ACTIVATE DIALOG NOWAIT CENTER VALID ( oApp:aProc[1]:=NIL, .T.) // aqui lo dejas nil al cerrar el dialog
RETURN nil
espero que me entiendas y te sirva, saludos
Re: Como saber si una venta Dialog esta abierta
Armando, gracias por tu ayuda, creo que entiendo el sistema, voy a hacer unas pruebas.
- Patricio Avalos Aguirre
- Posts: 1028
- Joined: Fri Oct 07, 2005 1:56 pm
- Location: La Serena, Chile
- Contact:
Re: Como saber si una venta Dialog esta abierta
Hola
Prueba de esta manera
Prueba de esta manera
Code: Select all
MENU oMenu POPUP 2007
MENUITEM "&Ciudades" ACTION NewTablas( oMenuItem ) FILE "IMAGEN\NEWIMG ciu16x16.bmp"
...
return
//-----------------------------------------------------------
PROCEDURE NewTablas( oItem )
oItem:Disable()
ACTIVATE DIALOG NOWAIT CENTER VALID ( oItem:Enable(), .t. )
return
Saludos
Patricio
__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Patricio
__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Re: Como saber si una venta Dialog esta abierta
Hola txon,
Yo uso esta función para ver las ventanas activas abiertas:Si cualquier título (variable cTitle) de dialogo/ventana coincide con el buscado ya sabes que esta abierto.
De todas formas el metodo de Armando esta muy bien.
Yo uso esta función para ver las ventanas activas abiertas:
Code: Select all
local aTitles:={},aHandles:={},hWnd:=GETWINDOW(GETDESKTOPWINDOW(),GW_CHILD)
WHILE hWnd != 0
cTitle:=alltrim(GETWINDOWTEXT(hWnd))
if cTitle<>""
if IsWindowVisible(hWnd) .and. GETWINDOW(hWnd,GW_OWNER)==0 // Solo las ventanas visibles
aadd(aTitles,cTitle)
aadd(aHandles,hWnd)
endif
endif
hWnd:=GETWINDOW(hWnd,GW_HWNDNEXT)
ENDDO
De todas formas el metodo de Armando esta muy bien.
Mi abuelo decía: Los aviones vuelan porque Dios quiere, y los helicópteros ni Dios sabe porque vuelan.
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
FWH 16.02, xHarbour 1.2.3, Harbour 3.2.0, WorkShop 4.5, AJ Make 0.30, Borlan BCC 7.00, VisualStudio 2013
Re: Como saber si una venta Dialog esta abierta
Amigos;
Les dejo el codigo de una clase, publica, desarrolada por Manuel Expósito Suarez
un sample:
Les dejo el codigo de una clase, publica, desarrolada por Manuel Expósito Suarez
Code: Select all
//----------------------------------------------------------------------------//
// AUTOR.....: Manuel Exp¢sito Su rez Soft 4U '2001 //
// e-Mail....: maex14@dipusevilla.es //
// CLASE.....: TWCapture //
// FECHA MOD.: 18/08/2001 //
// VERSION...: 1.00 //
// PROPOSITO.: Captura una ventana abierta por nuestro programa o por otra //
// aplicacion para poder enviarle mensajes como si fuera una //
// ventana mas de nuestro programa. //
//----------------------------------------------------------------------------//
// DATAS.....: * lCapture tiene un valor logico, .f. si la ventana no se //
// pudo capturar y .t. si si se hizo //
// //
// METODOS...: * New( cTitle ) es el constructor, cTitle es el titulo de una //
// ventana, si se le pasa intentara capturarla y pondra .t. en //
// ::lCapture //
// * WCapture se encarga de buscar la ventana y asignarla a //
// nuestro objeto TWindow. Si la captura podremos interactuar //
// como si fuera una ventana mas de nuestra aplicacion //
// //
// NOTAS.....: TWCapture esta heredada de TWindows por lo que tendremos a //
// nuestra disposicion todas las datas y metodos de esta clase. //
// No distingue entre mayusculas y minuscula pero si se tienen //
// en cuenta los espacios //
//----------------------------------------------------------------------------//
#include "Objects.ch"
//----------------------------------------------------------------------------//
CLASS TWCapture FROM TWindow
DATA lCaptured AS LOGICAL
METHOD New( cTitle ) CONSTRUCTOR
METHOD WCapture( cTitle )
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( cTitle ) CLASS TWCapture
if( ValType( cTitle ) == "C", ::WCapture( cTitle ), ::lCaptured := .f. )
return( Self )
//----------------------------------------------------------------------------//
METHOD WCapture( cTitle ) CLASS TWCapture
local hWnd := FindWindow( 0, cTitle )
::lCaptured := ( hWnd > 0 )
::hWnd := if( ::lCaptured, hWnd, 0 )
return( ::lCaptured )
//----------------------------------------------------------------------------//
Code: Select all
//----------------------------------------------------------------------------//
// TWCapture by Manu Exposito
// Demo02 de la clase TWCapture
//----------------------------------------------------------------------------//
#define CRLF chr( 13 ) + chr( 10 )
function Main()
local oWnd := TWCapture():New()
local cTitle := space( 40 )
oWnd:WCapture( "demo02 - bloc de notas" )
if !oWnd:lCaptured // Si no esta la ventana la ejecutamos nosotros
WinExec( "NotePad.exe demo02.prg" )
oWnd:WCapture( "demo02 - bloc de notas" ) // y la capturamos
endif
Jugar( oWnd )
return nil
//----------------------------------------------------------------------------//
static function Jugar( oWnd )
local cTitle := oWnd:cTitle
if oWnd:lCaptured
MsgAlert( "Muy bien, ya lo tenemos" + CRLF + ;
"_ la ventana con titulo: " + cTitle + ;
CRLF + "Ahora vamos a jugar con ella" )
MsgInfo( "La centramos" )
oWnd:Center()
MsgInfo( "Pinto una linea" )
oWnd:Line( 0, 0, 500, 500 )
MsgInfo( "La desplazo arriba a la izquierda" )
oWnd:Move( 0, 0 )
MsgInfo( "Ahora minimizo" )
oWnd:Minimize()
MsgInfo( "Ahora maximizo" )
oWnd:Maximize()
MsgInfo( "La restauro" )
oWnd:Restore()
MsgInfo( "Ahora cambio titulo" )
oWnd:SetText( "TWCapture captura ventanas - by Manu Exposito 2001" )
MsgInfo( "Ahora la oculto" )
oWnd:Hide()
MsgInfo( "Ahora la muestro" )
oWnd:Show()
MsgInfo( "y ahora termino" )
oWnd:End()
else
MsgStop( "No se pudo capturar ninguna ventana" )
oWnd := nil
endif
return( nil )
//----------------------------------------------------------------------------//
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
Chaco - Argentina
Re: Como saber si una venta Dialog esta abierta
nooooo
use simply the theorie of josè of alanit
CLASS tApplication
DATA oDlg
and then
Function test()
if oApp():oDlg != nil
if oApp():nEdit > 0
return nil
else
oApp():oDlg:End()
SysRefresh()
endif
endif
your procedure
return nil
if yoy make an operation sample an insert or modiy
you must insert
oApp():nEdit ++
and then at end
oApp():nEdit --
it run ok
search on alanit website the fsdi class
use simply the theorie of josè of alanit
CLASS tApplication
DATA oDlg
and then
Function test()
if oApp():oDlg != nil
if oApp():nEdit > 0
return nil
else
oApp():oDlg:End()
SysRefresh()
endif
endif
your procedure
return nil
if yoy make an operation sample an insert or modiy
you must insert
oApp():nEdit ++
and then at end
oApp():nEdit --
it run ok
search on alanit website the fsdi class
Best Regards, Saludos
Falconi Silvio
Falconi Silvio
Re: Como saber si una venta Dialog esta abierta
En primer lugar gracias a todos por vuestra ayuda.
Finalmente me en decidido por el sistema de Armando, y he aprovechado para hacer algunas modificaciones que espero que a alguien mas le resulten utiles.
1) En nuestro procedimiento main()
2) Creamos la clase
3) Creamos una funcion que comprueba los procedimientos
4) Desde cada uno de nuestros programas llamamos a la funcion FAplicacion()
Un saludo a todos y gracias por vuestra ayuda
Finalmente me en decidido por el sistema de Armando, y he aprovechado para hacer algunas modificaciones que espero que a alguien mas le resulten utiles.
1) En nuestro procedimiento main()
Code: Select all
FUNCTION Main()
oApp:TAplicacion()
*
*
RETURN nil
Code: Select all
// Clase para guarda los dialogos abiertos y asi evitar que se dupliquen
CLASS TAplicacion
// Nº Procedimientos abiertos (En este caso maximo 10)
DATA aProc INIT {nil,nil,nil,nil,nil,nil,nil,nil,nil,nil}
ENDCLASS
Code: Select all
// Comprobacion de procedimientos abiertos (nNombre -> Nombre del procedimiento a comprobar, nMaximo -> Nº de veces que puede estar abierto a la vez)
FUNCTION FAplicacion(nNombre,nMaximo)
Local i
Local nProc:=0 // Numero de procedimientos abiertos
Local nVeces:=0 // Numero de veces que esta abierto el mismo procedimiento
// Comprueba si existe procedimiento
FOR i=1 TO LEN(oApp:aProc)
IF oApp:aProc[i] == nNombre
nVeces++
ENDIF
nProc:=nProc+IIF(oApp:aProc[i]==nil,0,1)
NEXT i
IF nVeces>=nMaximo
MsgAlert("Este procedimiento ya está abierto "+STR(nVeces,2)+" veces","Aviso")
RETURN 0
ENDIF
// En caso de que no exista o no sobrepase el maximo de veces, comprueba nº maximo de procedimientos abiertos
IF nProc>=LEN(oApp:aProc)
MsgAlert("Máximo nº de procedimientos abiertos "+STR(LEN(oApp:aProc),2)+", no puede abrir más."+CRLF+"Cierre alguno que no esté utilizando.","Aviso")
RETURN 0
ENDIF
// Guardamos nuevo procedimiento
FOR i=1 TO LEN(oApp:aProc)
IF oApp:aProc[i]==nil
oApp:aProc[i]:=nNombre
EXIT
ENDIF
NEXT i
RETURN i // Devolvemos el numero de posicion de nuestro procedimiento en el array aProc[]
Code: Select all
FUNCTION MiPrograma()
Local nProc
// Comprobamos si el procedimiento esta abierto
nProc:=FAplicacion(ProcName(),2) // Guardamos el nº de posicion de la tabla de procedimientos aProc[]
IF nProc==0
RETURN cCod
ENDIF
DEFINE DIALOG oDlg RESOURCE ...
*
*
ACTIVATE DIALOG oDlg CENTER ;
VALID (oApp:aProc[nProc]:=nil,.t.) // Nos aseguramos de dejar el procedimiento vacio