Anulowanie kliknięcie przez przeciągnięcie

0

Mam jeszcze jedno pytanie.

Mam tablice SpeedButtonów i tworzę je dynamicznie na formie. Mają one wymiary 20 na 20. I układam sobie co dwadzieścia począwszy od top=0 i left=0 i sobie w pętli daję np 5 rzędów po 5 kolumn.

Podpiąłem pod onMoUseup procedurke która coś tam robi(np wyświetla który buton nacisnąłem) przy czym tylko i wyłącznie to sie robi, gdy po przytrzymaniu klawisza nie przesunę kursora na inny przycisk. Mam nadzieje że wiecie o co mi chodzi. Jak sie naciśnie butona i nagle sie ktoś rozmyśli to wystarczy przytrzymać klawisz myszki i "ściągnąć" kursor w inne miejsce. No i ok. Zrobiłem to. Robię to w następujący sposób:(mniej więcej):

określam granicę lewą, prawą, górną i dolną dla butona. Czyli top(left) i ew +20
czyli dla przycisku 1,2 (licząc od zera) mam granice: x1=20,x2=39, y1=40, y2=59
No i ok. Ciągle wszystko w porządku. Liczy dobrze.
Teraz liczę rzeczywiste współrzędne dla miejsca, w którym puściłem klawisz myszki. Ponieważ położenie mouse.cursorpos. Zwraca on położenie myszki w współrzędnych ekranowych. Innymi słowy punkt(0,0) jest w lewym górnym rogu EKRANY a nie formy. Wiec odejmuję od tej wartości wysokość i szerokość formy.
No i jest ciągle ok. Teraz pozostaje odjąć wysokość belki formy. Liczę to w następujący sposób: forma.wysokość-forma.wysokość clienta. No i tutaj zaczyna sie problem. Wyszła mi belka =25. Jednak jak sobie kliknę w narożniku formy to wychodzi ujemny Y. niewiele np -3, ale ujemny. Zaznaczam że obramowanie jest ustawione na 0 itd. Również współrzędna X jest trochę przekłamana. Jak klikam w pobliżu PRAWEJ krawędzi butona, którego położenie może być maxymalnie 20 - tak jest ustawione, pokazuje np 22. Przypuszczam że chodzi o ten minimalny jakby cień formy, ale nie umiem tego policzyć.

Wie ktoś jak to zrobić dokładnie? Mianowicie żeby punkt (0,0) był zbieżny z rogiem butona o położeniu left i top=0?

0
Leo_Johnson napisał(a)

Innymi słowy punkt(0,0) jest w lewym górnym rogu EKRANY a nie formy. Wiec odejmuję od tej wartości wysokość i szerokość formy.

A nie powinieneś odjąć położenia formy? tzn właściwoście Left i Top?

0

a co ty kombinujesz ? zamiast w onmouseup daj w onclick i już będą mogli się ludzie rozmyślać ... chyba że to było odrębne pytanie albo nie wiem :0

0

Ale ja musze mieć rozróżnienie prawy/lewy klawisz. A onClick nie ma takiego rozróżnienia. Co inngo ma sie robić prawym a co innego lewym. I przy tym ma sie dać "rozmyślać"

0

onclick jest na lewy - w upie możesz wykrywać tylko prawy i nie robić burdelu - nie widziałem jeszcze w żadnym programie żeby na buttonie się robiło coś prawym a jak już to właśnie że jak się wyciśnie nawet poza buttonem to właśnie się rozwija menu kontekstowe - czyli normalnie bez żadnego wykrywania

0

mówiąc krótko chcę żęby działo jak w grze saper z windowsa. Prawy zaznacza, lewy "staje" na polu minowym a przy tym można sie "rozmyśleć"

0
Leo_Johnson napisał(a)

Innymi słowy punkt(0,0) jest w lewym górnym rogu EKRANY a nie formy. Wiec odejmuję od tej wartości wysokość i szerokość formy.

A nie powinieneś odjąć od położenia kursora (względem ekranu) położenia formy? tzn właściwości Left i Top?

0

Oczywiscie. Tak zrobiłem tylko pomyliłem sie w opisywaniu.
Znalazłem już rozwiązanie:

function Tmainform.FindControlAtPos: TWinControl;
var
  Pt: TPoint;
begin
  GetCursorPos(Pt);
  Result := FindControl(WindowFromPoint(Pt));
end;

i potem w onMouseUp:

  var ob:TWinControl;

  ob:=FindControlAtPos;
  if ob.Name=self.Name then ;//upuściłeś na tym samym przycisku else na innym. 

Jednak działa to tylko dla Typu TWinControl i pochodnych. Nie działa np dla SpeedButonów, których używam. Gdy upuści sie z np TButtona na TSpeedButton to zwraca formatke. No ale cóż. I tak jest to o wiele lepsze rozwiazanie niż liczenie na piechotę. Momo wszystko może ktos wie, jak policzyć EKRANOWĄ współrzędną narożnika jakiegoś komponentu?

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