| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Vie 13 May, 2011 9:35 am Asunto: Diferenciar eventos Click , DobleClick en raton |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Vie 13 May, 2011 7:47 pm Asunto: |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Dom 15 May, 2011 10:30 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 16 May, 2011 1:43 am Asunto: |
|
|
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 pero espero que al menos te sirva como base. |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Lun 16 May, 2011 9:52 am Asunto: |
|
|
Muchas gracias Leo ..
Nota : Todo codigo que funciona ya es "bonito" de Por si |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Jue 19 May, 2011 12:51 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 19 May, 2011 5:20 pm Asunto: |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Jue 19 May, 2011 6:55 pm Asunto: |
|
|
| Gracias Leo, voy a probarlo. |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Vie 20 May, 2011 8:35 am Asunto: |
|
|
| !!Perfecto!! Muchas Gracias. |
|
| Volver arriba |
|
 |
|