In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Comprobar si un formulario está abierto

Foro público de Xailer en español
Responder
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Comprobar si un formulario está abierto

Mensaje por jasm.quitaesto »

Hola,
Necesitaba controlar que si una ventana MDIChild estaba abierta no se
volviese a abrir y se viniese al frente; así­ que buscando por los foros
encontré varias soluciones, pero la que más me gustó fué la de Miguel
Torrellas, y la he adaptado a mis necesidades. Aquí­ dejo el código
modificado por si alguien lo necesita:
En el formulario del menú principal incluyo el siguiente método:
METHOD IsOpen( oForm ) CLASS TForm1
LOCAL aForms := ::oMDIClient:aForms
LOCAL nO := aScan( aForms , { | o | o:ClassName() ==
oForm:ClassName() } )
LOCAL oFrm := NIL
IF nO != 0
oFrm := aForms[ nO ]
END IF
RETURN oFrm
después, en las llamadas desde el menú y desde los botones hago esta
comprobación:
METHOD ToolBar1Item1Click( oSender ) CLASS TForm1
LOCAL oFrm := ::IsOpen( EmpresaBrw() )
IF oFrm != NIL
oFrm:Show()
ELSE
EmpresaBrw():New( Self ):Show()
END IF
RETURN Nil
Saludos,
Alf+.
P.D.
Jose, Ignacio, ¿Podrí­a incluirse el método IsOpen() de forma estándar en
Xailer?.
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Comprobar si un formulario está abierto

Mensaje por jasm.quitaesto »

El código de IsOpen algo más compacto:
METHOD IsOpen( oForm ) CLASS TForm1
LOCAL aForms := ::oMDIClient:aForms
LOCAL nO := aScan( aForms , { | o | o:ClassName() ==
oForm:ClassName() } )
RETURN IF( nO != 0, aForms[ nO ], NIL )
Saludos,
Alf+.
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Comprobar si un formulario está abierto

Mensaje por jasm.quitaesto »

Aun más compacto
METHOD IsOpen( oForm ) CLASS TForm1
LOCAL nO := aScan( ::oMDIClient:aForms , { | o | o:ClassName() ==
oForm:ClassName() } )
RETURN IF( nO != 0, aForms[ nO ], NIL )
Saludos,
Alf+.
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Comprobar si un formulario está abierto

Mensaje por jasm.quitaesto »

Perdón, habí­a un error.
METHOD IsOpen( oForm ) CLASS TForm1
LOCAL nO := aScan( ::oMDIClient:aForms , { | o | o:ClassName() ==
oForm:ClassName() } )
RETURN IF( nO != 0, ::oMDIClient:aForms[ nO ], NIL )
Manu Exposito
Mensajes: 116
Registrado: Mié Feb 08, 2006 4:41 pm

Comprobar si un formulario está abierto

Mensaje por Manu Exposito »

Jose por coherencia IsOpen deberá devolver un valor lógico con lo
quedarí­a así­:
METHOD IsOpen( oForm ) CLASS TForm1
RETURN( aScan( ::oMDIClient:aForms , { | o | o:ClassName() ==
oForm:ClassName()} ) != 0 )
Por lo que casi no te valdrí­a directamente.
Pero podrí­as hacer otro método que fuera:
METHOD MDIByClsName( cClsName ) CLASS TForm1
local nMDI := len( ::oMDIClient:aForms )
local i, oFrm
// Esto es más rápido que el AScan ya que no tiene que evaluar ningún CB
// además no tiene que ejecutar el ClassName() del objeto enviado por
// cada iteración por lo que es también un poquito más veloz
for i := 1 to nMDI
if cClsName == ::oMDIClient:aForms[ i ]:ClassName() )
oFrm := ::oMDIClient:aForms[ i ]
EXIT
endif
next
return( oFrm )
Y en tu código:
METHOD ToolBar1Item1Click( oSender ) CLASS TForm1
LOCAL oFrm := ::MDIByClsName( EmpresaBrw():ClassName() )
IF oFrm != NIL
oFrm:Show()
ELSE
EmpresaBrw():New( Self ):Show()
END IF
RETURN Nil
Creo que es más lógico ya que el Is...() en todos los lenguajes devuelve
un valor lógico en cambio el ...By...() devuelve un objeto :-)
Te vale para tu desarrollo?
Jajaja saludos JA, por cierto me gustó el local y tus socios... son
buena gente como tú ;-)
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Comprobar si un formulario está abierto

Mensaje por jasm.quitaesto »

Manu,
SET CON_UN_POCO_DE_GUASA ON
Manu escribió:
> Jose por coherencia IsOpen deberá devolver un valor lógico con lo
> quedarí­a así­:
>
¿Y qué mas da? ¿Acaso hay alguna norma que me impida llamar a los
metodos como crea conveniente?
> METHOD IsOpen( oForm ) CLASS TForm1
> RETURN( aScan( ::oMDIClient:aForms , { | o | o:ClassName() ==
> oForm:ClassName()} ) != 0 )
>
> Por lo que casi no te valdrí­a directamente.
Xactamente. Que retorne un valor lógico no vale para lo que queremos hacer.
>
> Pero podrí­as hacer otro método que fuera:
>
> METHOD MDIByClsName( cClsName ) CLASS TForm1
¿Y por que no llamarla MDIEnUso?: es mas correcto que cualquier
"extrangerismo".
>
> local nMDI := len( ::oMDIClient:aForms )
> local i, oFrm
>
> // Esto es más rápido que el AScan ya que no tiene que evaluar ningún CB
> // además no tiene que ejecutar el ClassName() del objeto enviado por
> // cada iteración por lo que es también un poquito más veloz
¿Cuantas MDI crees que va a tener el usuario abiertas?
La obsesión por la velocidad a veces hace que el código se vuelva más
ilegible. Eso sólo es admisible cuando realmente es justificable y en
este caso no lo es.
En cuanto a lo del ClassName() no te lo acepto por que emborrona la
llamada. Quiero saber si EmpresaBrw() está abierto, no acordarme que le
tengo que pasar el ClassName(). Hagamos las funciones y métodos fáciles
de llamar y con pocos parámetros, por favor.
>
> for i := 1 to nMDI
> if cClsName == ::oMDIClient:aForms[ i ]:ClassName() )
> oFrm := ::oMDIClient:aForms[ i ]
> EXIT
> endif
> next
>
> return( oFrm )
>
> Y en tu código:
>
> METHOD ToolBar1Item1Click( oSender ) CLASS TForm1
>
> LOCAL oFrm := ::MDIByClsName( EmpresaBrw():ClassName() )
>
> IF oFrm != NIL
> oFrm:Show()
> ELSE
> EmpresaBrw():New( Self ):Show()
> END IF
>
> RETURN Nil
>
> Creo que es más lógico ya que el Is...() en todos los lenguajes devuelve
> un valor lógico en cambio el ...By...() devuelve un objeto :-)
¿Y a mi qué? ;-)
Ala, ahora lo cambio y le pongo
DimeElObjetoDeEstoSiEstaAbiertoYSiNoDevelveNulo( ) y ya sabemos de que
va el método ¿te parece?. Aunque lo veo algo jodidillo de escribir ¿no
crees?.
>
> Te vale para tu desarrollo?
>
Me vale como lo tengo y no se queja el compilador de que use Is, By o lo
que quiera. Tampoco he notado que la aplicación se vuelva superlenta por
usar AScan() o por no pasar el ClassName(). ;-)
> Jajaja saludos JA, por cierto me gustó el local y tus socios... son
> buena gente como tú ;-)
>
Gracias :-)
SET CON_UN_POCO_DE_GUASA OFF
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Comprobar si un formulario está abierto

Mensaje por ignacio »

José Afonso,
Escrito al vuelo. Está es mi forma preferida por si te interesa.
CLASS MyForm FROM TForm
DATA oForm1
METHOD Form1()
END CLASS
METHOD Form1() CLASS TForm
IF ::oForm1 == NIL
WITH OBJECT ::oForm1 := TMiForm1():New( Self )
:OnClose( { || ::oForm1 := NIL } )
END WITH
ENDIF
::oForm1:Show()
RETURN NIL
Un saludo,
--
Ignacio Ortiz de Zúñiga
[Xailer support]
"José Alfonso Suárez Moreno" <jasm.quitaesto@tpvsoft.com> escribió en el
mensaje news:[email=48b16122@ozsrv2.ozlan.local...]48b16122@ozsrv2.ozlan.local...[/email]
> Manu,
>
> SET CON_UN_POCO_DE_GUASA ON
>
> Manu escribió:
>
>
>> Jose por coherencia IsOpen deberá devolver un valor lógico con lo
>> quedaría así:
>>
> ¿Y qué mas da? ¿Acaso hay alguna norma que me impida llamar a los metodos
> como crea conveniente?
>
>> METHOD IsOpen( oForm ) CLASS TForm1
>> RETURN( aScan( ::oMDIClient:aForms , { | o | o:ClassName() ==
>> oForm:ClassName()} ) != 0 )
>>
>> Por lo que casi no te valdría directamente.
>
> Xactamente. Que retorne un valor lógico no vale para lo que queremos
> hacer.
>
>>
>> Pero podrías hacer otro método que fuera:
>>
>> METHOD MDIByClsName( cClsName ) CLASS TForm1
>
> ¿Y por que no llamarla MDIEnUso?: es mas correcto que cualquier
> "extrangerismo".
>>
>> local nMDI := len( ::oMDIClient:aForms )
>> local i, oFrm
>>
>> // Esto es más rápido que el AScan ya que no tiene que evaluar ningún CB
>> // además no tiene que ejecutar el ClassName() del objeto enviado por
>> // cada iteración por lo que es también un poquito más veloz
>
> ¿Cuantas MDI crees que va a tener el usuario abiertas?
> La obsesión por la velocidad a veces hace que el código se vuelva más
> ilegible. Eso sólo es admisible cuando realmente es justificable y en este
> caso no lo es.
>
> En cuanto a lo del ClassName() no te lo acepto por que emborrona la
> llamada. Quiero saber si EmpresaBrw() está abierto, no acordarme que le
> tengo que pasar el ClassName(). Hagamos las funciones y métodos fáciles de
> llamar y con pocos parámetros, por favor.
>
>>
>> for i := 1 to nMDI
>> if cClsName == ::oMDIClient:aForms[ i ]:ClassName() )
>> oFrm := ::oMDIClient:aForms[ i ]
>> EXIT
>> endif
>> next
>>
>> return( oFrm )
>>
>> Y en tu código:
>>
>> METHOD ToolBar1Item1Click( oSender ) CLASS TForm1
>>
>> LOCAL oFrm := ::MDIByClsName( EmpresaBrw():ClassName() )
>>
>> IF oFrm != NIL
>> oFrm:Show()
>> ELSE
>> EmpresaBrw():New( Self ):Show()
>> END IF
>>
>> RETURN Nil
>>
>> Creo que es más lógico ya que el Is...() en todos los lenguajes devuelve
>> un valor lógico en cambio el ...By...() devuelve un objeto :-)
>
> ¿Y a mi qué? ;-)
>
> Ala, ahora lo cambio y le pongo
> DimeElObjetoDeEstoSiEstaAbiertoYSiNoDevelveNulo( ) y ya sabemos de que va
> el método ¿te parece?. Aunque lo veo algo jodidillo de escribir ¿no
> crees?.
>
>>
>> Te vale para tu desarrollo?
>>
> Me vale como lo tengo y no se queja el compilador de que use Is, By o lo
> que quiera. Tampoco he notado que la aplicación se vuelva superlenta por
> usar AScan() o por no pasar el ClassName(). ;-)
>
>> Jajaja saludos JA, por cierto me gustó el local y tus socios... son buena
>> gente como tú ;-)
>>
> Gracias :-)
>
>
> SET CON_UN_POCO_DE_GUASA OFF
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Comprobar si un formulario está abierto

Mensaje por jasm.quitaesto »

Hola Ignacio,
He visto en otras respuestas que Jose Giménez también aconseja usar este
método para controlar la apertura de las MDI.
¿El método que he propuesto (o el que propone Miguel Torrellas, mejor
dicho) puede ser suceptible de fallos? Usando ::oMdiClients:aForms no es
necesario crear Datas ni controlar en el método OnClose de cada
formulario si este se cierra.
Saludos
Alf+.
Ignacio Ortiz de Zúñiga escribió:
> José Afonso,
>
> Escrito al vuelo. Está es mi forma preferida por si te interesa.
>
> CLASS MyForm FROM TForm
> DATA oForm1
> METHOD Form1()
> END CLASS
>
> METHOD Form1() CLASS TForm
>
> IF ::oForm1 == NIL
> WITH OBJECT ::oForm1 := TMiForm1():New( Self )
> :OnClose( { || ::oForm1 := NIL } )
> END WITH
> ENDIF
>
> ::oForm1:Show()
>
> RETURN NIL
>
> Un saludo,
>
Manu Exposito
Mensajes: 116
Registrado: Mié Feb 08, 2006 4:41 pm

Comprobar si un formulario está abierto

Mensaje por Manu Exposito »

Jose yo te decí­a eso por si se quiere incluir como algo propio de Xailer.
Como digo en el otro mensaje El Is...() devuelve un valor lógico en
todos los leguajes.
La clase podrí­a quedar así­:
METHOD MDIByMDI( oMDI ) CLASS TForm1
local nMDI := len( ::oMDIClient:aForms )
local i, oFrm
local cClsName := oMDI:ClassName()
// Esto es más rápido que el AScan ya que no tiene que evaluar ningún CB
// además no tiene que ejecutar el ClassName() del objeto enviado por
// cada iteración por lo que es también un poquito más veloz
for i := 1 to nMDI
if cClsName == ::oMDIClient:aForms[ i ]:ClassName() )
oFrm := ::oMDIClient:aForms[ i ]
EXIT
endif
next
return( oFrm )
Creo que hay que cuidar el código y hacerlo lo más rápido, compacto y
legible (para todos) posible nunca se sabe...
Ademá cuando adquieres costumbres y tú sabes que yo en eso soy mu
"quisquilloso"...
Pero me parece bien que cada uno haga su código como mejor le venga :-)
Bueno Jose ya voy avanzando en "ESO" que hemos hablado ;-)
Buenas noches :-)
José Alfonso Suárez Moreno escribió:
> Manu,
>
> SET CON_UN_POCO_DE_GUASA ON
>
> Manu escribió:
>
>
>> Jose por coherencia IsOpen deberá devolver un valor lógico con lo
>> quedarí­a así­:
>>
> ¿Y qué mas da? ¿Acaso hay alguna norma que me impida llamar a los
> metodos como crea conveniente?
>
>> METHOD IsOpen( oForm ) CLASS TForm1
>> RETURN( aScan( ::oMDIClient:aForms , { | o | o:ClassName() ==
>> oForm:ClassName()} ) != 0 )
>>
>> Por lo que casi no te valdrí­a directamente.
>
> Xactamente. Que retorne un valor lógico no vale para lo que queremos hacer.
>
>>
>> Pero podrí­as hacer otro método que fuera:
>>
>> METHOD MDIByClsName( cClsName ) CLASS TForm1
>
> ¿Y por que no llamarla MDIEnUso?: es mas correcto que cualquier
> "extrangerismo".
>>
>> local nMDI := len( ::oMDIClient:aForms )
>> local i, oFrm
>>
>> // Esto es más rápido que el AScan ya que no tiene que evaluar ningún CB
>> // además no tiene que ejecutar el ClassName() del objeto enviado por
>> // cada iteración por lo que es también un poquito más veloz
>
> ¿Cuantas MDI crees que va a tener el usuario abiertas?
> La obsesión por la velocidad a veces hace que el código se vuelva más
> ilegible. Eso sólo es admisible cuando realmente es justificable y en
> este caso no lo es.
>
> En cuanto a lo del ClassName() no te lo acepto por que emborrona la
> llamada. Quiero saber si EmpresaBrw() está abierto, no acordarme que le
> tengo que pasar el ClassName(). Hagamos las funciones y métodos fáciles
> de llamar y con pocos parámetros, por favor.
>
>>
>> for i := 1 to nMDI
>> if cClsName == ::oMDIClient:aForms[ i ]:ClassName() )
>> oFrm := ::oMDIClient:aForms[ i ]
>> EXIT
>> endif
>> next
>>
>> return( oFrm )
>>
>> Y en tu código:
>>
>> METHOD ToolBar1Item1Click( oSender ) CLASS TForm1
>>
>> LOCAL oFrm := ::MDIByClsName( EmpresaBrw():ClassName() )
>>
>> IF oFrm != NIL
>> oFrm:Show()
>> ELSE
>> EmpresaBrw():New( Self ):Show()
>> END IF
>>
>> RETURN Nil
>>
>> Creo que es más lógico ya que el Is...() en todos los lenguajes
>> devuelve un valor lógico en cambio el ...By...() devuelve un objeto :-)
>
> ¿Y a mi qué? ;-)
>
> Ala, ahora lo cambio y le pongo
> DimeElObjetoDeEstoSiEstaAbiertoYSiNoDevelveNulo( ) y ya sabemos de que
> va el método ¿te parece?. Aunque lo veo algo jodidillo de escribir ¿no
> crees?.
>
>>
>> Te vale para tu desarrollo?
>>
> Me vale como lo tengo y no se queja el compilador de que use Is, By o lo
> que quiera. Tampoco he notado que la aplicación se vuelva superlenta por
> usar AScan() o por no pasar el ClassName(). ;-)
>
>> Jajaja saludos JA, por cierto me gustó el local y tus socios... son
>> buena gente como tú ;-)
>>
> Gracias :-)
>
>
> SET CON_UN_POCO_DE_GUASA OFF
Manu Exposito
Mensajes: 116
Registrado: Mié Feb 08, 2006 4:41 pm

Comprobar si un formulario está abierto

Mensaje por Manu Exposito »

Jose yo te decí­a eso por si se quiere incluir como algo propio de Xailer.
Como digo en el otro mensaje El Is...() devuelve un valor lógico en
todos los leguajes.
La clase podrí­a quedar así­:
METHOD MDIByMDI( oMDI ) CLASS TForm1
local nMDI := len( ::oMDIClient:aForms )
local i, oFrm
local cClsName := oMDI:ClassName()
// Esto es más rápido que el AScan ya que no tiene que evaluar ningún CB
// además no tiene que ejecutar el ClassName() del objeto enviado por
// cada iteración por lo que es también un poquito más veloz
for i := 1 to nMDI
if cClsName == ::oMDIClient:aForms[ i ]:ClassName() )
oFrm := ::oMDIClient:aForms[ i ]
EXIT
endif
next
return( oFrm )
Creo que hay que cuidar el código y hacerlo lo más rápido, compacto y
legible (para todos) posible nunca se sabe...
Ademá cuando adquieres costumbres y tú sabes que yo en eso soy mu
"quisquilloso"...
Pero me parece bien que cada uno haga su código como mejor le venga :-)
Bueno Jose ya voy avanzando en "ESO" que hemos hablado ;-)
Buenas noches :-)
José Alfonso Suárez Moreno escribió:
> Manu,
>
> SET CON_UN_POCO_DE_GUASA ON
>
> Manu escribió:
>
>
>> Jose por coherencia IsOpen deberá devolver un valor lógico con lo
>> quedarí­a así­:
>>
> ¿Y qué mas da? ¿Acaso hay alguna norma que me impida llamar a los
> metodos como crea conveniente?
>
>> METHOD IsOpen( oForm ) CLASS TForm1
>> RETURN( aScan( ::oMDIClient:aForms , { | o | o:ClassName() ==
>> oForm:ClassName()} ) != 0 )
>>
>> Por lo que casi no te valdrí­a directamente.
>
> Xactamente. Que retorne un valor lógico no vale para lo que queremos hacer.
>
>>
>> Pero podrí­as hacer otro método que fuera:
>>
>> METHOD MDIByClsName( cClsName ) CLASS TForm1
>
> ¿Y por que no llamarla MDIEnUso?: es mas correcto que cualquier
> "extrangerismo".
>>
>> local nMDI := len( ::oMDIClient:aForms )
>> local i, oFrm
>>
>> // Esto es más rápido que el AScan ya que no tiene que evaluar ningún CB
>> // además no tiene que ejecutar el ClassName() del objeto enviado por
>> // cada iteración por lo que es también un poquito más veloz
>
> ¿Cuantas MDI crees que va a tener el usuario abiertas?
> La obsesión por la velocidad a veces hace que el código se vuelva más
> ilegible. Eso sólo es admisible cuando realmente es justificable y en
> este caso no lo es.
>
> En cuanto a lo del ClassName() no te lo acepto por que emborrona la
> llamada. Quiero saber si EmpresaBrw() está abierto, no acordarme que le
> tengo que pasar el ClassName(). Hagamos las funciones y métodos fáciles
> de llamar y con pocos parámetros, por favor.
>
>>
>> for i := 1 to nMDI
>> if cClsName == ::oMDIClient:aForms[ i ]:ClassName() )
>> oFrm := ::oMDIClient:aForms[ i ]
>> EXIT
>> endif
>> next
>>
>> return( oFrm )
>>
>> Y en tu código:
>>
>> METHOD ToolBar1Item1Click( oSender ) CLASS TForm1
>>
>> LOCAL oFrm := ::MDIByClsName( EmpresaBrw():ClassName() )
>>
>> IF oFrm != NIL
>> oFrm:Show()
>> ELSE
>> EmpresaBrw():New( Self ):Show()
>> END IF
>>
>> RETURN Nil
>>
>> Creo que es más lógico ya que el Is...() en todos los lenguajes
>> devuelve un valor lógico en cambio el ...By...() devuelve un objeto :-)
>
> ¿Y a mi qué? ;-)
>
> Ala, ahora lo cambio y le pongo
> DimeElObjetoDeEstoSiEstaAbiertoYSiNoDevelveNulo( ) y ya sabemos de que
> va el método ¿te parece?. Aunque lo veo algo jodidillo de escribir ¿no
> crees?.
>
>>
>> Te vale para tu desarrollo?
>>
> Me vale como lo tengo y no se queja el compilador de que use Is, By o lo
> que quiera. Tampoco he notado que la aplicación se vuelva superlenta por
> usar AScan() o por no pasar el ClassName(). ;-)
>
>> Jajaja saludos JA, por cierto me gustó el local y tus socios... son
>> buena gente como tú ;-)
>>
> Gracias :-)
>
>
> SET CON_UN_POCO_DE_GUASA OFF
jasm.quitaesto
Mensajes: 420
Registrado: Sab Ago 16, 2008 9:06 pm

Comprobar si un formulario está abierto

Mensaje por jasm.quitaesto »

Manu escribió:
> Jose yo te decí­a eso por si se quiere incluir como algo propio de Xailer.
> Como digo en el otro mensaje El Is...() devuelve un valor lógico en
> todos los leguajes.
Pa tí­ el burro y los 50 reales :-P
> La clase podrí­a quedar así­:
>
> METHOD MDIByMDI( oMDI ) CLASS TForm1
>
> local nMDI := len( ::oMDIClient:aForms )
> local i, oFrm
> local cClsName := oMDI:ClassName()
>
> // Esto es más rápido que el AScan ya que no tiene que evaluar ningún CB
> // además no tiene que ejecutar el ClassName() del objeto enviado por
> // cada iteración por lo que es también un poquito más veloz
>
> for i := 1 to nMDI
> if cClsName == ::oMDIClient:aForms[ i ]:ClassName() )
> oFrm := ::oMDIClient:aForms[ i ]
> EXIT
> endif
> next
>
> return( oFrm )
>
> Creo que hay que cuidar el código y hacerlo lo más rápido, compacto y
> legible (para todos) posible nunca se sabe...
Po vale. Hay muchos caminos para llegar al mismo sitio. Cada cual elije
el suyo. De momento se queda como está.
>
> Ademá cuando adquieres costumbres y tú sabes que yo en eso soy mu
> "quisquilloso"...
Ya sabes que yo tambien. :-P
> Pero me parece bien que cada uno haga su código como mejor le venga :-)
>
Lo que yo decia :-)
> Bueno Jose ya voy avanzando en "ESO" que hemos hablado ;-)
>
¿Pa cuando tienes algo que sirva para probar?
> Buenas noches :-)
>
Buenas, buenas. Al menos corre airecito y no hace calor.
Chau!
>
>
>
> José Alfonso Suárez Moreno escribió:
>> Manu,
>>
>> SET CON_UN_POCO_DE_GUASA ON
>>
>> Manu escribió:
>>
>>
>>> Jose por coherencia IsOpen deberá devolver un valor lógico con lo
>>> quedarí­a así­:
>>>
>> ¿Y qué mas da? ¿Acaso hay alguna norma que me impida llamar a los
>> metodos como crea conveniente?
>>
>>> METHOD IsOpen( oForm ) CLASS TForm1
>>> RETURN( aScan( ::oMDIClient:aForms , { | o | o:ClassName() ==
>>> oForm:ClassName()} ) != 0 )
>>>
>>> Por lo que casi no te valdrí­a directamente.
>>
>> Xactamente. Que retorne un valor lógico no vale para lo que queremos
>> hacer.
>>
>>>
>>> Pero podrí­as hacer otro método que fuera:
>>>
>>> METHOD MDIByClsName( cClsName ) CLASS TForm1
>>
>> ¿Y por que no llamarla MDIEnUso?: es mas correcto que cualquier
>> "extrangerismo".
>>>
>>> local nMDI := len( ::oMDIClient:aForms )
>>> local i, oFrm
>>>
>>> // Esto es más rápido que el AScan ya que no tiene que evaluar ningún CB
>>> // además no tiene que ejecutar el ClassName() del objeto enviado por
>>> // cada iteración por lo que es también un poquito más veloz
>>
>> ¿Cuantas MDI crees que va a tener el usuario abiertas?
>> La obsesión por la velocidad a veces hace que el código se vuelva más
>> ilegible. Eso sólo es admisible cuando realmente es justificable y en
>> este caso no lo es.
>>
>> En cuanto a lo del ClassName() no te lo acepto por que emborrona la
>> llamada. Quiero saber si EmpresaBrw() está abierto, no acordarme que
>> le tengo que pasar el ClassName(). Hagamos las funciones y métodos
>> fáciles de llamar y con pocos parámetros, por favor.
>>
>>>
>>> for i := 1 to nMDI
>>> if cClsName == ::oMDIClient:aForms[ i ]:ClassName() )
>>> oFrm := ::oMDIClient:aForms[ i ]
>>> EXIT
>>> endif
>>> next
>>>
>>> return( oFrm )
>>>
>>> Y en tu código:
>>>
>>> METHOD ToolBar1Item1Click( oSender ) CLASS TForm1
>>>
>>> LOCAL oFrm := ::MDIByClsName( EmpresaBrw():ClassName() )
>>>
>>> IF oFrm != NIL
>>> oFrm:Show()
>>> ELSE
>>> EmpresaBrw():New( Self ):Show()
>>> END IF
>>>
>>> RETURN Nil
>>>
>>> Creo que es más lógico ya que el Is...() en todos los lenguajes
>>> devuelve un valor lógico en cambio el ...By...() devuelve un objeto :-)
>>
>> ¿Y a mi qué? ;-)
>>
>> Ala, ahora lo cambio y le pongo
>> DimeElObjetoDeEstoSiEstaAbiertoYSiNoDevelveNulo( ) y ya sabemos de que
>> va el método ¿te parece?. Aunque lo veo algo jodidillo de escribir ¿no
>> crees?.
>>
>>>
>>> Te vale para tu desarrollo?
>>>
>> Me vale como lo tengo y no se queja el compilador de que use Is, By o
>> lo que quiera. Tampoco he notado que la aplicación se vuelva
>> superlenta por usar AScan() o por no pasar el ClassName(). ;-)
>>
>>> Jajaja saludos JA, por cierto me gustó el local y tus socios... son
>>> buena gente como tú ;-)
>>>
>> Gracias :-)
>>
>>
>> SET CON_UN_POCO_DE_GUASA OFF
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5705
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Comprobar si un formulario está abierto

Mensaje por jfgimenez »

José Alfonso,
> Jose, Ignacio, ¿Podrí­a incluirse el método IsOpen() de forma estándar en
> Xailer?.
Aunque pueda parecer genérico, en realidad es una forma particular de
solucionar el problema. Me explico... la técnica que has usado se basa en el
nombre de la clase del formulario, pero no siempre tiene porqué ser así­.
P.ej., se puede usar el mismo formulario para distintas tablas mostrando los
datos en un browse, y entonces esta técnica no vale. Por eso no soy
partidario de añadirla a Xailer.
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Responder