FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Mdichild frivolos - SOLUCIONADO
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Mdichild frivolos - SOLUCIONADO
Posted: 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.
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
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Re: Mdichild frivolos
Posted: 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
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Mdichild frivolos
Posted: Wed Aug 04, 2010 12:29 AM
Francisco J. Alegr铆a P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Re: Mdichild frivolos
Posted: Wed Aug 04, 2010 02: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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Mdichild frivolos
Posted: Wed Aug 04, 2010 04: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
Posts: 1335
Joined: Fri Jun 13, 2008 11:04 AM
Re: Mdichild frivolos
Posted: Wed Aug 04, 2010 05: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 (fw): Select all Collapse
...
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
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Re: Mdichild frivolos
Posted: Wed Aug 04, 2010 04: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
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Mdichild frivolos
Posted: Wed Aug 04, 2010 05: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 (fw): Select all Collapse
STATIC oWnd


Despues de la funci贸n inicial "miro" si la ventana esta abierta y minimizada:
Code (fw): Select all Collapse
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 (fw): Select all Collapse
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
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Re: Mdichild frivolos
Posted: Wed Aug 04, 2010 05: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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Mdichild frivolos
Posted: Wed Aug 04, 2010 08:52 PM

Armando,

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

Pruebalo :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Re: Mdichild frivolos
Posted: 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
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Mdichild frivolos
Posted: Wed Aug 04, 2010 11:14 PM
Armando

Intentalo de esta manera, esto funciona para mi

Code (fw): Select all Collapse
#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
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Re: Mdichild frivolos
Posted: 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
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Mdichild frivolos
Posted: 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
Posts: 446
Joined: Mon Dec 26, 2005 09:11 PM
Re: Mdichild frivolos - SOLUCIONADO
Posted: Thu Aug 05, 2010 05: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