Limit wysokości TFlowPanel

0

Witam.
Potrzebuje uzyskać pomoc w kwestii umieszczenia kontrolek wewnątrz TFlowPanel.
TFlowPanel znajduje się na TScrollBox - chce wrzucić większą liczbę paneli do jego wnętrza.
Robię to w następujący sposób:

var
  i: Integer;
  pa: tpanel;
begin
  for i := 0 to 500 do
  begin
    pa := TPanel.Create(self);
    pa.Caption := 'PANEL '+IntToStr(i);
    pa.Width := 200;
    pa.Height := 200;
    FlowPanel1.InsertControl(pa);
  end;
end;

Cały problem polega na tym, że przy większej ich liczbie (paneli), TFlowPanel nie rozkłada ich w sposób prawidłowy.
Pewna część paneli jest umieszczana prawidłowo, reszta piętrzy się na samym dole przysłaniając poprzednie.
Top tych pokrywających się paneli jest jednakowy, tak jakby istniało jakieś ograniczenie.

Czy spotkaliście się już z takim problemem? Macie pomysł jak z tego wybrnąć?

W załączniku gotowiec prezentujący problem.

0

Ciekawe, w moim starutkim Delphi wszystko jest OK.

0

Ok, to dodam jeszcze że chodzi o Delphi XE2 i Windows 7.

0

Załączam kompilat.

Sprawdzę wieczorem w domu. Siódemka i XE3.

0

Sprawdziłem na XP, działa prawidłowo. W takim razie wina leży po stronie Windows 7.

Skompilowany projekt na Windows XP, uruchomiony na Windows 7 też źle wyświetla panele.
Pod XP wystarczy rozszerzyć np na 2 kolumny i już będzie źle.

0

Dołożyłem na początku FormCreate:

  Left := 0;
  Top := 0;
  Height := Screen.Height;
  Width := 500;

czyli dwie kolumny. XP, Delphi 2006. Jest OK.

0

Tak, będzie Ok, ale podczas działania programu rozszerz okno aby wskoczyły 2 kolumny i już nie będzie Ok.

0

No coś w tym jest. U mnie Height to 1080. W pionie widzę 5 paneli. Odpalam. Wypełnia się natychmiast. Przewijam do samego dołu, czyli widzę Panel500. Jest OK. Nieznacznie (tak ze 20 pikseli) zwiększam szerokość i widzę panele od 328 do 337. I jakby przyblokowane przewijanie. Przewijam do góry i tylko Scrollbar się zmienia. Prawie, bo jak dochodzi do miejsca, gdzie naprawdę powinno być te 10 paneli, to już jest OK. Jakby Scrollbar głupiał. A ponieważ jest to kontrolka systemowa, to pretensje pewnie trzeba by wysyłać do Redmont. Zresztą mi akurat odpowiedzą (o ile w ogóle), że okres wsparcia się skończył :-).

E tam, trochę poszukałem i odpowiedź jest tu:
http://stackoverflow.com/questions/14655516/delphi-tscrollbox-issue-after-x-number-of-components

0

Czyli jest ograniczenie Windowsa na wysokość kontrolki.

Położyłem FlowPanel bezpośrednio na formie (pomijam scrollboxa).
Po uruchomieniu sprawdzam w Watches pozycje Top paneli w FlowPanel.
Są tak samo ograniczone jak poprzednio na scrollbox-ie.

Da się to jakoś obejść?

Dodałem przesuwanie scrolla podczas ładowania paneli. Uzyskałem max Top panelu = 65201. Kolejne panele wróciły na Top = 32767.

0

Przecież obejścia też są tam podane. Trzy. Nie wiem, do czego dążysz. Sam musisz sobie wybrać, które zastosujesz. Które najlepiej pasuje do nieznanych mi przecież Twoich potrzeb.

0

W FlowPanel potrzebuję wrzucić dużą liczbę TFrame (panele były tylko przykładem) które reprezentują dane w projekcie. Powiedzmy że są to książki z biblioteki. Ile książek tyle elementów w FlowPanelu (Frame z labelami opisującymi książkę, edity do modyfikowania ilosci, image do wyświetlenia okładki, ...).
Pierwsze obejście (z przesuwaniem scrolla) nie zadziałało.
Drugie obejście z użyciem TControl: Jak najbardziej, pozycje elementów są teraz ok np z TShape, ale jak umieścić na nim Edity? Jakiś pomysł?
Trzecie to TDBControlGrid, komponent bazodanowy, ciężko z nim by było i dużo przerabiania...

0

Przecież to jest typowy problem bazodanowy. Te frame nie są potrzebne. Jedna książka to jeden rekord tabeli w bazie. Tak z grubsza - bez znajomości szczegółów. I TDBCtrlGrid (bo przynajmniej tak się to w moim starutkim Delphi nazywa) świetnie się do tego nadaje. Dlaczego to odrzuciłeś?

0

Tak czułem że zasugeruje bazodanowość tym przykładem.
W programie mam liste obiektów które wyświetlam na frameach.
Użyty został TFlowPanel do łatwego układania ich. Teraz przy próbie wyświetlenia ich dużej ilości pojawił sie omawiany problem.
Chce uniknąc zmiany komponentu i formy prezentacji tych danych.

0

Oczywiście, że można inaczej. Ale o tym potem. Ja nadal nie wiem, co to ma być, ale jak miałem sprawdzać te 501 paneli, to musiałem się zmuszać. Za dużo ich było, żeby je po kolei oglądać. A gdyby miały być jeszcze z jakąś zawartością, to ... . Niedawno zajrzałem do internetowego sklepu z obuwiem. Autor strony chciał mnie zmusić do obejrzenia wszystkiego w tym sklepie. Buty damskie, męskie i dziecięce. W kolejności tylko jemu znanej. Ja i tak uparty jestem. Ale po obejrzeniu około 50 wybrałem inny sklep. A ty chcesz, żeby użytkownik Twojego programu oglądał 500 obiektów. Czym on Ci zawinił :-)?
W bibliotece JEDI jest taki komponent TJvImageListViewer. To taki jakby TScrollBox, który wyświetla obrazki. Podłącza mu się TImageList, a on to wyświetla. Czyli nic bazodanowego. No i do podejrzenia, jak wyświetla. A maluje tylko te, które widać w jego ClientArea. Np od 12 do 32 z 500. I można przewijać. Jak ScrollBox. Czyli nie ma problemu z rozmiarem kontrolki. Robienie olbrzyma jest zastępowane pokazywaniem tylko tego, co jest potrzebne. Inaczej mówiąc robiona jest wirtualizacja, o której było wspomniane w linku, który Ci podałem. Ten ich Viewer jest wyprowadzony z jakiegoś ich CustomViewera. W sumie możesz wyprowadzić własny. Ale czy to będzie dużo mniej roboty?
Ale pomyśl jeszcze raz o bazie danych. Miałbyś filtrowanie po warunkach i mógłbyś umożliwić użytkownikowi określenie, co chce oglądać i w jakiej kolejności.

0

Ok, czyli trzymając się tematu tego wątku, jest narzucony limit przez Windows na TWinControl i go nie ominę.
Pozostaje inny komponent albo na tym wprowadzić podział na podstrony lub tak jak opisałeś, zrobić wyświetlanie tylko tych elementów danych które rzeczywiście widać.
Dzięki za pomoc.

0

Mam takie niczym nie uzasadnione podejrzenie, a może obawę, że za mało odseparowałeś dane od ich prezentacji.
Ale wracając do tematu to tak mi przyszło do głowy, jak jechałem do pracy:

Sadam2 napisał(a):

W bibliotece JEDI jest taki komponent TJvImageListViewer. To taki jakby TScrollBox, który wyświetla obrazki. Podłącza mu się TImageList, a on to wyświetla.

Ten ich Viewer jest wyprowadzony z jakiegoś ich CustomViewera. W sumie możesz wyprowadzić własny.

Główną robotą przy wyprowadzaniu własnego komponentu z tego ich CustomViewera będzie nadpisanie jego metody DrawItem (czy jakoś podobnie), która dostaje w parametrach:
Canvas, na którym trzeba malować; Rect, w którym trzeba malować i Indeks elementu który trzeba malować. I możesz zdecydować, czym będzie Twój element. I może to być frame z listy, a także rekord z bazy - to tylko prezentacja danych.

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