No to teraz moja kolej – na zaawansowanym kotwiczeniu ”zjadłem zęby”, więc się z chęcią wypowiem. :)
Po pierwsze, Anchor Editor jest jednym z najlepszych narzędzi dostępnych w IDE. Powiem tak – dobrze wyklikany formularz powinien mieć ustawione zaawansowane kotwiczenie. A nawet powiem inaczej – ustawienie zaawansowanego kotwiczenia to obowiązek i nie wyobrażam sobie pracy formularzem, który ich nie wykorzystuje.
Dynamiczne generowanie formularzy to inna bajka, o której tutaj nie będę pisał, bo takiej techniki z braku powodów nie wykorzystuję. Mimo wszystko AnchorSide
można ustawiać z poziomu kodu, więc i w takim przypadku znajdzie zastosowanie.
Jak tylko do formatki zrobionej przez takie zaawansowane anchory
trzeba coś dołożyć to zaczyna się masakra.
Masakra to się zaczyna, jak się ktoś zabiera za robotę, o której nie ma się pojęcia.
[…] bla bla
- Nie trzeba włożyć kontrolki "w środek" łańcucha
Włożenie kontrolki w środek łańcucha ogranicza się do trzech kliknięć, a raczej do wybrania trzech wartości – wyłączenie górnej kotwicy dla kontrolki zastępowanej, wybranie ”rodzica” dla kontrolki wstawianej, wybranie nowego rodzica dla kontrolki zastępowanej. No cholera, 15 sekund mi to zajmuje – jestem bogiem kotwic, czy to narzędzie naprawdę jest tak banalnie przewidywalne?
[…] Np. pojawia się błąd, że niby jest cykliczne odwołanie, którego na 100% w rzeczywistości nie ma.
Z początku, gdy stawiałem pierwsze kroki z tym narzędziem to miewałem problemy z zapętleniami i nie za bardzo ogarniałem dlaczego tak się dzieje. Ale ostatecznie znajdowałem problem i IDE miało rację – źle ustawiłem relacje. I do dziś tego typu błędy mnie nękają, ale też z mojej winy – głównie przez kopiowanie i wklejanie kontrolek w obrębie zakładek jednego TPageControl
. No bo szybciej jest skopiować, wkleić i zmienić dwie wartości we wklejonej kontrolce (która jest już skonfigurowana), niż wyklikiwać ją zupełnie od nowa.
To zaawansowane kotwiczenie nie jest oczywiście doskonałe, bo np. nie działa poprawnie dla TLabeledEdit, gdy Label ustawimy z lewej strony Edit. Ustawienie Left Anchor jest wtedy dla pola Edit, a nie Label.
Z punktu widzenia LCL jest to zachowanie prawidłowe, dlatego że wyrównanie ustawiasz polu edycyjnemu, a nie etykiecie. A ta etykieta co prawda jest zarządzana przez pole edycyjne, ale jest jedynie odrębną kontrolką którą pole edycyjne zarządza i którą odpowiednio dosuwa do siebie podczas zmiany rozmiaru/położenia edita.
Niestety ten problem nie ma oczywistego rozwiązania, bo takie subkomponenty nie mogą być konfigurowane z osobna. Ten przypadek akurat da się rozwiązać – zamiast TLabeledEdit
można skorzystać z TLabel
+ TEdit
i wtedy ustawić kotwiczenie – wyjdzie na to samo. W innych podobnych przypadkach może być gorzej. ;)
Ale ja mam inne pytanie; czego nie da się zrobić w Delphi, a da się za pomocą masakrującego mechanizmu w Lazarusie?
Bardzo proszę – nie da się dostosowywać układu, rozmiarów komponentów i przyjętych odstępów między komponentami bez modyfikowania kodu źródłowego. Czyli nie da się zrobić poprawnie zachowującego się formularza bez pisania kodu OnResize
układającego jego zawartość. :)
W designerze Lazarusa mogę ustawić kotwice bazowe (czyli zwykły Anchors
) aby kontrolki były przyciągane do krawędzi komponentu rodzica lub okna (takie jest ich zadanie). Oczywiście jeśli potrzeba to i ustawieniem Constraints
nie pogardzę. Następnie mogę sobie ustawić zaawansowane kotwiczenie (czyli AnchorSide
), aby zdefiniować powiązania pomiędzy komponentami nie będącymi rodzicami. Na koniec ”masakruję” publikę ustawiając marginesy wybranym komponentom, aby formularz końcowo dopasował swój rozmiar do zawartości.
W ten sposób zrobiłem formularz, który nie dość że posiada samoorganizującą się zawartość, to jeszcze samo okno dopasowuje swój rozmiar do tej samoorganizującej się zawartości przy włączonym AutoSize
. Benefity? W dupie mam to jaki system ma użytkownik, jakie ma ustawienia DPI/skalowania, jakiego fontu system używa w interfejsie i masę innych rzeczy, bo formularz zawsze będzie posiadał taki układ zawartości, jaki ja widzę w designerze.
I to wszystko bez napisania choćby jednej linijki kodu i oczywiście bez konieczności kompilowania i uruchomiania projektu.
I właśnie do tego to służy, jest bardzo proste, robi robotę i nawet wygodne.
Najwyraźniej mamy inne pojęcie wygody. Bo dla mnie wygodne jest kliknięcie dwa razy i możliwość natychmiastowego widzenia na ekranie rezultatów, niż dłubanie w kodzie, kompilowanie i uruchamianie projektu aby mieć możliwość przetestowania wprowadzonych zmian. Zresztą przecież pro-koderom w poważnych firmach nie wolno kompilować i uruchamiać opracowywanych projektów, więc dla takich majstrów powinno być przydatne. :D
Jeśli np. zmienię treść etykiety i zamiast dwóch linijek tekstu ustawię dziesięć to kontrolki zakotwiczone natychmiast się dostosują, zachowując pierwotne odstępy. Jeśli zmienię rozmiary/położenie któregoś komponentu głównego to reszta też się dopasuje – od razu widzę czy zmiana jest dobra czy jednak był to zły pomysł, a więc oszczędzam czas, a tym samym pieniądze.
OnResize
to relikt przeszłości – wachlarz jego zastosowań stał się wąziutki z powodu AnchorSide
. To zdarzenie nadaje się do… w sumie do niewielu rzeczy. Sam używam póki co wyłącznie do aktualizowania danych dotyczących rozmieszczenia i rozmiarów okien (gdy layout użytkownika jest zapamiętywany).
Choć nawet w takim przypadku OnResize
posysa po całości, bo do tego celu powinienem obsłużyć komunikaty WM_ENTERSIZEMOVE
i WM_EXITSIZEMOVE
. Ale do tych komunikatów nie ma zdarzeń, a nawet pętla komunikatów okna w ogóle ich nie obsługuje, więc trzeba by dla każdego okna rejestrować własną procedurę obsługi komunikatów (czyli w ten sposób), co jest uciążliwe.
Ale to i tak jest furda w stosunku do np. TdxLayoutControl z DevExpress.
Zapewne tak (nie wiem, nie używałem), ale alternatywa w postaci płatnej biblioteki to jednak słaby argument.
A poza tym, zachęcam, włącz skalowanie okna, a najprawdopodobniej bardzo szybko je wyłączysz.
Kiedyś się skuszę i dam znać jak szybko szlag mnie trafił. :]
Podsumowując, zaawansowane kotwiczenie to wspaniała rzecz, ułatwiająca, przyspieszająca i umilająca pracę z klikaniem interfejsu. Każdy kto jakimś cudem tworzy apki w Lazarusie powinien koniecznie zapoznać się z tym narzędziem, opanować go i używać na co dzień – z głową, tak samo jak wszystkiego innego. Oczywiście to narzędzie nie jestem lekiem na wszystko – ma swoje minusy i ograniczenia – ale i tak plusów posiada znacznie więcej niż minusów, więc warto się nim zainteresować.
Zresztą co się będę produkował – czerpię z tego narzędzia same korzyści i olewam kto co na ten temat myśli. ;)
B->Nowy
aNowy->C
zapomniałeś.C, które odczepiasz od B i dajesz przyklejone do nowego elementu
B->Nowy
zapomniałeś?