Współrzędne kliknięcia myszki

0

Mam problem, a mianowicie tworzę projekt na zaliczenie jest to gra pseudo zręcznościowa - kliknąć w kwadrat który losowo się pojawia. Potrzebuję teraz instrukcji która zapisze współrzędne kliknięcia myszy.

case klik of
    mbLeft:
      begin
        p:=Mouse.CursorPos;
        Label1.Caption:= 'X = '+IntToStr(p.x)+', Y = '+IntToStr(p.y);

ale to jakoś nie zaskoczyło.

1

PO 1: pytania o banalne podstawy zadajemy w dziale Newbie. Przenoszę.
PO 2: trzeba myśleć co się robi. I precyzyjnie pisać na co klikasz. Nie wiemy czym dokładnie jest ten "kwadrat".
PO 3: jeżeli klikasz na formatkę, a pobierasz współrzędne kursora na całym ekranie, należy go przekonwertować tak:

procedure TForm1.FormClick(Sender : TObject);
var
  P : TPoint;
begin
  P := Mouse.CursorPos;
  P := ScreenToClient(P);
  Caption := Format('X: %d Y: %d', [P.X, P.Y]);
end;

PO 4: dla wielu kontrolek istnieje zdarzenie OnMouseDown, które pozwala określać również coordynaty X oraz Y wykonanego kliknięcia.

0

Kwadrat, grafika o boku równym powiedzmy 20pixeli, losuje jego współrzędne x y początkowe, następnie jeśli posiadałbym współrzędne x,y kliknięcia mógłbym zweryfikować czy znajdują się w przedziale (x;x+20) i (y;y+20) chyba dobrze kombinuję. Dzięki za podpowiedź i pokombinuję z onMouseDown.

0

Tutaj tak jak napisał @olesio kluczem jest metoda ScreenToClient, która tłumaczy współrzędne kursora na ekranie na współrzędne kursora na formularzu; Dodaj tę funkcję do swojego kodu i wszystko będzie już dobrze;

A same współrzędne pobieraj raczej w zdarzeniu OnClick lub OnMouseUp, dlatego że wciśnięcie lewego klawisza myszy to jeszcze nie jest kliknięcie; Pełne kliknięcie to wciśnięcie i puszczenie np. LPM, czyli wykonanie kolejno zdarzeń OnMouseDown, OnClick i na koniec OnMouseUp; Tyle że w Twoim przypadku wystarczy jedno zdarzenie z dwóch ostatnich.

0
unit Kwadrat;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  p:tpoint;
  i,j,n,x:integer;

implementation

{$R *.DFM}

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
n:=0;
x:=0;
repeat

P := Mouse.CursorPos;
P := ScreenToClient(P);
randomize;
i:=random(100);
j:=random(100);
Canvas.Rectangle(i, j, (i+50), (j+50));
Canvas.Brush.Color := clBlue;
n:=n+1;

case Button of
    mbLeft:
    begin
     if ((p.x)>i)and((p.x)<(i+50))and((p.y)>j)and ((p.Y)<(j+50)) then x:=x+1;
    end
end;
     label1.caption:=(inttostr (x));
     sleep(500);
     refresh;
     until(n=50);

end;

end. 

Napisałem takie coś , jednak to nie zlicza kliknięć, a jedynie czy kursor znajduje się nad kwadratem w trakcie jego emitowania. Może jakieś podpowiedzi ?

0

Najpierw to może napisz czym jest ten kwadrat - sam go rysujesz na formularzu, czy to jakiś komponent?

Poza tym zainteresuj się procedurą Inc do inkrementowania wartości liczbowej, a także metodą PtInRect do sprawdzania czy dany punkt znajduje się wewnątrz zadanego prostokąta (typu TRect);

I na koniec - popraw identyfikatory zmiennych, bo jednoliterowe kompletnie nic nie mówią o ich przeznaczeniu;
____A skoro już tu jestem, to może polecę nieco inny sposób na implementację tej gry;

Korzystasz z programowania obiektowego i aplikacji okienkowej, więc zrób ten kwadrat jako komponent, np. klasy TPaintBox; W zdarzeniu OnPaint tego komponentu rysuj go jak chcesz; Następnie w zdarzeniu OnMouseUp także tego komponentu inkrementuj licznik kliknięć i aktualizuj etykietę z bieżącym wynikiem;

Teraz aby gra jakoś działała, to jeśli czas minie - ukryj komponent, przesuń go w inne miejsce i pokaż, albo od razu przesuwaj w nowe miejsce, jeśli pomiędzy jednym pokazaniem a drugim ma nie być żadnej przerwy; No i nie korzystaj z instrukcji Sleep, bo zamrażasz główny wątek programu - skorzystaj z komponentu TTimer, ustaw mu interwał i uzupełnij odpowiednio zdarzenie OnTimer.

1 użytkowników online, w tym zalogowanych: 0, gości: 1