Mdichild frivolos - SOLUCIONADO

Mdichild frivolos - SOLUCIONADO

Postby Armando Picon » Tue Aug 03, 2010 12:15 am

Buena parte de los usuarios tienen costumbre de dejar las ventanas en windows abierta y permiten que los salvapantallas inactiven o minimicen nuestros dialogos. Cuando regresan al no ver abierta la ventana que dejaron previamente, acostumbran volver a ejecutar la apertura del programa. En algunos casos observé a uno en particular que tenía hasta 15 veces una ventana MdiChild. Para evitar eso, en FW2.0 utilicé el siguiente código que ahora no funciona en Fwh:

if ASCAN( oWndMain:oWndClient:aWnd, {|x| x:cargo == "ZONAS"} ) == 0

DEFINE WINDOW oWndZona MDICHILD FROM 0,0 TO MAXROW(), MAXCOL() OF oWndMain ;
TITLE "MAESTRO DE ZONAS DE COBRANZA" //NOSYSMENU

oWndZona:bGotfocus:= {|| oDlgZon:Setfocus()}
DEFINE DIALOG oDlgZon RESOURCE "BRWLAB" OF oWndZona ;
FONT oFont
---
----
----
ACTIVATE DIALOG oDlgZon NOWAIT ON INIT oDlgZon:move(0,0)

oWndZona:cargo := "ZONAS"

ACTIVATE WINDOW oWndZona

ELSE

oWndZona:SetFocus()
oWndZona:restore()
oWndZona:refresh()

ENDIF


La pregunta es ¿hay alguna forma de corregir las "frivolidades" de las MdiChil? Porfa' se los agradeceré inmensamente la ayuda.
Last edited by Armando Picon on Thu Aug 05, 2010 5:15 am, edited 1 time in total.
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
Armando Picon
 
Posts: 446
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Re: Mdichild frivolos

Postby Armando Picon » Tue Aug 03, 2010 10:40 pm

¡Toc! ¡Toc! ¡Toc! Sólo para mantener la vigencia de la consulta.... ¿hay alguien por esos lares?
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
Armando Picon
 
Posts: 446
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Re: Mdichild frivolos

Postby FranciscoA » Wed Aug 04, 2010 12:29 am

Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2110
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Mdichild frivolos

Postby Armando Picon » Wed Aug 04, 2010 2:43 am

Francisco
Eso se refiere a que no puedan ejecutar 2 o más veces la aplicación. Mi mensaje se refiere a que el trozo de código, que señalo, evitaba que se abrieran nuevas instancias de la ventana hija (como digo, antes de aplicarlo, tuve un usuario que abrió hasta 15 veces una misma opción). Me funcionaba perfectamente con FW2.0d y en FWH2.4. A partir de la 7.12 que ahora uso, el condenado código no funciona y nuevamente se pueden ejecutar varias veces la misma opción.
De todas formas te agradezco mucho el interés y si algo más me puedes aconsejar, pues ¡bienvenido!
Saludos
Armando
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
Armando Picon
 
Posts: 446
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Re: Mdichild frivolos

Postby Antonio Linares » Wed Aug 04, 2010 4:47 am

Armando,

No llames a:

ACTIVATE WINDOW oWndZona

No hace falta, pues la ventana principal MDI ya pone en marcha el proceso de mensajes de Windows. Con eso tu sistema debería funcionar.

Otra forma mas simple es usar una variable estática para cada MdiChild, asi si la variable no es nil es que esta en uso. Cuando se cierra, asignas nil a la variable, y asi lo tienes controlado.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Mdichild frivolos

Postby anserkk » Wed Aug 04, 2010 5:21 am

I am not sure whether I properly understood your requirement.

Here is another solution to check whether an MDI Child window is already open or not. If already open then the focus is set to the window. This prevents opening multiple instances of the same window.

Code: Select all  Expand view

...
MENUITEM "Account &Heads" ;
  ACTION  if(!wndSetFocus("Account Heads Master"),AcMaster(),   )
..

*------------------------------------------------------*
Function wndSetFocus(cTitle)
*------------------------------------------------------*
/* Here is a function to prevent opening more than one copy of a MDI child window.
   It also brings the window to the top and set the focus to it.
   Title/Caption of the window is passed as a parameter
*/

local i:=0,lSuccess:=.f.
cTitle:=upper(cTitle)
For i=1 to len(wndMain():oWndClient:aWnd)
  if upper( wndMain():oWndClient:aWnd[i]:cCaption )=cTitle
     wndMain():oWndClient:aWnd[i]:setFocus()
     lSuccess:=.t.
  endif
Next
Return lSuccess

*-----------------------*
Function AcMaster()
*-----------------------*
...
DEFINE WINDOW oWnd MDICHILD OF WndMain() TITLE "Account Heads Master" FROM 1,5 to 35.2,95
...
...


Regards

Anser
User avatar
anserkk
 
Posts: 1329
Joined: Fri Jun 13, 2008 11:04 am
Location: Kochi, India

Re: Mdichild frivolos

Postby Armando Picon » Wed Aug 04, 2010 4:46 pm

Antonio
¿No es acaso una regla inalterable que debamos activar toda ventana, sea MdiChild o nó?. Si el dialogo que contiene no es modal ¿acaso no continuará la ejecución del programa hasta el final, volviendo a la rutina que lo llamó? A pesar de las dudas voy a probarlo, a ver qué pasa. En el caso de la variable estática que sugieres, ella tendría que estar fuera del modulo ya sea como privada o publica y cuidar de de devolver su valor original cuando salen correctamente de la opción. Esa solución la puse en práctica inicialmente pero exige más cuidado. Por ello es que, pensando en el comportamiento de la clase MDI y su correpondiente MDICHILD en FW2.0D y FWH2.4, apliqué el trozo de codigo que ahora no funciona, porque es más simple y no requiere de más cuidado.

Anserkk

Me agrada tu sugerencia. Me parece más apropiado utilizar una función genérica para evaluar el título de la ventana MDICHILD si ya está encuentra definida. Solamente tiene un inconveniente. Si el usuario ha minimizado la MDICHILD, la función siempre retornará .T. Si el usuario es cuidadoso buscará en su pantalla la ventana minimizada y la activará. Pero si no es cuidadoso, lo primero que hará es protestar respecto a la calidad de la aplicación.

It pleases your suggestion. I seems to me more appropriate to use a generic function to evaluate the title of the window MDICHILD if already it is defined. Only it has a disadvantage. If the user has minimized the MDICHILD, the function always will come back .T. If the user is careful he will look on his screen for the minimized window and will activate her. But if he is not careful, the first thing that will do is to protest with regard to the quality of the application.

Saludos y gracias por las sugerencias.

Armando
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
Armando Picon
 
Posts: 446
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Re: Mdichild frivolos

Postby Armando » Wed Aug 04, 2010 5:14 pm

Tocayo:

A ver si en esta sí podemos ayudar.

Yo lo hago así:

Defino la variable como STATIC en el mero principio:
Code: Select all  Expand view

STATIC oWnd
 


Despues de la función inicial "miro" si la ventana esta abierta y minimizada:
Code: Select all  Expand view

FUNCTION SapWin1a(oWindow)

IF ValType(oWnd) == "O"
    oWnd:Restore()   // Si esta minimizada la ampliamos
    RETURN(NIL)
ENDIF
 


Solo hay que tener cuidado que antes de salir del PRG poner la variable a NIL
Code: Select all  Expand view

oWnd        := NIL
 


Y esto me funciona bien.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3061
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: Mdichild frivolos

Postby Armando Picon » Wed Aug 04, 2010 5:46 pm

Tocayo

Esto es justo lo que le comentaba a Antonio, en post previo. El cuidado en la programación para devolver el valor original de la variable externa al módulo. En el código que utilizaba, hacía uso de la data "cargo" de la clase y eso era simple y tan transparente que lo utilizaba, ampliamente, como plantilla ---por la "Ley del menor esfuerzo"--- en toda opción que requiriese de un MdiChild.

Tocayo, te agradezco mucho la sugerencia.
Armando
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
Armando Picon
 
Posts: 446
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Re: Mdichild frivolos

Postby Antonio Linares » Wed Aug 04, 2010 8:52 pm

Armando,

En el caso de las ventanas MdiChild, solamente, puedes saltarte el ACTIVATE WINDOW.

Pruebalo :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Mdichild frivolos

Postby Armando Picon » Wed Aug 04, 2010 10:28 pm

Antonio

Apliqué tu sugerencia y, en efecto puedo saltarme el ACTIVATE WINDOWS, pero no funciona en lo que me interesa. Sigue permitiendo varias instancias de la ventana MdiChild. Empiezo a presumir que la falla proviene de la clase padre Window ya que al parecer no reconoce el contenido de la data "cargo" y al no almacenar el valor que se le dá permite que puedan repetirse instancias sucesivas.
Saludos
Armando
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
Armando Picon
 
Posts: 446
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Re: Mdichild frivolos

Postby Daniel Garcia-Gil » Wed Aug 04, 2010 11:14 pm

Armando

Intentalo de esta manera, esto funciona para mi

Code: Select all  Expand view

#include "FiveWin.ch"

function Main()

   local oWnd, oBar

   DEFINE WINDOW oWnd MDI
   
   DEFINE BUTTONBAR oBar OF oWnd 2007
   
   DEFINE BUTTON OF oBar ACTION Child( oWnd )

   ACTIVATE WINDOW oWnd

return nil

function Child( oWnd  )

   local oWndChild
   local n
   
   IF ( n := AScan( oWnd:oWndClient:aWnd, {|x| x:cargo == "TEST"} ) ) == 0
   
      DEFINE WINDOW oWndChild MDICHILD OF oWnd
   
      ACTIVATE WINDOW oWndChild
   
      oWndChild:Cargo = "TEST"
   ELSE
      oWndChild = oWnd:oWndClient:aWnd[ n ]
      oWndChild:SetFocus()
      oWndChild:restore()
   ENDIF
   
   
return nil  
 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Mdichild frivolos

Postby Armando Picon » Thu Aug 05, 2010 12:42 am

Daniel
Gracias por tu sugerencia. Lo probé en todas las combinaciones que se me ocurrió, desde cambiar de publicas a locales los objetos de mi ventana hasta evaluar el nombre de la mdichild. Lástima que tampoco evita la multiplicación de instancias. Como dije en post anterior, me imagino que hubo modificaciones en las clases ya sea Windows o tmdiclien o tmdichild o, por último, en tmdiFrame que evitan almacenar datos en "cargo" y por eso, evaluando el valor de "n" en tu sugerencia siempre da CERO. No mencioné que esta es una aplicación inmensa que aún viene funcionando bajo FW2.0d y que en el paso a FWH me está dando algunos quebraderos de cabeza con las "frivolidades" que voy encontrando.
Gracias por todo
Armando
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
Armando Picon
 
Posts: 446
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Re: Mdichild frivolos

Postby Daniel Garcia-Gil » Thu Aug 05, 2010 12:52 am

Armando

A mi me funciona correctamente, te dejo el ejecutable

http://www.sitasoft.net/fivewin/samples/testmdic.zip
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Mdichild frivolos - SOLUCIONADO

Postby Armando Picon » Thu Aug 05, 2010 5:14 am

Bien

Gracias a todos los que me sugirieron diversos métodos para "poner en cintura" a las MdiChild "frivolas". La solución estaba cerca al código original y que gracias a la paciencia de Daniel Garcia-Gil pude hacer las modificaciones necesarias. Esta fue la solución:

If EMPTY(oWndMain:oWndClient:cargo)

DEFINE FONT oFont10 NAME "Arial" SIZE 0, -10
DEFINE BRUSH oBrush FILE oApp:PathBmp+"\brick.bmp"

DEFINE WINDOW oWndAlu MDICHILD FROM 0,0 TO MAXROW(), MAXCOL() ;
TITLE "MAESTRO DE ALUMNOS" OF oWndMain

oWndalu:bGotFocus := {|| oDlg:Setfocus()}

DEFINE DIALOG oDlg RESOURCE "alu00" OF oWndAlu ;
BRUSH obrush TRANSPARENT ;
FONT oFont10

SELECT ALUMNO
------
-----
-----
REDEFINE BUTTON dummy ID 111 OF oDlg ;
ACTION ( odlg:end(), oWndAlu:end(), oWndMain:oWndClient:cargo := "" ) CANCEL

oLb:bkeydown := {|x| NavegaAlu(nKey, oDlg)}

ACTIVATE DIALOG oDlg NOWAIT ON INIT oDlg:move(0,0)

oWndMain:oWndClient:cargo := "ALUMNO"

ACTIVATE WINDOW oWndAlu

ELSE
oWndAlu:SetFocus()
oWndAlu:Refresh()
oWndAlu:restore()
ENDIF


Con esto, ningún usuario podrá generar otra instancia de la ventana MdiChild. Gracias mil, Daniel

Saludos

Armando
FWH + BCC582 + WorkShop 4.5 + Resource Hacker + Mingw
Mis nuevas herramientas
Comunicacion via WhatsApp (+51) 957549 665
Comunicación via Correo: apic1002002 at yahoo dot es; apic1002002@gmail.com
User avatar
Armando Picon
 
Posts: 446
Joined: Mon Dec 26, 2005 9:11 pm
Location: Lima, Peru

Next

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 85 guests