Ver Mensaje Individual
  #9  
Antiguo 20-10-2010
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Reputación: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Question

Cita:
Empezado por mcs Ver Mensaje
Dónde está el problema en usar un timer para leer las coordenadas del mouse?
Pues, precisamente, en que el timer puede "activarse" fuera de contexto (que es lo que sospecho que le pasa a nuestro compañero LuisAlf:. No se puede garantizar que las interrupciones se produzcan en un momento determinado: se producirán cuando se produzcan y ya está.

Un ejemplo práctico es el procedimiento "Sleep". Tú le puedes decir que duerma durante 100 milisegundos, pero nada garantiza que exactamente 100 milisegundos después el sistema devuelva el control al programa. No sé cómo implementa los timer Delphi (supongo que usando MSG_TIMER del API, y posiblemente con un hilo [fork] paralelo) pero las posibilidades de que pase lo mismo son importantes. No olvidemos, tampoco, que Windows no es un sistema operativo de "tiempo real", como sí lo es MS-DOS, por ejemplo.

Si se quiere utilizar un timer, habrá de asegurarse de eliminarlo antes de que se salga del contexto, o al menos evitar que funcione si está fuera de él. Se me ocurre que antes de obtener las coordenadas del ratón, quizá se pueda comprobar si el objeto "mouse" o el contenedor del mismo sigue existiendo. Algo así como:
Código Delphi [-]
  IF mouse <> NIL THEN
  BEGIN
     CoordenadaX := mouse.curPos.x;
  END;

O quizá usar "SELF" o "Application" en lugar de "mouse".

<-- Evitar doble post -->

Cita:
Empezado por LuisAlf:: Ver Mensaje
Jajajaja....pues a mi..claro!!!

Mira exacto!!! No hay ningun problema al utilizar un timer para este objetivo, ya que es un procedimiento que se llama cada determinado tiempo y es exactamente lo que tu me planteaste un procedimiento que lee las posiciones del cursor...cada cierto tiempo...


Esto ya lo habia contemplado, ya que un amigo me dijo algo de manejo de la excepcion... para encapsular el error y si...por hay fue mi solucion, yo batallando con la suspension de la sesion...jajaja mal enfoque del problema

Asi es lo que hice ayer fue eso, manipule el evento manejador de excepciones
Código Delphi [-]
 private
    { Private declarations }
    procedure TratarExcepciones (sender: tObject; e : Exception);
....

procedure TForm1.FormCreate(Sender: TObject);
begin
...
                    Application.OnException := TratarExcepciones;
.....
end;
creando un procedimento de tipo object, y que creen lo que puse en el procedure...
pues "nada"
jajaja
Código Delphi [-]
procedure tForm1.TratarExcepciones (sender: tObject; e:Exception);
begin
//NADADENADA
 end;
Dejenme explicarme, lo que pasa es que puse un showmessage en el procedimento para ver si encapsulaba el error que me mostraba windows y si efectivamente el showmessage se muestra en lugar de las otras ventanas del error que el propio windows me mostraba...

Y como yo no quiero que muestre ningun mensaje pues le quite el showmessage... de esta forma el error no se muestra y la aplicacion sola se estabiliza, trabajando correctamente despues de restaurada la sesion....

No se si sea la forma mas ortodoxa de solucionarlo pero funciona....
No se me había ocurrido esta solución.

Aunque funcionar, funcionar... El problema aquí es que si se produce otro error, entonces no te enterarás... Quizá sea buena idea dejar constancia de los errores en algún sitio, como por ejemplo en un archivo de disco, por si las moscas.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita