Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consulta (https://www.clubdelphi.com/foros/showthread.php?t=46791)

eldiegofg 08-08-2007 18:06:57

Consulta
 
Tengo un componente al que quiero asignarle un procedimiento a su evento OnClick y otro procedimiento diferente al evento OnDobleClick. Mi problema es que cuando hago doble clic, me ejecuta primero la rutina de OnClick y luego la de OnDobleClick. Hay alguna forma de evitar o controlar esto?
Agradezco su tiempo y dedicacion de antemano y felicito por este fabuloso foro. Saludos:)

Caral 08-08-2007 18:27:42

Hola
Me parece dificil, cuando haces click, pues eso, ya lo hiciste, ejecutara el evento, yo te aconsejaria que cambiaras el evento ondobleclick por otro.
Saludos

ArdiIIa 08-08-2007 19:14:19

Hola eldiegofg
De lo mas asequible que he visto por ahí, me quedo con esto.
Código Delphi [-]
procedure TForm1.TuComponenteClick(Sender: TObject);
var
  Msg: TMsg;
  TargetTime: Longint;
begin
  TargetTime := GetTickCount + GetDoubleClickTime;

  while GetTickCount < TargetTime do
    if PeekMessage(Msg, TuComponente.Handle, WM_LBUTTONDBLCLK, WM_LBUTTONDBLCLK, PM_NOREMOVE)
      then Exit;
  .... codigo......
end;


procedure TForm1.TuComponenteDblClick(Sender: TObject);
begin
ShowMessage('DOBLE click');
end;

Espero que te sirva.

Saludos

cHackAll 08-08-2007 21:57:17

Lo probaste ArdiIIa? pues a mi no me funciona... analizando un poco tiene entremezclado los conceptos de Caral, el Güindos envía un mensaje a la aplicacion de la "caida" de un boton (WM_?BUTTONDOWN), la VCL traduce mensaje como OnClick, cuando se hace doble click y la ventana creada con el estilo que acepta tal cosa (CS_DBLCLKS), recive el mensaje del doble click (WM_?BUTTONDBLCLK)... sin embargo el problema no es de la VCL del hermoso Delphi, si no del manejo de los mensajes del Güindos... talvez no es falla si no es algo real pues como dijo el amigo Caral "...cuando haces click, pues eso, ya lo hiciste..."

Veamos...

ArdiIIa 08-08-2007 22:16:40

Cita:

Empezado por cHackAll (Mensaje 221841)
Lo probaste ArdiIIa? pues a mi no me funciona... analizando un poco tiene entremezclado los conceptos de Caral, el Güindos envía un mensaje a la aplicacion de la "caida" de un boton (WM_?BUTTONDOWN), la VCL traduce mensaje como OnClick, cuando se hace doble click y la ventana creada con el estilo que acepta tal cosa (CS_DBLCLKS), recive el mensaje del doble click (WM_?BUTTONDBLCLK)... sin embargo el problema no es de la VCL del hermoso Delphi, si no del manejo de los mensajes del Güindos... talvez no es falla si no es algo real pues como dijo el amigo Caral "...cuando haces click, pues eso, ya lo hiciste..."

Veamos...



Que quieres que te diga cHackAll.
Si no lo hubiera probado, no lo hubiera puesto, y si no funcionara, tampoco.

Esta cuestión no es la primera que que se plantea, sino que ya es muy antigua.
Como puedes ver puse "de lo mas asequible", que no la mas convincente...

No se de que tipo de componente estamos hablando y que requerimientos tiene eldiegofg.

Quizas, lo mas conveniente sería hacer una derivación del componente y controlar todos los mensajes que recibe a su WndProc, y ahí si se podría discernir si ha sido un Click o un DblClick....

¿Merece la pena ....?

Saludos

eldiegofg 09-08-2007 00:11:10

Muchas gracias a todos por su tiempo y ayuda. Voy a probar lo propuesto por ArdiIIa a ver si me funciona y les cuento. El componente es un calendario sobre el cual estoy haciendo un sistema de reservas. Con el doble click doy de alta una nueva reserva, mientras que el click simple en una fecha lo utilizaba para mostrar (usando el Hint) informacion sobre la reservas de dicha fecha. Tal vez deberia hacer que el Hint se muestre al pasar el puntero del mouse sobre cada dia, pero soy nuevo en esto y sinceramente no se como hacer... Que dicen ustedes?

cHackAll 09-08-2007 00:13:45

Cita:

Empezado por ArdiIIa
...Quizas, lo mas conveniente sería hacer una derivación del componente y controlar todos los mensajes que recibe a su WndProc, y ahí si se podría discernir si ha sido un Click o un DblClick....

Estimado compañero, el comentario fue de las mejores intenciones no era para que respondas de esa forma y casi que ni estaba orientado a "alguien". Me parece un tema curioso por eso yo participo. Lo que comentabas del WndProc tampoco funcionará por la explicacion que di con anterioridad.

Cita:

Empezado por ArdiIIa
... ¿Merece la pena ....? ...

Yo creo que si.

Saludos y haber que hacemos...

Caral 09-08-2007 00:17:50

Hola
ArdiIIa y cHackAll, ya os pasasteis de copas, a la casa.
La verdad mejor no, vamos a la taberna, yo invito.
Saludos, niños.

ArdiIIa 09-08-2007 02:31:22

Cita:

Empezado por cHackAll
Estimado compañero, el comentario fue de las mejores intenciones no era para que respondas de esa forma y casi que ni estaba orientado a "alguien". Me parece un tema curioso por eso yo participo. Lo que comentabas del WndProc tampoco funcionará por la explicacion que di con anterioridad.



Yo creo que si.

Saludos y haber que hacemos...

Estimado cHackAll, solamente respondí a tu pregunta
Cita:

Lo probaste ArdiIIa?
Tal vez no del modo adecuado, pero ahora me surge la duda de si tú lo has probado?, porque reitero que SI FUNCIONA.

En cuando a lo de capturar los mensajes del componente, bueno pues... en vez de andar "hackeando componentes", la prueba que hago es ir directamente a por su WndProc y el resultado es este....

Código Delphi [-]
procedure TFormMain.Button1Click(Sender: TObject);
begin
FNuevaInstancia := MakeObjectInstance(NuevoWndProc);
FPrevInstancia  := Pointer(GetWindowLong(ScrollBox1.Handle,GWL_WNDPROC));
SetWindowLong(ScrollBox1.Handle,GWL_WNDPROC, LongInt(FNuevaInstancia));
end;



procedure TFormMain.NuevoWndProc(var Message: TMessage);
begin
   with Message do
     case Msg of
       WM_RBUTTONDBLCLK :
       begin
          ShowMessage('DOBLE CLICK');
          Result := 1;
       end;
       WM_LBUTTONUP :
       begin
          ShowMessage('UN CLICK');
          Result := 1;
       end;

       else
         Result := CallWindowProc(FPrevInstancia,
                                  ScrollBox1.Handle,
                                  Msg,
                                  wParam,
                                  lParam);
   end;


 end;



Ciertamente, NO FUNCIONA.

Pero para salir del paso, observarás que he cambiado lo que debería ser el botón izquierdo por el derecho, y de ese modo SI FUNCIONA... Aunque cambia la mecánica, podría ser una solución.


Saludos.

ArdiIIa 09-08-2007 02:37:47

Leyendo a eldiegofg he de decir que tal vez a la vista de componente con lo que quieres utilizar el sistema, si utilizas el segundo sistema propuesto, el de WndProc, cuando efectúes un solo click, tal vez se reciban dos mensajes de un solo click...


Leyendo a Caral: Es que el día de hoy (Ayer), ha estado repledo de celebraciones y .... ya se sabe...:D:D

cHackAll 12-08-2007 01:58:25

Vaya, creo que lo que debías hacer a continuación es revisar éste truco.

Saludos!

ArdiIIa 12-08-2007 11:17:22

Esto me suena.... parece un "Deja Vu"

cHackAll 12-08-2007 16:35:44

Cita:

Empezado por ArdiIIa
Esto me suena.... parece un "Deja Vu"

Así es, solo falta la respuesta :p

ArdiIIa 12-08-2007 16:44:25

Ya la sabes, y parece que al interesado, no le interesa...:D

cHackAll 12-08-2007 17:39:46

Cita:

Empezado por ArdiIIa
Ya la sabes, y parece que al interesado, no le interesa...:D

Vaya, será que se asustó con mi nick???

eldiegofg 13-08-2007 02:42:22

Hola muchachos, como estan?? Perdon por la demora, no me asuste ni nada de eso:D:D. Es que no tengo conexion a Internet en mi casa y puedo entrar cuando voy a algun cybercafe. Ya consegui una solucion alternativa a mi problema, igual ahora veo que hay otro metodo que publicaron para solucionar este inconveniente. Lo voy a probar. Agradezco mucho su ayuda y espero que puedan seguir colaborando con gente nueva como yo y teniendo tanta paciencia :D. Saludos y muchas gracias


La franja horaria es GMT +2. Ahora son las 06:20:54.

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