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