Ir al contenido


Foto

¿Alguna forma de asignar rangos de coordenadas?


  • Por favor identifícate para responder
14 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 octubre 2009 - 06:08

Pues eso amigos, ¿hay alguna forma de comparar o asignar un rango de coordenadas?, por ejemplo, quiero hacer algo si está ubicado entre las coordenadas 600,200 y 600,300 haga alguna acción como cambiar el tipo de puntero, no sé si me hice entender :$.

Saludos.
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 octubre 2009 - 07:21

He escrito esta pequeña función que resuelve el asunto:



delphi
  1. function EstaEnRango(Num, R1, R2: Integer): boolean;
  2. var
  3.   Mayor, Menor: Integer;
  4. begin
  5.   Result := False;
  6.   if R1 > R2 then
  7.   begin
  8.     Mayor := R1;
  9.     Menor := R2;
  10.   end
  11.   else
  12.   begin
  13.     Mayor := R2;
  14.     Menor := R1;
  15.   end;
  16.   Result := (Num >= Menor) and (Num <= Mayor)
  17. end;
  18.  
  19. procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState;
  20.   X, Y: Integer);
  21. begin
  22. if (EstaEnRango(x,10,100)) and (EstaEnRango(y,20,100)) then
  23.     showmessage('si')
  24. end;


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 octubre 2009 - 07:41

Gracias Wilson, fíjate que no me está funcionando :(

[Hint] Unit1.pas(38): Value assigned to 'TForm1.EstaEnRango' never used




delphi
  1. procedure TForm1.JvImage1MouseMove(Sender: TObject; Shift: TShiftState; X,
  2.   Y: Integer);
  3. var Pos: TPoint;
  4. begin
  5. if (EstaEnRango(x,674,285)) and (EstaEnRango(y,682,285)) then
  6.     JvImage1.Cursor := crHandPoint;
  7. end;


  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 octubre 2009 - 08:03

Si funciona mira:


delphi
  1. function EstaEnRango(Num, R1, R2: Integer): boolean;
  2. var
  3.   Mayor, Menor: Integer;
  4. begin
  5.   Result := False;
  6.   if R1 > R2 then
  7.   begin
  8.     Mayor := R1;
  9.     Menor := R2;
  10.   end
  11.   else
  12.   begin
  13.     Mayor := R2;
  14.     Menor := R1;
  15.   end;
  16.   Result := (Num >= Menor) and (Num <= Mayor)
  17. end;
  18.  
  19. procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  20.   Y: Integer);
  21. begin
  22.   if (EstaEnRango(x,10,20))//coloca aqui el rango de x
  23. and (EstaEnRango(y,10,20)) then//coloca aqui el rango de y
  24.     Image1.Cursor:= crHandPoint
  25.     else
  26.     Image1.Cursor:= crDefault
  27. end;


  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 octubre 2009 - 08:08

En tu ejemplo seria mas o menos asi



delphi
  1. procedure TForm1.JvImage1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
  2. begin
  3. if (EstaEnRango(x,674,682)) //aqui coordenadas de x, observa que las intercambié
  4. and (EstaEnRango(y,285,285))// aqui las de y
  5. then    JvImage1.Cursor := crHandPoint
  6. else
  7. JvImage1.Cursor := crDefault;
  8. end;



  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 octubre 2009 - 08:09

Por lo que veo sólo vale en un sólo punto o una línea entre dos coordenadas, creo que no me expliqué bien, el asunto es más bien entre 4 coordenadas, vamos a suponer que tengo estas 4 coordenadas:

600,300 | 700,300

600,600 | 700,600

Me imagino que eso forma un cuadro, ahora, lo que quiero es que si el puntero del mouse se mueve dentro de ese cuadro, o sea, entre esas 4 coordenadas cambie el puntero o cualquier acción que yo quiera. Creo que ahora me expliqué mejor :$

Saludos.
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 22 octubre 2009 - 08:12

En tu ejemplo seria mas o menos asi



delphi
  1. procedure TForm1.JvImage1MouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);
  2. begin
  3. if (EstaEnRango(x,674,682)) //aqui coordenadas de x, observa que las intercambié
  4. and (EstaEnRango(y,285,285))// aqui las de y
  5. then    JvImage1.Cursor := crHandPoint
  6. else
  7. JvImage1.Cursor := crDefault;
  8. end;




Aún no me furula, siempre me muestra:

[Hint] Unit1.pas(38): Value assigned to 'TForm1.EstaEnRango' never used


  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 octubre 2009 - 08:15

Status: arreglando,  dame 5 minutos.
mientras tanto  (b) (b) (b) (b)
  • 0

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 octubre 2009 - 08:42

Listo,  en este ejemplo tus cuatro coordenadas son 0-0 , 0-10 , 0-0 , 0,200



delphi
  1. function EstaEnRango(Num, R1, R2: Integer): boolean;
  2. var
  3.   Mayor, Menor: Integer;
  4. begin
  5.   Result := False;
  6.   if R1 > R2 then
  7.   begin
  8.     Mayor := R1;
  9.     Menor := R2;
  10.   end
  11.   else
  12.   begin
  13.     Mayor := R2;
  14.     Menor := R1;
  15.   end;
  16.   Result := (Num >= Menor) and (Num <= Mayor)
  17. end;
  18.  
  19. function EstaEnRectangulo(P: TPoint; ARec: TRect): boolean;
  20. begin
  21.   Result := False;
  22.   Result := (EstaEnRango(P.Y, ARec.Top, ARec.Bottom)) and
  23.     (EstaEnRango(P.X, ARec.Left, ARec.Right))
  24. end;
  25.  
  26. procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  27.   X, Y: Integer);
  28. var
  29.   R: TRect;
  30.   P: TPoint;
  31. begin
  32.   P.X := X;
  33.   P.Y := Y;
  34.   R.Left := 0;
  35.   R.Top := 0;
  36.   R.Right := 10;
  37.   R.Bottom := 200;
  38.   if EstaEnRectangulo(P, R) then
  39.     Image1.Cursor := crHandPoint
  40.   else
  41.     Image1.Cursor := crDefault
  42. end;




  • 0

#10 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 22 octubre 2009 - 09:04

Esta es mucho mas clara usando la función de Delphi  PtInRect que está en la Unit types



delphi
  1. uses
  2.  
  3. Types;//....
  4.  
  5.  
  6. procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  7.   X, Y: Integer);
  8. var
  9.   R: TRect;
  10.   P: TPoint;
  11. begin
  12.   P.X := X;
  13.   P.Y := Y;
  14.   R.TopLeft.X :=20;
  15.   R.TopLeft.Y := 30;
  16.   R.BottomRight.X := 40;
  17.   R.BottomRight.Y := 50;
  18.   if  PtInRect(R, P) then
  19.     Image1.Cursor := crHandPoint
  20.   else
  21.     Image1.Cursor := crDefault
  22. end;


  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 22 octubre 2009 - 10:20

Que buen code amigo Wilson, funciona perfecto (y)

Salud OS
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 octubre 2009 - 07:59

Gracias Wilson, así funciona mejor, ¿me podrías explicar el TopRight, TopLeft, BottomRight y BottomLeft, porque hago el cáculo y no me entra :p :p :$.

Saludos.
  • 0

#13 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 octubre 2009 - 08:24

Gracias Wilson, así funciona mejor, ¿me podrías explicar el TopRight, TopLeft, BottomRight y BottomLeft, porque hago el cáculo y no me entra :p :p :$.

Saludos.



TopRight y BottomLeft no existen.

La manera más fácil de definir un rectángulo es dando las coordenadas de dos de sus vértices (opuestos) que se encuentren en diagonal.

Las otras dos esquinas quedan implícitamente definidas, no se podrían definir de manera arbitraria porque entonces se corre el riesgo de que no sea un rectángulo si nó cualquier otra cosa.

TopLeft.x con TopLeft.y = Coordenada de la esquina superior izquierda de tu rectángulo.
BottomRight.x con BottomRight.y = Coordenada de la esquina inferior derecha de tu rectángulo.
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 25 octubre 2009 - 12:31

Hola, estoy teniendo problemas para hacer varios a la vez en diferentes puntos de una imágen, :(, tengo lo siguiente:



delphi
  1. procedure MediaButtons(x,y: Integer; Imagen: TJvImage);
  2. var Pv, Pn: TPoint;
  3.     Prev,Next,Pause,Stop,Play: TRect;
  4. begin
  5.   //botón previo
  6.   Pv.X := x;
  7.   Pv.Y := y;
  8.   Prev.TopLeft.X := 446;
  9.   Prev.TopLeft.Y := 100;
  10.   Prev.BottomRight.X := 462;
  11.   Prev.BottomRight.Y := 122;
  12.  
  13.   //Botón siguiente
  14.   Pn.X := x;
  15.   Pn.Y := y;
  16.   Next.TopLeft.X := 547;
  17.   Next.TopLeft.Y := 100;
  18.   Next.BottomRight.X := 560;
  19.   Next.BottomRight.Y := 122;
  20.  
  21.   if  PtInRect(Prev, Pv) then begin
  22.     Imagen.Cursor := crHandPoint;
  23.     Imagen.Hint := 'anterior';
  24.     Imagen.ShowHint := True;
  25.   end else begin
  26.     Imagen.Cursor := crDefault;
  27.     Imagen.ShowHint := False;
  28.   end;
  29.  
  30.   if  PtInRect(Next, Pn) then begin
  31.     Imagen.Cursor := crHandPoint;
  32.     Imagen.Hint := 'Siguiente';
  33.     Imagen.ShowHint := True;
  34.   end else begin
  35.     Imagen.Cursor := crDefault;
  36.     Imagen.ShowHint := False;
  37.   end;
  38. end;



Quise hacerlo en un sólo procedimiento (Mi mente no está generando), pues bien, el problema es el siguiente, en vez de funcionar ambos rectangulos a la vez en distintos puntos sólo funciona el último, ¿cómo podría hacer que funcione varios a la vez?.

Saludos.

  • 0

#15 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 25 octubre 2009 - 02:02

Ensaya con esto así:



delphi
  1.   if  PtInRect(Prev, Pv) then
  2. begin 
  3. Imagen.Cursor := crHandPoint; 
  4. Imagen.Hint := 'anterior';   
  5. Imagen.ShowHint := True; 
  6. end
  7. else
  8. if  PtInRect(Next, Pn) then
  9. begin 
  10. Imagen.Cursor := crHandPoint; 
  11. Imagen.Hint := 'Siguiente';   
  12. Imagen.ShowHint := True; 
  13. end
  14. else
  15. begin 
  16. Imagen.Cursor := crDefault; 
  17. Imagen.ShowHint := False; 
  18. end;



  • 0




IP.Board spam blocked by CleanTalk.