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 

Diferenciar eventos Click , DobleClick en raton

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Diferenciar eventos Click , DobleClick en raton Responder citando

Buenas

Tengo un componente que debe de actuar de una forma si se hace un solo click con el raton y de otra forma si se hace dobleClicK...el problema es que al hacer doble click se ejecuta en primer lugar el evento Onclick (un solo click) accion que no deseo...como puedo evitarlo

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

Buenas... Otra vez

En la cuestion anterior quiza proponia algo imposible que era hacer DobleClicK sobre un componente y evitar que se produjera el evento OnClick...

Lo que realmente quiero conseguir es que al hacer DobleClick y activarse el evento OnclicK, este reconozca que se ha echo dobleClick,no realize las operaciones que contiene y salte al evento DobleClick donde si realiza las operaciones que este envento tenga implementadas.

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

Buenas...De nuevo (o de Viejo)

Aunque peque de pesado.... Cuando tenemos seleccionado un archivo o una carpeta en windows si hago un click con el raton sobre él me da la opcion de cambiar su nombre.... si hago doble Click ejecuta el archivo.....

¿¿ Como puedo diferenciar esa dos acciones con el raton en un componente..... Es posible??

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

La única forma de conseguirlo es que te hagas cargo tu de detectar los doble-clicks (desactivándolos previamente). Ya que Windows funciona de la siguiente manera, se lanzan los siguientes mensajes:

// Esto es un click
WM_LBUTTONDOWN
WM_LBUTTONUP

// Y si hay un segundo click lo suficientemente rápido además de los anteriores se dispararan:
WM_LBUTTONDBLCLK
WM_LBUTTONUP

Como ves, siempre que se detecta un doble-click se dispara también un click, es por esto que siempre habrá un OnClick antes del OnDblClick.

En la "chapucilla" que voy a poner a continuación lo que hago es desactivar los doble-clicks para el control que queramos, por tanto nunca va a recibir un WM_LBUTTONDBLCLK, y seremos nosotros los encargados de detectar cuando se produce un doble-click (contando el tiempo entre clicks).

Después de un click simple haremos una pequeña espera, y si se pulsa una segunda vez lo dispararemos OnDblClick, si pasado ese retardo no hay otro click, se disparara OnClick.

- Creamos un archivo de cabecera llamado por ejemplo: DblClk.h, y copiamos en el lo siguiente:
Código:
//----------------------------------------------------------------
#ifndef DblclkH
#define DblclkH
//----------------------------------------------------------------
#define BEGIN_DBLCLICK_DETECT(tipo, comp)                        \
    tipo* control = comp;                                        \
                                                                 \
    static struct LocalTimer : public TTimer {                   \
        void __fastcall TimerEvent(TObject* sender)              \
        {                                                        \
            Tag--;                                               \
            Form1->Caption = 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 = new LocalTimer(this, control);               \
                                                                 \
    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
//----------------------------------------------------------------

Y un ejemplo de uso:
Código:
// Añadimos la cabecera: #include<DblClk.h>

// Supongamos que queremos hacer esta detección
// con un TPanel (Panel1), asignaríamos los eventos
// OnClick y OnDblClick en tiempo de diseño de manera normal,
// y dentro de ellos ponemos los siguiente:

//-----------------------------------------------------
void __fastcall TForm1::Panel1Click(TObject *Sender)
{
BEGIN_DBLCLICK_DETECT(TPanel, Panel1)

    // Aquí ponemos nuestro código como siempre:
    Memo1->Lines->Append("CLICK-PANEL");

END_DBLCLICK_DETECT;
}
//-----------------------------------------------------
void __fastcall TForm1::Panel1DblClick(TObject *Sender)
{
    // En el OnDblClick no hay que hacer nada especial
    Memo1->Lines->Append("DOBLE-CLICK-PANEL");
}

Cuando se pulsa un click hay un pequeño retardo, es necesario lógicamente ya que entre ese retardo y un segundo click decidimos que vamos a disparar. Si te fijas en el explorador de Windows se produce lógicamente también un retardo.

El código no es muy bonito Wink pero espero que al menos te sirva como base.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Leo ..

Nota : Todo codigo que funciona ya es "bonito" de Por si
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Buenas...

Leo he creado el archivo cabecera (DblClK.h) copie tal cual el codigo anterior (sin los simbolos / ) y lo he guardado en la carpeta que contiene el proyecto.
Incluyo el archivo de la manera: "DblClK.h" y ejecuto el programa

Me da varios errores

El primero en la linea

Código:
#define BEGIN_DBLCLICK_DETECT(tipo, comp)                        \
    tipo* control = comp;


Declaration sintax error (tipo)


Que hago mal , Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Descárgalo desde este enlace, ya que lo que ves pegado arriba está correcto, pero probablemente al copiarlo desde el foro se introduce algún carácter oculto.

(He probado simplemente a pegarlo, guardar el archivo, y luego para corregirlo solo he hecho algo curioso, es recorrer todo el .h en el editor con los cursores, supongo que al hacerlo el editor va quitando esos caracteres ocultos, ya que según vas pasando se ponen las líneas verdes..)

http://telefonica.net/web/ljfg/temp/dblclkh.zip
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias Leo, voy a probarlo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

!!Perfecto!! Muchas Gracias.
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.