PDA

Ver la Versión Completa : Consulta


eldiegofg
08-08-2007, 18:06:57
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.

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
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
...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.

... ¿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
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
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....


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 (http://www.clubdelphi.com/trucos/index.php?id=431) truco.

Saludos!

ArdiIIa
12-08-2007, 11:17:22
Esto me suena.... parece un "Deja Vu"

cHackAll
12-08-2007, 16:35:44
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
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