Page 1 of 2

El problema de tener ventanas abiertas...

PostPosted: Mon Feb 27, 2006 3:59 pm
by Carles
Hola,

Gracias al colega Jose Luis Parajon, se me ha abierto un nuevo dolor de cabeza :? Si tenemos una ventana principal y por ejemplo estamos en una segunda ventana o dialogo y el usuario vuelve a ejecutar la aplicacion, q ocurre?

Con la funcion del foro StillRun() podemos controlar si la aplicacion, mas bien, la ventana principal, esta funcionando, y con dicha funcion ejecutamos la funcion SetForegrounWindow() para pasarla a primer plano, perooooo, realmente ponemos en un primer plano la ventana principal y NO la secundaria.

Code: Select all  Expand view
HB_FUNC (STILLRUN)
{
   HWND hWnd;
   BOOL lRet = FALSE;
   hWnd = FindWindow (NULL,L"SV Pedidos" );
   if (hWnd)
   {
     SetForegroundWindow ( hWnd );
   lRet = TRUE;
   }
   hb_retl (lRet);
}


Hasta hoy, creo q la mejor solucion es mirar si la aplicacion ya esta ejecutandose, mostrar un simple mensaje de 'aplicacion ejecutandose', y q el usuario espabile cerrandose sus ventanitas.

Si alguien se encuentra con este problema y tiene una mejor solucion que quiera compartir, encantado :wink:


Saludos.
C.

PostPosted: Mon Feb 27, 2006 5:55 pm
by astursoft
Yo lo tengo solucionado :D .
La ventana principal debe de ser ventana , el resto dialogos , cuando llamas a la aplicacion hacia delante te trae el ultimo dialogo activo y en cascada los demas .
Garantizado 100*100 .
En la aplicacion que tengo ya en casi producción ninguno de los 10 viajantes se a quejado y mira que son torpes.. :D :D

PostPosted: Tue Feb 28, 2006 7:15 am
by Carles
Jose Luis,

Me alegro q te funcione. Yo tengo el mismo sistema Una ventana principal y el resto dialogos, pero me temo q no :( Este sencillo ejemplo muestra como lo hago.

Code: Select all  Expand view
#include 'FWCE.ch'
#include 'winapi.ch'

FUNCTION Main()

   LOCAL oWnd

   IF StillRun()
      RETU NIL
   ENDIF

   DEFINE WINDOW oWnd TITLE "MiVentana"
   ACTIVATE WINDOW oWnd ON INIT IniDlg01()

RETU NIL


STATIC FUNCTION IniDlg01()

    LOCAL oDlg

    DEFINE DIALOG oDlg TITLE 'Dlg01' SIZE 200,100 COLOR CLR_BLACK, CLR_RED

*        oDlg:nStyle := nOR( DS_MODALFRAME, WS_POPUP, WS_BORDER, WS_SYSMENU )

        @1,4 BUTTON 'Salir' OF oDlg ACTION oDlg:End()

    ACTIVATE DIALOG oDlg CENTERED

RETU NIL

#pragma BEGINDUMP

#include <windows.h>
#include <hbapi.h>

HB_FUNC (STILLRUN)
{
   HWND hWnd;
   BOOL lRet = FALSE;
   hWnd = FindWindow (NULL,L"MiVentana");
   if (hWnd)
   {
      SetForegroundWindow ( hWnd );
      lRet = TRUE;
   }
   hb_retl (lRet);
}


#pragma ENDDUMP


Quizas es la funcion SetForegroundWindow() q no trae a un primer plano la ventana activa ?

Nota: Ya se que muchos usuarios, como tus viajantes, son torpes, pero coñe, si tan torpes son, q carajo hacen con una Pocket ? :roll:

Saludos.
C.

PostPosted: Tue Feb 28, 2006 10:01 am
by astursoft
Bueno , primero decir que yo tengo todos los dialogos desde recursos , cuando descubrí el problema cambié todas las ventanas por dialogos y como no existian los de codigo ..... .mira a ver si ese es el problema , por que yo tengo un codigo clavado al tuyo y no le veo problema .

Respecto a lo del uso de pocket por viajantes , cosa de marketing empresarial ( la competencia los lleva ) y de rapidez , mandas el envio delante del cliente , le dices el importe y al dia siguiente en tienda .

He hecho este cambio al stillrun( cTitulo) , aunque no lo he probado aun....

Code: Select all  Expand view
HB_FUNC (STILLRUN)
{
   HWND hWnd;
   BOOL lRet = FALSE;
   hWnd = FindWindow (NULL,AnsiToWide( hb_parc( 1 ) ) );
   if (hWnd)
   {
   SetForegroundWindow ( hWnd );
   lRet = TRUE;
   }
   hb_retl (lRet);
}


Saludos

PostPosted: Tue Feb 28, 2006 10:05 am
by Carles
Jose Luis,

Pues el ejemplo q hay mas arriba, si lo pruebas, estando en la caja de dialogo, vuelves a iniciar el programa, y se inicia peroooo activando la ventana principal.

Uhmmm, seguiremos probando..

Gracias y un saludo.
Carles.

PostPosted: Tue Feb 28, 2006 3:16 pm
by astursoft
Carles , tienes toda la razon , falla , pero te diré mas .Tengo el programa compilado con las versiones anteriores de fwpcc ( una copia de la version anterior , antes de unos cambios importantes ) con fecha del 16 de febrero y en este programa funciona bien .
Parece ser que en el build que se introducen los dialogos por codigo , se introducen cambios que no permiten el buen funcionamiento , y el caso es que he machacado la version ( a ver si la encuentro por ahi ...)
Saludso.

PostPosted: Tue Feb 28, 2006 3:20 pm
by Carles
Hi Jose Luis,

Ya me parecia a mi. Ya no pierdo mas tiempo en este punto. Ya te dije, lo solucione cheuqeando si esta la aplicacion activa y en caso afirmativo, muestro un mensaje y salgo. Q la busquen que no cuesta nada :evil:


Saludos.
C.

PostPosted: Tue Feb 28, 2006 3:38 pm
by astursoft
He encontrado la version con lib del 21 de febrero ( justo la anterior , creo) , he recompilado el programa y funciona bien , mientras se resuelve esto , yo voy a volver a esta versión , tengo demasiadas ventanas en cascada como para que las tengan que recuperar en el orden correcto .
Saludso.

PostPosted: Tue Feb 28, 2006 7:12 pm
by jlcapel
Hola,

¿Habeis probado a hacer un hide de aquellas ventanas que no están activas y solo tener visible la que se está viendo (y valga la redundancia)?

Saludos,
José Luis Capel

PostPosted: Tue Feb 28, 2006 8:22 pm
by astursoft
con hide() , no se resuelve el problema , he modificado un poco el tutor06 , para probarlo , pero no vale , se queda la ventana oculta , menos el menu :shock: :shock:
Antoniooo ... Socorrooo :D :D
Creo que esto ya es cosa de Antonio .
De momento me quedo en la version anterior , y mira que me fastidia ahora que tenía los dialogos de codigo y el log de errores ...
Por hoy ya está bien.
Saludso.

PostPosted: Tue Feb 28, 2006 9:31 pm
by jlcapel
José Luis,

Prueba a ocultar el menú así:

ShowWindow( oMenu:hMenu, SW_HIDE)

Saludos,
José Luis Capel

PostPosted: Wed Mar 01, 2006 8:26 am
by astursoft
Se puede ocultar el menu , pero eso no resuelve el problema , el dialogo sigue quedando en segundo plano .
Esto es cosa de Antonio , creo , pero con las nuevas modificaciones...
Demosle tiempo , cuando termine con éstas, veremos si queda resuelto , y sino ya veremos.
Para mi es esencial este punto , me quedaré con lo que está estable de momento ( en esta semana se juega el uso o no de mi programa ).
Saludso.

PostPosted: Wed Mar 01, 2006 12:24 pm
by Antonio Linares
Jose Luis,

Cual sería un ejemplo pequeño y completo que reproduzca el problema ? gracias.

PostPosted: Wed Mar 01, 2006 12:29 pm
by Carles
Antonio,

El tercer post de este hilo es un ejemplo q puedes probar. Se trata de ejecutarlo, irte al menu y volver a ejecutarlo. el resultado esta en q te aparece la ventana principal y NO el dialog activo.

Nota: Como te aprietan la tropa, eh ;-)

Saludos.
C.

PostPosted: Wed Mar 01, 2006 12:38 pm
by astursoft
Antonio , el tutor06 con estos cambios

Code: Select all  Expand view
function Main()

   local oWnd

//--------   añadido ----------
  if STILLRUN()
       Quit
   endif
//-------------------------


   DEFINE WINDOW oWnd TITLE "Tutor06" ;
      MENU BuildMenu()

  @1,4 BUTTON 'Hola' OF oWnd ACTION ShowDialog()
   ACTIVATE WINDOW oWnd ;
     ON INIT  ShowDialog() ;         // añadido -------------------- 
      ON CLICK MsgInfo( "Click!" )

Return Nil


HB_FUNC (STILLRUN)
{
   HWND hWnd;
   BOOL lRet = FALSE;
   hWnd = FindWindow (NULL,L"Tutor06" );
   if (hWnd)
   {
   SetForegroundWindow ( hWnd );
   lRet = TRUE;
   }
   hb_retl (lRet);
}




Lanzas el programa ( se coloca el dialogo delante ) , te vas al explorador del pocket y vuelves a llamar al programa ....
Antes del ultimo build se colocaba la ventana tutor06 y delante el dialogo , ahora se coloca la ventana y el dialogo queda aculto .
Gracias por tu atencion.

-------------------- editado --------------------------
Veo que Carles esta casi sincronizado conmigo , mientras escribo el mensaje el ya ha respondido :D :D .
Cualquiera de los dos vale .