Noktaya Göre Fare Hareketleri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Noktaya Göre Fare Hareketleri

Mesaj gönderen qamyoncu »

Merhabalar,

Çizim Programı tarzı birşey üzerinde çalışıyorum. Formumda bazı noktalar var. Fare bu noktalara 5px'den daha yakınsa GetCursorPos ile fareyi o noktaya götürüyorum. Kısacası bi çeşit mıknatıs özelliği var noktalarda.

Sorunum şurda ki; Fareyi bu noktadan kurtarmak için hızlı hareket ettirmem gerekiyor. Yani fareyi yavaş bir şekilde yana kaydırsam, farenin yeri değişmiyor çünkü hep o 5px'lik alanda kalıyor. Farenin kordinatlarını değilde, farenin hareketinin algılamamıza yaran bi yöntem bilen var mı acaba? Veya sorunumu çözmeye yardım edecek bir yol bilen? Teşekkür ediyorum.
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Noktaya Göre Fare Hareketleri

Mesaj gönderen Lost Soul »

güzel bi soru :)


şöyle olabilir.
mıknatıslı noktanın
mesela her soluna ilerlemeye çalışmasında atıyorum soldeneme diye bir değişkeni bir arttırsın peşpeşe 5 kez sola gitmeye çalıştığında setcursorpos ile noktanın 5-6 soluna taşırsın. böylece kullanıcı tarafından farkedilmeyecek bir iekilde noktadan kurtarmış olursun.
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: Noktaya Göre Fare Hareketleri

Mesaj gönderen qamyoncu »

Dediğinizi yapamadım maalesef. Örnek kod mevcut mu acaba?
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Noktaya Göre Fare Hareketleri

Mesaj gönderen ikra »

fikir olsun diye söylüyorum.

fare noktaya yanasiyor mu, yoksa uzaklasiyor mu, bunu tespit ederek miknatis özelligini true veyahut false yapabilirsin.
yaklasiyorsa true olur ve 5px'e geldiginde cekim alanina girmis olur, hemen akabinde noktaya odaklanir.
uzaklasiyor ise, ki bu, varPos, CurPos ile saptanabilir (belki), o halde miknatis özelligi false olur ve cekim gerceklesmez.

kolay gelsin...
kıdemsiz üye
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Noktaya Göre Fare Hareketleri

Mesaj gönderen Lost Soul »

qamyoncu yazdı:Dediğinizi yapamadım maalesef. Örnek kod mevcut mu acaba?
Beyin Jimnastiği olması açısından şöyle bir kod yazdım.
Hem mıknatıs özelliği hem de yavaş hareket olsa dahi alandan kurtulabilme özelliği içinde buyrun afiyet olsun.

Kod: Tümünü seç

unit fmain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls,math;

Type
  TMagnet = Record
    MPoint: TPoint;
    Movements : Trect;
  End;
  
type

  TForm1 = class(TForm)
    xAlan: TImage;
    procedure FormCreate(Sender: TObject);
    procedure xAlanMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
    MagnetPoints : array of TPoint;
    CMagnet : TMagnet;
    Procedure ResetCM;
  public
    { Public declarations }
  end;
const
  MAGNET_DIM = 10;
var
  Form1: TForm1;
  Function Icinde(x, y, x1, y1, x2, y2: integer): Boolean;OverLoad;
  Function Icinde(x,y:Integer; aRect : Trect):Boolean;OverLoad;

implementation

{$R *.dfm}

// Some Functions
Function Icinde(x, y, x1, y1, x2, y2: integer): Boolean;
Begin
  Result := ((x >= min(x1, x2)) and (x <= max(x1, x2)) and (y >= min(y1, y2))
      and (y <= max(y1, y2)));

End;

Function Icinde(x,y:Integer; aRect : Trect):Boolean;
Begin
  Result:=Icinde(x,y,aRect.Left,aRect.Top,Arect.Right,aRect.Bottom);
End;

Procedure TForm1.ResetCM;
begin
  with CMagnet do
  Begin
    MPoint  := Point(-1,-1);
    Movements := Rect(0,0,0,0);
  End;
end;
// EOF Some Functions

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLEngth(MagnetPoints,10);
  MagnetPoints[0] := Point(33,33);
  MagnetPoints[1] := Point(99,99);
  MagnetPoints[2] := Point(99,33);
  MagnetPoints[3] := Point(33,99);
  MagnetPoints[4] := Point(77,89);
  MagnetPoints[5] := Point(177,189);
  MagnetPoints[6] := Point(77,289);
  MagnetPoints[7] := Point(377,89);
  MagnetPoints[8] := Point(477,89);
  MagnetPoints[9] := Point(77,589);


  with xAlan do
  Begin
    Canvas.RectAngle(0,0,xAlan.Width,xAlan.Height);
    Canvas.Polyline(MagnetPoints);
  End;
end;

procedure TForm1.xAlanMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  i : Integer;
  aPoint : TPoint;
begin
  for i := Low(MagnetPoints) to High(MagnetPoints) do
  if Icinde (
            x,y,
            MagnetPoints[i].X-MAGNET_DIM,MagnetPoints[i].Y-MAGNET_DIM,
            MagnetPoints[i].X+MAGNET_DIM,MagnetPoints[i].Y+MAGNET_DIM
            )
  then
  Begin
    CMagnet.MPoint :=MagnetPoints[i];
    if (CMagnet.MPoint.X=-1) or (CMagnet.MPoint.Y=-1) then
    Begin
      ResetCM;
      CMagnet.MPoint :=MagnetPoints[i];
    End
    else
    Begin
      if x<CMagnet.MPoint.X then inc(CMagnet.Movements.Left);
      if Y<CMagnet.MPoint.Y then inc(CMagnet.Movements.Top);
      if x>CMagnet.MPoint.X then inc(CMagnet.Movements.Right);
      if Y>CMagnet.MPoint.Y then inc(CMagnet.Movements.Bottom);
    End;

    if
      (CMagnet.Movements.Left>MAGNET_DIM) or
      (CMagnet.Movements.Right>MAGNET_DIM) or
      (CMagnet.Movements.Top>MAGNET_DIM) or
      (CMagnet.Movements.Bottom>MAGNET_DIM) then
    Begin
      aPoint:=xAlan.ClientToScreen(Point(MagnetPoints[i].X,MagnetPoints[i].Y));
      if (CMagnet.Movements.Left>MAGNET_DIM) then   Dec(aPoint.X,Succ(CMagnet.Movements.Left))
      else
      if (CMagnet.Movements.Right>MAGNET_DIM) then  Inc(aPoint.X,Succ(CMagnet.Movements.Right));
      if (CMagnet.Movements.Top>MAGNET_DIM) then    Dec(aPoint.Y,Succ(CMagnet.Movements.Top))
      else
      if (CMagnet.Movements.Bottom>MAGNET_DIM) then Inc(aPoint.Y,Succ(CMagnet.Movements.Bottom));
      setCursorPos(aPoint.X,aPoint.Y);
      ResetCM;
    End
    else
    Begin
      aPoint:=xAlan.ClientToScreen(Point(MagnetPoints[i].X,MagnetPoints[i].Y));
      SetCursorPos(aPoint.X,aPoint.Y);
    End;


    Break;
  End;


  
end;

end.
Dosya ekleri
Magnet.rar
(7.64 KiB) 77 kere indirildi
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

Re: Noktaya Göre Fare Hareketleri

Mesaj gönderen qamyoncu »

Teşekkür ediyorum @Lost Soul. Şuan delphi yüklü değil inceleyemiyorum ama bir sorun yok gibi. Sağ olun :)

@ikra;

Dediğiniz de güzel bir yöntem gibi fakat yeterince duyarlı olmuyor sanırım öyle. Çünkü fareyi soldan sağa çekerken fare noktamızın çekim alanına girdiğinde direk o noktaya gidecek. Fakat eğer kullanıcı fareyi sağa götürme işlemini devam ettirirse fare bizim istediğimiz noktadan çıkacak çünkü mıknatıs özelliği false olacak.
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
Cevapla