Mechanizm kotwic/anchors

1

Parę dni temu podczas rozmowy z @furious programming poruszyliśmy temat kotwic/anchors. Dla osób niewtajemniczonych - jest to mechanizm, który pozwala na dynamiczne (i oczywiście - całkowicie automatyczne) skalowanie i przesuwanie elementów okna. Możemy wskazać, względem czego mają się skalować (względem okna, ale równie dobrze innych elementów), jakie mają posiadać marginesy, w jaki sposób się wyrównywać, można robić "łańcuszki" zależności itp.

Kiedyś, kiedy jeszcze siedziałem na Delphi, miałem z tym styczność, ale jakoś ten mechanizm nie przemawiał do mnie, przez co mi zostało przekonanie, żeby z tego nie korzystać, w związku z czym w Lazarusie nie ruszałem tej opcji. Ostatnio (dzięki FP) rzuciłem na to okiem i się mocno zdziwiłem.

Na poniższych obrazkach widać, jak anchors wygląda w Delphi (pierwszy screen) oraz w Lazarusie (drugi obrazek). Różnica jest ogromna. Właściwie to w Delphi (praktycznie najnowszej wersji - 10.2) można jedynie ustawić TRUE/FALSE dla poszczególnych kotwic (lewo, prawo itp.), natomiast Lazarus oferuje o wieeeele więcej. I pytanie - czy ja nie wiem, jak się dostać do analogicznej funkcjonalności w Delphi, czy może pod względem mechanizmu kotwiczenia komponentów, Lazarus masakruje swojego większego, starszego i bardziej dojrzałego kuzyna? ;)

Delphi:
title
.
Lazarus:
screenshot-20191106094743.png

0

Tak masakruje kuzyna, oraz każdego kodera który tego użyje.
Jak tylko do formatki zrobionej przez takie zaawansowane anchory trzeba coś dołożyć to zaczyna się masakra.

0

Na razie się zapoznaję z tym narzędziem, ale wydaje mi się, że jeśli z głową się rozplanuje wzajemne relacje między elementami, to dołożenie czegoś nie będzie tragedią. Zresztą jakakolwiek zmiana układu elementów zawsze się wiąże z reorganizacją formatki, nawet jeśli masz np. ich rozmieszczenie ogarnięte w obsłudze onResize. A jak sobie dobrze ustawisz kotwice, to powinno się dać radę w miarę bezstresowo wprowadzić zmiany.

Poza tym, jakbyś mógł (jeśli wiesz), to odpowiedz, czy Delphi posiada taką funkcjonalność (tylko gdzieś ukrytą przede mną), czy to jest wynalazek/patent typowo Lazarusowy.

1
cerrato napisał(a):

... że jeśli z głową się rozplanuje wzajemne relacje między elementami, to dołożenie czegoś nie będzie tragedią ...

O ile:

  • To była twoja głowa (czyli na 100% rozumiesz tok myślenia)
  • Rzeczywiście dobrze przemyślałeś te RELACJE
  • Dobrze pamiętasz te swoje przemyślenia
  • Nie trzeba włożyć kontrolki "w środek" łańcucha
2

@cerrato: W Delphi chyba nie ma zaawansowanego kotwiczenia.
Używam tego zaawansowanego kotwiczenia w Lazarusie na co dzień i bardzo rzadko pojawia się problem, którego nie da się obejść, jak tylko przez wyłączenie zaawansowanego kotwiczenia dla konkretnych elementów. Np. pojawia się błąd, że niby jest cykliczne odwołanie, którego na 100% w rzeczywistości nie ma.

0

Nie trzeba włożyć kontrolki "w środek" łańcucha

No właśnie taka akcja będzie stosunkowo najprostsza ;)
Jeśli masz łańcuszek A -> B -> C -> D i chcesz wsadzić między B a C nowy element, to najpierw zwiększasz odstęp C od B, potem umieszczasz tam nowy element pozycjonowany względem B, a na końcu poprawiasz relację C, które odczepiasz od B i dajesz przyklejone do nowego elementu.

Ale jako powiedziałem - musi to wcześnie być zrobione z głową, rzeczy podopinane do innych elementów w sposób sensowny. Bo jeśli np. wszystkie elementy poniżej B będą pozycjonowane względem B, to wsadzenie czegoś nowego wiąże się z poprawianiem wszystkich kotwiczeń, co będzie niezłą rzeźnią. No ale taki sposób połączeń elementów nie spełnia kryterium "przemyślane i z głową" ;)

1

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.

0
cerrato napisał(a):

Na razie się zapoznaję z tym narzędziem, ale wydaje mi się, że jeśli z głową się rozplanuje wzajemne relacje między elementami, to dołożenie czegoś nie będzie tragedią.

I dotyczy to wszystkiego, nawet dłubania w zębach nożem.
Ale ja mam inne pytanie; czego nie da się zrobić w Delphi, a da się za pomocą masakrującego mechanizmu w Lazarusie?
Tak z ciekawości pytam...

A poza tym, w Delphi trzeba wziąć pod uwagę nie tylko Anchors, ale także Align, AlignWithMargins, Margins, Padding i być może Constraints oraz TFlowPanel.
Nie wiem co dokładnie oznaczają te ikony z pokazanego dialogu w Lazarusie...

A poza tym, tak dla porządku, to Anchors niczego i nie skaluje.
Utrzymuje rozmiar kontrolki względem jej krawędzi, przez co ona będzie większa (np. panel czy inny grid) ale nie będzie przeskalowana.

Zresztą jakakolwiek zmiana układu elementów zawsze się wiąże z reorganizacją formatki, nawet jeśli masz np. ich rozmieszczenie ogarnięte w obsłudze onResize. A jak sobie dobrze ustawisz kotwice, to powinno się dać radę w miarę bezstresowo wprowadzić zmiany.

I właśnie do tego to służy, jest bardzo proste, robi robotę i nawet wygodne.
Ale to i tak jest furda w stosunku do np. TdxLayoutControl z DevExpress.

Poza tym, jakbyś mógł (jeśli wiesz), to odpowiedz, czy Delphi posiada taką funkcjonalność (tylko gdzieś ukrytą przede mną), czy to jest wynalazek/patent typowo Lazarusowy.

Odpowiem, jeśli się dowiem co to znaczy "taką funkcjonalność" ;-)

0

A poza tym, tak dla porządku, to Anchors niczego i nie skaluje.

No jednak bym się kłócił :P Bo jeśli ustawię powiązanie krawędzi elementu z bokami okienka, to skalowanie okna może także spowodować skalowanie elementu.

0
cerrato napisał(a):

A poza tym, tak dla porządku, to Anchors niczego i nie skaluje.

No jednak bym się kłócił :P

To się kłóć, mi tam za jedno.
Skalowanie to robi np. taki WPF, a VCL co najwyżej udaje skalowanie.

Bo jeśli ustawię powiązanie krawędzi elementu z bokami okienka, to skalowanie okna może także spowodować skalowanie elementu.

Tak, ale nie odpowiada za to Anchor bezpośrednio a pośrednio, ponieważ utrzymuje rozmiar kontrolki względem innych.
A poza tym, zachęcam, włącz skalowanie okna, a najprawdopodobniej bardzo szybko je wyłączysz.

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