Jak automatycznie przestawiać komponenty TImage zależnie od szerokości okna programu?

0

Wyobraźcie sobie program, którego okno jest wysokości i szerokości typowego komunikatora GG itd, czyli niewielkie. Takie okno będę chciał wypełnić komponentami TImage, małymi, pomiędzy każdym obrazkiem będzie jakaś przerwa np. 10 pixeli. Czy w Delphi istnieje jakaś prosta rzecz by to zrobić tak by komponenty TImage przestawiały się same jeśli ktoś rozszerzy okno programu zwiększając jego szerokość (czyli obszar roboczy)? Ilość TImage będzie stała w tym oknie, np. 40 sztuk. Chodzi o program na PC.

W Javie dla przykładu i aplikacji na androida, mogłem użyć GridView i tzw. CustonGridAdapter, pozwalało to zamieszać obrazki z odstępami, łatwo, prosto, prawie nic kodu nie trzeba pisać, bo wszystko za nas robił program, czyli jak odpalał ktoś program na tablecie to ładnie się same obrazki przestawiały, a jak odpalał na czymś z mniejszą rozdzielką, np. na smartfonie to też ładnie się obrazki przestawiały, nie trzeba było kodu na to pisać.
A co może zaoferować mi delphi w apkach na samo PC? Czy muszę ciągle sprawdzać jaki jest obszar roboczy (szerokość) okna i na podstawie tego obliczyć ile zajmuje jeden obrazek (każdy ma stałą szerokość i wysokość) i ustawiać go kodem? Co trochę zajmie pewnie. Czy może są łatwiejsze sposoby, specjalne stworzone do takich rzeczy?
Będę wdzięczny za pomoc.

0

tl;dr...

Czy w Delphi istnieje jakaś prosta rzecz by to zrobić tak by komponenty TImage przestawiały się same jeśli ktoś rozszerzy okno programu zwiększając jego szerokość (czyli obszar roboczy)?

Istnieje taka recz i nazywa się właściwość Anchors komponentów; Czyli zwykłe kotwice, które włączasz lub wyłączasz w oknie inspektora obiektów; Domyślnie ustawione są na zbiór [akLeft, akTop] co sprawia, że rozciąganie nie przesuwa komponentu - zawsze dosunięty jest do lewego górnego rogu;

Jeżeli potrzebujesz dosunąć komponent do innej krawędzi, to zmień zawartość tego zbioru; Natomiast jeśli użyjesz obu enumów z jednej osi, np. akLeft i akRight - komponent będzie rozciągany wraz z formularzem;

Dobrze by było gdybyś pokazał dokładnie jak ma wyglądać okno programu i komponenty klasy TImage, a także opisał to, co ma się dziać z nimi po rozciągnięciu formularza; Dzięki temu łatwiej będzie podać precyzyjne wskazówki.

0

Ok, narysowałem w paintcie. Po lewej stronie okno programu zwykłe (na górze belka tytułowa i krzyżyk itd). A na Formie tylko i wyłącznie TImage. W lewym oknie programu o domyślnej szerokości widać 6 TImage ręcznie wstawione przy projektowaniu programu, mieszczą się po 3 obok siebie, więcej się nie zmieści bo za mała szerokość okna.
A po prawej mamy ten sam program, ale użytkownik sobie szerokość okna zmienił na większą więc komponenty TImage automatycznie się przemieściły i zmieściło aż 5 obrazków TImage obok siebie, ostatni niemieszczący się przerzuciło niżej. Mógłbym też trzecie okno programu narysować z szerokością tak małą, że w jednej linii mieściłby się jeden komponent, ale to zbędne, bo rozumiecie już całe działanie.

taLgoiv.png

Czyli w skrócie, zachowanie takie samo jak zwykły notatnik z włączonym zawijaniem wierszy, na szerokości okna mieści się tyle wyrazów ile się uda, resztę przerzuca niżej. Ot cała filozofia.

dodanie obrazka do załączników i treści posta - @furious programming

2

Użyj FlowPanel - tego komponentu nie znajdziesz w Delphi 7 i wcześniejszych. Nie wiem kiedy został dodany ale w XE2 już go mam - nie napisałeś jakiej wersji delphi używasz.

A co do odstępów użyj właściwości Margins komponentu Image oraz zaznacz AlignWithMargins

0

dzięki, posprawdzam zaraz, używam najnowszego delphi

0

No tak - jeżeli obrazki mają być zawijane, to właściwość Anchors nie umożliwi takiego zachowania; Szkoda, że od razu nie napisałeś o zawijaniu - nie musiałbym się produkować z tymi kotwicami... :]

Do tego potrzebny będzie jakiś komponent grupujący, więc albo poszukaj sobie takiego (poprzednik podał przykładowy komponent), albo napisz sobie sam, jeśli potrzebujesz jakiegoś unikalnego jego zachowania.

0

Ten FlowPanel z marginesami jest genialny, istne cudo! O to mi chodziło. Dziękuję wam, dziękuję!

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