Zmiana kolejności paneli po ukrywaniu i pokazaniu

0

Mam na formie 3 panele
Każdy ma align = Top
Użytkownik ma różne opcje, które pokazują/ukrywają te panele
Użytkownika włącza pierwszą opcję (widoczne panele 2 i 3, pierwszy niewidoczny)
Następnie użytkownika włącza drugą opcję (widoczne panele 1, 2 i 3) . Tylko że ten pierwszy pokaże się na dole (a powinien być na górze).
Rozumiem czemu się tak dzieje.
Pytanie jest, jak sprawić żeby zawsze pokazywały się w odpowiedniej kolejności.

0

A w jaki sposób je pokazuje/ukrywasz? Wstawiłem sobie 3 panele, dałem

panel1.hide;

później

panel1.show;

i jest na swoim miejscu.

0

@Clarc: a sprawdziłeś wszystkie możliwości?

Przetestowałem ten sposób w Lazarusie – po ukryciu pierwszego panelu i następnie pokazaniu go, sam wraca na górę okna, więc kolejność nie zostaje zaburzona. Ale po dłuższym klikaniu (pokazywaniu i ukrywaniu) da radę tę kolejność zepsuć. Gdyby ktoś chciał sprawdzić to zachowanie to do załączników dodaję testowy projekt – może uda się ten problem zrekontruować.

Rozwiązaniem, niezbyt ładnym, ale lepsze to niż nic, może być ukrywanie wszystkich paneli podczas zmiany widoczności któregoś z nich i następnie pokazanie w odpowiedniej kolejności tych, które mają być widoczne.


Wyrównywanie kontrolek za pomocą Align nie zawsze jest dobrym pomysłem, dlatego że ten mechanizm jest skomplikowany, czasami trudny do opanowania, a w niektórych przypadkach niemożliwy do zastosowania. Dlatego czasem lepiej skorzystać z Anchorsów, z którymi takich problemów nie ma, choć mają nieco mniejszą funkcjonalność.

0

Wszystkich opcji nie sprawdzałem ale poklikałem troche (delphi) i nie zauważyłem opisanego zachowania. Zauważ, że OP w tagach ma 'hide' (show) a nie 'visible'. W Delphi przynajmiej te dwa wywołania się różnią:

procedure TControl.Show;
begin
  if Parent <> nil then Parent.ShowControl(Self);
  if not (csDesigning in ComponentState) or
    (csNoDesignVisible in ControlStyle) then Visible := True;
end;

a

procedure TControl.SetVisible(Value: Boolean);
begin
  if FVisible <> Value then
  begin
    VisibleChanging;
    FVisible := Value;
    Perform(CM_VISIBLECHANGED, Ord(Value), 0);
    RequestAlign;
  end;
end;
0

Tak, tylko zwróć uwagę na to, że Show modyfikuje wartość właściwości Visible, czyli woła setter SetVisible, więc na to samo wychodzi. Ale aby to potwierdzić, trzeba by wiedzieć co robi metoda ShowControl.

Poza tym to że OP podał w tagach hide, wcale nie oznacza, że używa metody Hide.

0

W źródłach delphi nie mogę do tego dojść ale na wiki jest wydaje mi się odpowiednie wyjaśnienie:
http://docwiki.embarcadero.com/Libraries/Seattle/en/Vcl.Controls.TWinControl.ShowControl

Possible actions include scrolling the particular child object into view, or changing to the appropriate notebook page.

Dlatego 'show' robi chyba troche więcej. Poza tym na SO był ten temat poruszany
https://stackoverflow.com/questions/42643234/is-there-a-difference-between-control-hide-show-and-control-visible-false-tru

0

W ten sposób i tak do niczego nie dojdziemy, bo trzeba by wiedzieć co robi ShowControl, jak wygląda obsługa komunikatu CM_VISIBLECHANGED i tak dalej. Nie wiem czy ma sens taka dyskusja.

Dlatego 'show' robi chyba troche więcej. Poza tym na SO był ten temat poruszany
https://stackoverflow.com/questions/42643234/is-there-a-difference-between-control-hide-show-and-control-visible-false-tru

No niewiele ten wątek wyjaśnia. W każdym razie to czy użyć Show/Hide czy Visible powinno raczej wynikać z obowiązujących warunków. Jeśli w danym miejscu kodu zawsze kontrolkę pokazuje się lub ukrywa, korzysta się z metod. A jeśli stan widoczności nie jest znany i należy go obliczyć, to ustawienie Visible jest odpowiednie – dzięki temu unika się zbędnego warunku.

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