Mechanizm kotwic/anchors

Odpowiedz Nowy wątek
2019-11-06 09:52
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


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 2x, ostatnio: cerrato, 2019-11-06 15:57

Pozostało 580 znaków

2019-11-06 12:32
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2019-11-06 12:42
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.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-11-06 13:58
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

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2019-11-06 14:03
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.

Pozostało 580 znaków

2019-11-06 14:08
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ą" ;)


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
No i jesteś zmasakrowany :D Napisałeś o B->Nowy a Nowy->C zapomniałeś. - _13th_Dragon 2019-11-06 17:00
nie, przecież napisałem C, które odczepiasz od B i dajesz przyklejone do nowego elementu - cerrato 2019-11-06 17:02
Znaczy na odwrót B->Nowy zapomniałeś? - _13th_Dragon 2019-11-06 17:03
no tak, teraz masz rację ;) - cerrato 2019-11-06 17:14

Pozostało 580 znaków

2019-11-06 14:12
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.

edytowany 1x, ostatnio: skrzat, 2019-11-06 14:13

Pozostało 580 znaków

2019-11-06 14:27
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ść" ;-)

edytowany 1x, ostatnio: wloochacz, 2019-11-06 14:30

Pozostało 580 znaków

2019-11-06 14:34
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.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2019-11-06 14:37
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.

Pozostało 580 znaków

2019-11-06 14:43
0

nie odpowiada za to Anchor bezpośrednio a pośrednio

Szczerze mówiąc, to mam bardzo głęboko gdzieś, czy robi to bezpośrednio, przez LCL albo wysyłając SMS do samego Jezusa. Dla mnie istotne jest, że ten mechanizm działa. Określam (przy użyciu anchor) jakiego efektu oczekuję, a następnie go dostaję. I całkowicie mnie wali, czy to się dzieje w oparciu o jakieś mechanizmy LCL/VCL, wywołania API systemu, czy może formatka uruchamia sobie model sztucznej inteligencji i sama się domyśla, jak powinna się wyświetlać ;) Ważne, że działa tak, jak oczekuję.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2019-11-06 15:31

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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