Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problema al distinguir Click de DobleClick sobre un componen

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema al distinguir Click de DobleClick sobre un componen Responder citando

Buenas:

Desde un Formulario principal accedo a otro Secundario en el que manejo la accion Click y DobleClick sobre un componente de forma diferente...(Gracias Leo).
El caso es que la primera vez que accedo al Formulario Secundario no tengo ningun problema en distinguir cuando hago un solo Click o Dos Clicks del Raton sobre el Componente....el problema surge cuando salgo del Segundo Formulario Vuelvo al Principal y nuevamente accedo al Secundario...es entonces cuando no se distingue un Clic de Dos Clicks .

Para mostrar el problema e subido una Aplicacion donde se muestra el error...

http://www.megaupload.com/?d=X8LWOHOG

Alguna idea

Gracias...
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hacemos una pequeña modificación en la "chapucilla" anterior. Cambiamos el DblClk.h anterior por este:
Código:
//----------------------------------------------------------------
#ifndef DblclkH
#define DblclkH
//----------------------------------------------------------------
#define BEGIN_DBLCLICK_DETECT(tipo, comp)                        \
    tipo* control = comp;                                        \
                                                                 \
    struct LocalTimer : public TTimer {                          \
        void __fastcall TimerEvent(TObject* sender)              \
        {                                                        \
            Tag--;                                               \
            if (!Tag) {                                          \
                Enabled = false;                                 \
                control_->OnClick(0);                            \
            }                                                    \
        }                                                        \
                                                                 \
        __fastcall LocalTimer(TComponent* owner, tipo* control)  \
            : TTimer(owner), control_(control)                   \
        {                                                        \
            control_->ControlStyle >> csDoubleClicks;            \
            Enabled = false;                                     \
            Interval = 55;                                       \
            OnTimer = TimerEvent;                                \
        }                                                        \
                                                                 \
        tipo* control_;                                          \
    } *localTimer = reinterpret_cast<LocalTimer*>(control->Tag); \
                                                                 \
    if (!localTimer) {                                           \
        localTimer = new LocalTimer(this, control);              \
        control->Tag = reinterpret_cast<int>(localTimer);        \
    }                                                            \
                                                                 \
    if (!Sender) {                                               \
        Sender = comp;
//----------------------------------------------------------------
#define END_DBLCLICK_DETECT                                      \
        return;                                                  \
    }                                                            \
                                                                 \
    if (localTimer->Enabled) {                                   \
        localTimer->Enabled = false;                             \
        control->OnDblClick(this);                               \
    } else {                                                     \
        localTimer->Tag = 4;                                     \
        localTimer->Enabled = true;                              \
    }
//----------------------------------------------------------------
#endif
//----------------------------------------------------------------

El enlace para descargar, por si al usar copiar y pegar da algún problema:
http://telefonica.net/web/ljfg/temp/dblclkh2.zip

En la versión anterior usaba un puntero static porque había pensado la chapucilla para un Form que se crearía una sola vez y permanecería todo el tiempo creado en el programa. En esta versión en lugar de esto almaceno el puntero en la propiedad Tag del componente sobre el que se hará el doble-click, por tanto debemos recordar no tocar la propiedad Tag del mismo ya que habrá problemas.

Y recuerda liberar el form modal como te ha dicho escafandra en el ClubDelphi ya que sino esto no funcionara correctamente.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Que tal _Leo.

Yo he propuesto simplificar el sistema de diferenciación midiendo tiempos entre clicks de esta forma:
Código:

//----------------------------------------------------------------
#ifndef DblclkH
#define DblclkH
#include "time.h"
//----------------------------------------------------------------
#define DBLCLICK_DETECT()                        \
   static clock_t start = clock();               \
   clock_t  dif = clock()-start;                 \
   if(dif < GetDoubleClickTime() && dif > 1){    \
      start = clock();                           \
      return;                                    \
   }                                             \

//----------------------------------------------------------------
#endif
//----------------------------------------------------------------


Así se evitan los conflictos de creación y destrucción del Timer. Las pruebas que he realizado me han resultado satisfactorias.


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

escafandra escribió:
Yo he propuesto simplificar el sistema de diferenciación midiendo tiempos entre clicks de esta forma

Si, al principio se me ocurrió hacerlo de manera similar, pero neg1414 tenía unos requisitos un poco especiales, y era que usaba varios bucles dentro de los eventos que bloqueaban los mismos durante un rato, desconozco porque tiene que ser así, pero trate de adaptarme a lo que el tenia y el timer me pareció lo más sencillo en ese momento.

De todas formas si a neg1414 le viene bien este sistema (más limpio), estupendo, yo realmente no uso este código en mis programas, solo lo hice para responderle. Nunca he necesitado hacer algo así, y el único programa que me viene a la cabeza que hace esto es el explorador de Windows (en realidad el ListView que usa el explorer.exe).
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Buenas ...

Gracias a los dos... Efectivamente la primera vez que plantee el problema (ver historico) el codigo era algo "especial", y la solucion de Leo se adaptaba perfectamente, al problema...
La evolucion del Proyecto cambio algunas cosas por eso mi segundo Hilo...

Gracias de nuevo.. sin foros como este (y en especial sin vosotros dos) un autodidacta como yo jamas avanzaria.....

... Y sin pagar un duro Very Happy
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.