Ver Mensaje Individual
  #1  
Antiguo 09-02-2005
Jan_polero Jan_polero is offline
Miembro
 
Registrado: may 2004
Posts: 62
Reputación: 21
Jan_polero Va por buen camino
Ayuda acerca de WM_MOUSEFIRST/WM_MOUSELAST

Hola a todos. Estoy realizando una aplicación que muestra cuestionarios en un terminal con pantalla táctil. Utilizo unos Timers para mostrar avisos cada cierto tiempo si no se pulsa nada( no hay teclado en el terminal, por lo que sólo se debería tener en cuenta las pulsaciones del ratón). En este foro me dieron una solución. En principio funciona bien pero hay ocasiones en que falla y no se muestran los avisos.Pienso que tal vez sea pq los valores que hay entre WM_MOUSEFIRST y WM_MOUSELAST incluyan el movimiento del ratón o algún otro evento que se produzca en mi máquina aquí en la oficina.Tampoco sé si una pantalla táctil detecta el movimiento del ratón. Aquí pongo el código:

Código Delphi [-]
{aclaraciones}
// Tfbaseven es un frame con una pregunta del cuestionario
// TFMaencven es el formulario que alberga todas las preguntas(TFbaseven)
 
procedure Tfbaseven.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
// puse esta condición para reiniciar los timers sólo al detectar clicks del ratón
if (Msg.message >= WM_MOUSEFIRST) and (Msg.message <= WM_MOUSELAST) then
  begin
  {Reseteamos el timer de la pregunta}
  //Deshabilitamos el timer 
  TimerOut.Enabled := False;
  //volvemos a asignar el timeout 
  TimerOut.Interval := Pregunta.TimeOut * 1000;
 //Activamos el timer de nuevo
  TimerOut.Enabled := True;
 {lo mismo pero con el timer del cuestionario}
  //Reiniciamos el tiempo de espera del cuestionario
  TFMaencven(Owner).TimerCuest.Enabled := False;
  TFMaencven(Owner).TimerCuest.Interval :=  FCuestionario.TiempoMaxExpera  * 1000;
  TFMaencven(Owner).TimerCuest.Enabled := True;
  end;
end;
 
/////////EVENTO DEL TIMER DE LA PREGUNTA ////////////
procedure Tfbaseven.TimerOutTimer(Sender: TObject);
var
  Estado: TEstado;
begin
  //deshabilito el timer
  TimerOut.Enabled := False;
  TimerOut.Interval := Pregunta.TimeOut * 1000;
  try
  ...

  Estado := TEstado(FCuestionario.GrafoNavegacion.EstadoActual);
    //realizo comprobaciones previas
    if TFBaseven(Estado.Frame).Pregunta.ID =  Estado.id then
      if TFBaseven(Estado.Frame).Pregunta.Aviso <> nil then
        if not Assigned(FAviso) then
          try
            //creao el aviso y lo muestro            
            FAviso := TFAviso.Create(Self,Pregunta.Aviso);
            FAviso.ShowModal;
          Finally
            FreeAndNil(FAviso);
          end;
  finally
    //vuelvo a habilitar el timer
    TimerOut.Enabled := True;
  end;
end;
Esto me produce que en ocasiones no se muestren los avisos.Si alguien me puede dar información de hacerlo de una manera mejor o de explicarme por qué puede fallar estaría muy agradecido. Un saludo y gracias por adelantado.

Última edición por Jan_polero fecha: 09-02-2005 a las 12:22:46.
Responder Con Cita