Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problemas con el cursor del ratón (https://www.clubdelphi.com/foros/showthread.php?t=91443)

Angel.Matilla 08-02-2017 11:07:20

Problemas con el cursor del ratón
 
No sé por qué pero a veces el cursor del ratón se queda invisible en el formulario activo y por lo tanto es complicado saber dónde demonios se está.

En principio esto me ocurría en un formulario que tenía algunos TComboBox, y siguiendo una sugerencia hecha en otro foro, los he reemplazado pero da lo mismo. Ahora mo lo hace igual pero sólo en un TCheckListBox y sólo al marcar una primera casilla; si se marca una segunda, ya sea con el teclado o adivinando dónde está el ratón, se vuelve a mostrar y ya no se oculta. ¿Hay alguna forma de hacer que dicho cursor sea siempre visible? Salvo, claro está, que se le oculte exprofeso.

Neftali [Germán.Estévez] 08-02-2017 12:29:32

Si no lo has cambiado tu, ¿puede ser que algún componente de terceros te lo esté "tocando"?

Angel.Matilla 08-02-2017 13:42:01

Cita:

Empezado por Neftali (Mensaje 513042)
Si no lo has cambiado tu, ¿puede ser que algún componente de terceros te lo esté "tocando"?

No uso ningún componente ajeno a Borland.

ecfisa 08-02-2017 16:00:41

Hola.

Al ser un comportamiento errático es bastante difícil encontrar la parte en que se produce y sin conocer el código, ciertamente es aventurar la respuesta.

Pero, para verificar si algún componente (o línea de código) está ocultando el cursor, intentá usando la función ShowCursor, cuando desaparezca:
Código PHP:

void __fastcall TForm1::btShowCursorClickTObject *Sender )
{
  
ShowCursortrue );


Si de ese modo se visualiza el cursor nuevamente, un parche podría ser:
.h
Código PHP:

...
class 
TForm1 : public TForm
{
  ...
private:    
// User declarations
  
void __fastcall AppMessagetagMSG &msgbool &Handled );
... 

.cpp
Código PHP:

#define CURSOR_HIDDEN 0

void __fastcall TForm1::AppMessagetagMSG &msgbool &Handled )
{
  
CURSORINFO ci = { };

  
GetCursorInfo( &ci );

  if ( 
ci.flags == CURSOR_HIDDEN 
    
ShowCursortrue );
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  ...
  
Application->OnMessage AppMessage;
}
... 

No es una solución óptima, pero sin poder acceder al código es lo que se me ocurre...

Saludos :)

Pd: Me olvidaba, cuando sucede ¿ Revisaste si se está insertando algún dispositivo físico que pudiera estar suprimiendo el cursor ?

Angel.Matilla 08-02-2017 17:28:55

Muchísimas gracioas por tu respuesta.
Cita:

Empezado por ecfisa (Mensaje 513047)
Hola.

Al ser un comportamiento errático es bastante difícil encontrar la parte en que se produce y sin conocer el código, ciertamente es aventurar la respuesta.

Pero, para verificar si algún componente (o línea de código) está ocultando el cursor, intentá usando la función ShowCursor, cuando desaparezca:
Código PHP:

void __fastcall TForm1::btShowCursorClickTObject *Sender )
{
  
ShowCursortrue );



No conocía esta función. La he puesto; no sé si es por ella o por haber cambiado la presentación del CheckListBox lo ciertoe s que ahora no se oculta el cursor. Soy el primer sorprendido con el comportamiento del ratón, pero parece que de alguna forma se ha resuelto.
Cita:

Empezado por ecfisa (Mensaje 513047)
Pd: Me olvidaba, cuando sucede ¿ Revisaste si se está insertando algún dispositivo físico que pudiera estar suprimiendo el cursor ?

Ocurría cuando hacía click por primera vez en alguna de las casillas de verificación.

aguml 11-02-2017 11:32:21

Pero eso no es una solución, es un parche.
Podrías poner un BP en la línea donde se llama a ShowCursor y seguir con f7 a ver donde sales.
También podrías abrirlo en un depurador cómo Ollydbg y poner un BP condicional por ejemplo en TranslateMessage con el mensaje usado para ocultar el cursor que creo seria WM_SETCURSOR y a partir de ahí tracear y ver desde donde fue enviado ese mensaje.
Es algo más complejo que un parche pero es mejor solución si el problema lo está creando tu código ya que encontrarás el fallo y podrás corregirlo sin necesidad de parchear nada.

aguml 11-02-2017 12:01:25

¿Seguro que no llamas en tu código a SetCursor? Si lo llamas sin parámetro o con un parámetro inválido el cursor desaparece.
Mira aqui: https://msdn.microsoft.com/es-es/lib...(v=vs.85).aspx

Angel.Matilla 11-02-2017 12:20:56

Completamente seguro.

aguml 11-02-2017 13:09:58

Puedes subir el binario sin el parche para ver donde falla exactamente? A ser posible con información de depuración para poder seguir mejor en el depurador.


La franja horaria es GMT +2. Ahora son las 00:45:12.

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