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

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Mar 30 Ago, 2011 7:06 pm Asunto: Problema al distinguir Click de DobleClick sobre un componen |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 01 Sep, 2011 2:57 pm Asunto: |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 01 Sep, 2011 5:43 pm Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

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

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Mar 06 Sep, 2011 9:23 am Asunto: |
|
|
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  |
|
| Volver arriba |
|
 |
|