Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Ayuda acerca de WM_KEYFIRST/WM_KEYLAST (https://www.clubdelphi.com/foros/showthread.php?t=18326)

Jan_polero 09-02-2005 10:43:41

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.

roman 09-02-2005 14:45:26

Cita:

Empezado por Jan_polero
Pienso que tal vez sea pq los valores que hay entre WM_MOUSEFIRST y WM_MOUSELAST incluyan el movimiento del ratón

Así es. Podrías incluir en elcondicional la condición Msg.message <> WM_MOUSEMOVE. De cualquier forma lo mejor es que consultes la ayuda del SDK de Windows (incluida con Delphi) para ver exactamente cuáles son los mensajes que quieres incluir.

// Saludos

Jan_polero 09-02-2005 15:59:18

Gracias,Román.Era justamente eso, que en mi máquina no funcionaba correctamente porque tb detectaba el movimiento del ratón. Un saludo.


La franja horaria es GMT +2. Ahora son las 05:16:07.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi