2009-08-11 13 views

Odpowiedz

26

można łatwo przenieść górną wyrównany panel do góry, ustawiając jego Top właściwość . Wykonaj to w odwrotnej kolejności (najpierw w dolnym panelu) i gotowe.

+1

Czasami, jeśli przypiszesz wartość ujemną, będzie działać lepiej. W ten sposób zadziałało to dla mnie. – HOPE

1

Proponuję stworzenie architektury, w której dynamicznie usuniesz/dodasz formularze z/do kontroli nad nimi. Ogólnie rzecz biorąc kolejność tworzenia/dodawania to porządek wizualny, ale z twojego pytania rozumiem, że chcesz zmienić kolejność w trakcie trwania aplikacji, więc samo zmienienie oryginalnej kolejności tworzenia nie wystarczy.

Aby zmienić kolejność, spróbuj:

  1. Ukryj panele
  2. Usuń panele z ich kontrolą dominującej
  3. Dodaj panele do ich kontroli dominującej w nowym porządku chcesz
  4. Pokaż panele
1

Jak o próbie top wyrównany TGridPanel z jednej kolumny i n rzędy zamiast tego - ponowne zamówienie paneli z górnym wyrównaniem jest naprawdę bardzo trudne.

(Uwaga: TGridPanel jest dostępny w Delphi 2007 i wyżej, o ile dobrze pamiętam).

+0

niezły pomysł, ale moje panele nie są właściwie umieszczone bezpośrednio na formularzu - oni jest na innym elemencie panelu, który daje efekt tła, a TGridPanel to ukrywa. aby pytanie było proste, nie wspominałem o tej subtelności ... – Roddy

+0

Nie możesz ustawić 'TGridPanel.ParentBackground' na' True'? Myślałem, że potomkowie TPanel mogą być przezroczyste w ten sposób ... – onnodb

1

Po zmianie górnej części panelu kolejność zmiany panelu wizualnego.

Spróbuj (wszystkie panele ustawione alTop i tej samej wielkości):

PANEL0
Panel1
PANEL2
PANEL3
PANEL4

Na OnClick przypadku wszystkie panele zrób to:

TPanel(Sender).Top := TPanel(Sender).Top - TPanel(Sender).Height - 2; 

Po kliknięciu panelu przesuwa się o jedną pozycję w górę.

Oto pomysł. Zmień najlepsze piksele X.
Jednocześnie, jeśli to zrobić:

TPanel(Sender).Top := TPanel(Sender).Top - (TPanel(Sender).Height * 2)- 2; 

Panel aż 2 pozycje.

DODANO: Jeśli używasz Przeciągnij & Drop, to wydarzenia powrócić pozycję (X i Y); Z oryginalną pozycją i pozycją końcową możesz obliczyć wierzchołek do asign do panelu.

Przepraszam za mój słaby angielski. pozdrowienia

6

przenieść je w ten sam sposób chcesz je przenieść w czasie projektowania za pomocą myszki: Ustaw aktywnym panelu za Top własność jednego mniej niż własność panelu chcesz być poniżej obecnego panelu Top. VCL zajmie się resztą.

Jeśli musisz przenieść kilka paneli, zacznij od BeginDeferWindowPos. Dostosuj wszystkie panele do dowolnych współrzędnych za pomocą DeferWindowPos, a następnie zmień je wszystkie jednocześnie za pomocą EndDeferWindowPos.

+0

Miło, nie wiedziałem o 'DeferWindowPos'. [Ale nie jest to "DisableAlign' /' EnableAlign' łatwiej wtedy] (http://stackoverflow.com/a/15625706/757830)? – NGLN

+0

@Ngln, z 'DeferWindowPos', okno w ogóle się nie porusza, dopóki nie wywołasz' EndDeferWindowPos'. Jeśli przenosisz wiele okien, pomaga to uniknąć migotania, ponieważ pozycje niektórych okien są aktualizowane przed przeniesieniem innych. O ile mogę powiedzieć, "DisableAlign" nie przeszkadza kontrolom w poruszaniu się w dowolnym miejscu, tylko egzekwowanie wyrównania rodzica. Nie mogę ocenić, co jest lepsze. –

0

Znam jej stary post, ale zasadniczo pomógł mi - pomysł ustawienia najwyższej nieruchomości na zero. Nie mogę użyć pomysłu na programowe ustawienie pozycji, ponieważ jest to zależne od użytkownika aplikacji - może wybrać wyświetlanie niektórych wykresów w aplikacji, a następnie wszystkie panele (nadrzędne) teecharts są wyrównane. Ustawiam ich top właściwość na 0 w odwrotnej kolejności, a następnie po prostu ustaw widoczną wartość true lub false według danych wprowadzonych przez użytkownika ...

Dzięki.

0

Użyłem następujący kod:

procedure Show_Hide (Flag_Show : boolean); 
begin 
    if Flag_Show then 
    begin 
    with Panel_1 do begin Align := alTop; Visible := true; end; 
    with Panel_2 do begin Align := alTop; Visible := true; end; 
    with Panel_3 do begin Align := alTop; Visible := true; end; 
    with Panel_4 do begin Align := alTop; Visible := true; end; 
    end else 
    begin 
    with Panel_1 do begin Visible := false; Align := alNone; end; 
    with Panel_2 do begin Visible := false; Align := alNone; end; 
    with Panel_3 do begin Visible := false; Align := alNone; end; 
    with Panel_4 do begin Visible := false; Align := alNone; end; 
    end; 
end; 

według mojego życzenia Panel_1 Panel_2 Panel_3 Panel_4

Powiązane problemy