Warsztat 3: Drag & Drop na formularzu. Pływające kontrolki

knddrop2.zip
Autor: Krzysztof Naworyta
Baza w formacie MsAccess 2000
63kB, 19-12-2006

Zadanie:

Jak na formularzu zmieniać myszką rozmiary kontrolek, jak je przesuwać w dowolne położenie?
Oczywiście nie w widoku "projekt", lecz w widoku normalnym.

Czy to komukolwiek do szczęścia potrzebne ?

E... jasne, że niewiele takie coś ma wspólnego z bazami danych  
Ale czy access ogranicza nas tylko do tabel i kwerend ?
A nawet jeśli, to czy przykładowo wpis do tabeli rozkładu zajęć nie lepiej czasem zrobić myszką na grafiku, zamiast wpisywania "zimnych" liczb ?

Zresztą, w budowie przyjaznego dla użytkownika interfejsu, ograniczeni jesteśmy tylko własną inwencją.
Dodatkowe efekty wizualne - jeśli tylko nie zaczynają brać góry nad funkcjonalnością - jedynie wzbogacają wartość użytkową naszych aplikacji.

Problem nie wydaje się trudny.
Na www.access.vis.pl jest kilka przykładów jak realizować takie Drag&Drop:

http://www.access.vis.pl/war205.htm.
http://www.access.vis.pl/war207.htm.

Są tu realizacje:
- własnych suwaków,
- lini podziału obszarów formularza,
- poszerzania kolumny formularza ciągłego
i inne.

Nigdzie jednak nie znajdziemy kompleksowego rozwiązania rozciągania kontrolki prawo/lewo, góra/dół, chwytając za dowolną krawędź.
Czegoś "na obraz i podobieństwo"   reskalowania typowych windowsowych okien ...

Dlaczego ?
Gdy zaczniemy się wgłębiać, gdy zaczniemy na podstawie argumentów X i Y zdarzenia OnMouseMove sterować położeniem kontroki, ciągnąc za lewą lub górną krawędź, to okazuje się, że wszystko zaczyna diabelnie migotać.  

Gdy zaczniemy analizować kod, podglądać zmienne lokalne, wszystko zaczyna być jasne:
Mimo płynnego przesuwania myszki w lewo, argument X przyjmuje co chwila wartości dodatnie i ujemne
(to w pewnym sensie zrozumiałe: zmieniając położenie kontrolki poprzez redefiniowanie jej właściwości .Left, podsuwamy ją w jakiś sposób pod naszą myszkę, co z kolei wyzwala kolejne zdarzenie OnMouseMove, które zwraca trudne do okiełznania argumenty).

Jak to zneutralizować ?

Rozwiązanie:

Rozwiązanie jest bardzo proste ! Brzmi ono: nie sugerujmy sie zmiennymi X i Y,
lecz pobierzmy koordynaty bezwzględne kursora, przy pomocy funkcji API: GetCursorPos()

I tak przecież nie interesują nas te wielkości, tylko ich przyrosty, między jednym a drugim wystąpieniem zdarzenia OnMouseMove.

Prezentowana baza danych zawiera małą klasę, która jest "dzieckiem" dyskusji w Przesuw ławką.
( niech Bozia Autorowi wątku wybaczy ten surrealistyczny tytuł   )

Dodatkowo zawiera jeszcze inny obiekt, który nasze przesuwanki zapisuje do lokalnej tabeli, a po ponownym otwarciu okna te ustawienia odtwarza !

Mam nadzieję, że prostota sposobu używania tych obiektów zachęci jednych do częstego z nich korzystania, innych zaś swoim przykładem zachęci do budowania własnych klas, szalenie upraszczających, przyspieszających i umilających pisanie kodu.

Fascynaci obiektowości łączmy się !

Na koniec powtórzę się:

Nie sądzę aby przedstawione rozwiązanie było czymś odkrywczym.
Mam jednak nadzieję, że spełni określone funkcje edukacyjne i każdy coś tu znajdzie dla siebie.

--
KN