PDA

Ver la Versión Completa : Ayuda acerca de WM_KEYFIRST/WM_KEYLAST


Jan_polero
09-02-2005, 10:43:41
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:


{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
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.