Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-02-2004
cone220 cone220 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 53
Poder: 22
cone220 Va por buen camino
Posición del mouse en la pantalla

Cómo puedo obtener la posición del mouse en la pantalla en el momento en que hago un doble click???

Saludos

Federico
Responder Con Cita
  #2  
Antiguo 12-02-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
A lo mejor te puede servir el truco 92 de Trucomanía: "Detectar la posición del ratón en tu form en una zona no cliente".

Ir a trucomanía
Ir al truco

Confío en mis compañeros foreros que me corrijan si me equivoco
__________________
:)
Responder Con Cita
  #3  
Antiguo 12-02-2004
cone220 cone220 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 53
Poder: 22
cone220 Va por buen camino
No aclaré bien mi problema. Lo que necesito es detectar en que posición "dentro de mi ventana de aplicación Delphi" se hizo un doble clik. El código que me indicaste es válido, pero no hay una manera mas sencilla de tomar la ubicación?
Responder Con Cita
  #4  
Antiguo 12-02-2004
Avatar de DarkByte
DarkByte DarkByte is offline
Miembro
 
Registrado: sep 2003
Ubicación: Desconocido
Posts: 1.322
Poder: 22
DarkByte Va por buen camino
Ya suponía que no era en tu aplicación. No he examinado el código a fondo, pero creí que te sería útil. Sobre si hay alguna manera más sencilla, yo no puedo ayudarte en eso. Yo no se mucho sobre programación, soy el más principiante dentro de los principiantes, no se si me explico
__________________
:)
Responder Con Cita
  #5  
Antiguo 12-02-2004
Descendents Descendents is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 396
Poder: 21
Descendents Va por buen camino
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
s:tpoint;
begin
s := Mouse.CursorPos;
Label1.caption := ('X:'+INTTOSTR(S.X)+' Y:'+INTTOSTR(S.Y));
end;

Haber si te sirve
Saludos
__________________
La victoria tiene cien padres. La derrota es huérfana (Napoleón).
Responder Con Cita
  #6  
Antiguo 12-02-2004
Descendents Descendents is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona
Posts: 396
Poder: 21
Descendents Va por buen camino
Una cosa que me deje de decirte, por supesto este código lo pones dentro del evento que quieras.Yo lo puse en el onmousemove del form, pero lo pones en el doble click de un boton o de donde quieras.

Más Saludos
__________________
La victoria tiene cien padres. La derrota es huérfana (Napoleón).
Responder Con Cita
  #7  
Antiguo 12-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Aunque en realidad no hace falta en MouseMMove ya que este evento incluye las coordenadas.

Para complementar lo dicho por Descendents apunto que Mouse.CursorPos da las coordenadas respecto de la pantalla y no del formulario. Si se desean las coordenadas relativas al formulario puede usarse ScreenToClient para convertirlas.

// Saludos
Responder Con Cita
  #8  
Antiguo 30-06-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Hola Roman:

Me podrías ayudar un poco a utilizar ésta función (ScreenToClient) .

Gracias.
Aarón.
Responder Con Cita
  #9  
Antiguo 30-06-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Como yo llego primero, pues yo mismo


ScreenToClient y su homologo ClientToScreen vienen con cualquier objeto derivado de la clase Tcontrol, por tanto lo podemos usar en formularios y otros especimenes .

Descripción: ScreenToClient Segun una coordenada pasada por parametro, la interpreta como que pertenece a la pantalla, y te devuelve la coordenada según el control que se llame, Ejemplo:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var PuntoCliente, Punto:TPoint;
begin
 Punto.X := 100;
 Punto.Y := 40;
 PuntoCliente :=  Form1.ScreenToClient(Punto);
  Memo1.Lines.Add(' y '+IntToStr(PuntoCliente.Y)+ ' x '+ IntToStr(puntocliente.X));
 Button1.Top:= PuntoCliente.Y;
 Button1.left:= PuntoCliente.x;

end;
Punto está en coordenadas de la pantalla.
PuntoCliente es esa misma coordenada pero dentro del Formulario Form1.

Aclaraciones:

La pantalla empieza en 0,0 en la esquina superior izquierda.
Un Form, tiene la coordenada 0,0 igualmente en su esquina superior izquierda.

Si la ventana no tiene bordes, ni titulo, y está maximizada, las coordenadas Punto y PuntoCliente coinciden.

Dicho en plan "Lepero" : Coge un rotulador y pinta en tu Monitor un punto, digamos el 100,40 (100 pixels a la derecha, 40 pixels hacia abajo de la pantalla), Ahora PuntoCliente, te dice ese punto rotulado, qué coordenada es esa, respecto a Form1. OJO, puede dar coordenadas negativas, recuerda que el origen ahora, es la esquina superior izquierda de Form1 !!!

Ejecutas el programa:
Maximizas el programa y pulsas sobre el boton, El boton se mueve a las nuevas coordenas.

Si la ventana Form1 no está maximizada, el boton desaparece, ya que toma coordenadas negativas.

ClientToScreen:
Código Delphi [-]
procedure TForm1.Button7Click(Sender: TObject);
var PuntoCliente, Punto:TPoint;
begin
 PuntoCliente.X := 100;
 PuntoCliente.Y := 40;
 Punto :=  Form1.ClienttoScreen(PuntoCliente);
 Memo1.Lines.Add(' y '+IntToStr(Punto.Y)+ ' x '+IntToStr(punto.X));

end;
En este caso, depende de donde tengas la ventana, para que ese punto se traduzca a coordenadas de la pantalla.

Un saludo y espero se entienda.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 01-07-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Hola Lepe:

Gracias, lo explicaste bastante claro.

He implementado algo así:

Código Delphi [-]
 
procedure TFrmArchivos.btnAgregarClick(Sender: TObject);
var
Boton_Cory,Boton_Corx : Integer;
P ,Cord_Pantalla : TPoint;
begin
   //MnuBtnAgregar.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
   Boton_Cory := btnAgregar.Top + 17;
   Boton_Corx := btnAgregar.Left;
   Cord_Pantalla.X := Boton_Corx;
   Cord_Pantalla.Y := Boton_Cory;
   P := Self.ClientToScreen(Cord_Pantalla);
   MnuBtnAgregar.Popup(P.X ,P.Y);
end;
Pero de ésta manera me queda bajo el botón, la idea que quiero es que me quede justo sobre el botón .

Saludos y gracias nuevamente.

Aarón.
Responder Con Cita
  #11  
Antiguo 01-07-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
¿Por qué le sumas 17 ?

Supongo que estabas haciendo pruebas y al final se ha quedado ahí

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #12  
Antiguo 01-07-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Hola:

Claro, estaba haciendo algunas pruebas y sumandole 17 logré que se posicioné justo debajo del botón, pero mi idea es todo lo contrario, me gustaría que se posicione justo sobre el botón y no por debajo de éste...

Saludos.
Responder Con Cita
  #13  
Antiguo 01-07-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Sobre el botón.... es decir, arriba del botón !! jeje, yo contaba que quedara la esquina izquierda del menú, justo con la esquina izquierda del botón, por eso no te entendía.

El menú no tiene opción de Height, por tanto, tendrás que contar cuantos elementos tienes en el menú, despues multiplicarlo por una constante, y así saber cuanto le tienes que restar a Boton_Cory.

Es tarea compleja, ya que el usuario puede tener activa las "fuentes grandes" de windows, y por tanto esa constante tiene 2 posibles valores.

En este mensaje tienes más o menos el alto de un menú.

Para saber si tiene las fuentes grandes, busca por el foro, creo que se ha tratado.... más bien me extrañaría que no se hubiese tratado .

Un saludo.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #14  
Antiguo 01-07-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Lepe
Es tarea compleja
Ya lo creo, pero hay una forma más fácil:


Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
const
  Flags = TPM_LEFTALIGN or TPM_BOTTOMALIGN or TPM_LEFTBUTTON;

var
  Pt: TPoint;

begin
  Pt := Point(Button2.Left, Button2.Top);
  Pt := ClientToScreen(Pt);

  TrackPopupMenu(PopupMenu1.Handle, Flags, Pt.X, Pt.Y, 0, PopupList.Window, nil);
end;

// Saludos
Responder Con Cita
  #15  
Antiguo 01-07-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Hola Foristas:


Logré lo que quería:

Código Delphi [-]
 
 
procedure TFrmArchivos.btnAgregarClick(Sender: TObject);
var
Boton_Cory,Boton_Corx : Integer;
P ,Cord_Pantalla : TPoint;
begin
   //MnuBtnAgregar.Popup(Mouse.CursorPos.X,Mouse.CursorPos.Y);
   Boton_Cory := btnAgregar.Top; // + 17
   Boton_Corx := btnAgregar.Left;
   Cord_Pantalla.X := Boton_Corx;
   Cord_Pantalla.Y := Boton_Cory;
   P := Self.ClientToScreen(Cord_Pantalla);
   MnuBtnAgregar.Popup(P.X ,P.Y + - 48); // y = Vertical
end;

a la coordenada Y le reste - 48 y quedo justito como quería, gracias por las nuevas idea expuestas.
Saludos.
Aaron.
Responder Con Cita
  #16  
Antiguo 02-07-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Roman, nunca dejarás de sorprenderme

Como siempre, haciendo facil lo dificil.

Un saludo
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #17  
Antiguo 03-07-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Lepe
Como siempre, haciendo facil lo dificil.
Más bien Delphi haciendo difícil lo fácil. Como sabrás, Delphi sí maneja el alineamiento horizontal mas se han olvidado de añadir el manejo del alineamiento vertical.

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:00:10.


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